I suppose we could change to test just the dict-ification of our classes
and depend on simplejson to do the right thing? That would eliminate
this new issue you found.

And yes, I'll revert r1113 now.

Sean

Matthew Russell wrote:
> Sean,
> 
> I still do have a couple of failures, mainly this one:
> 
> Failed example:
>     geojsonlib.dumps(feature)  # doctest: +ELLIPSIS
> Expected:
>     '{"geometry": {"type": "Point", "coordinates": [53..., -4...]}, "type":
> "Feature", "properties": {"s
> ummary": "The first feature", "link": "http:\\/\\/example.org\\/features\\/1",
> "title": "Feature 1"}, "i
> d": "1"}'
> Got:
>     '{"geometry": {"type": "Point", "coordinates": [53.047817959114688,
> -4.10888671875]}, "type": "Featu
> re", "properties": {"summary": "The first feature", "link": "
> http://example.org/features/1";, "title": "F
> eature 1"}, "id": "1"}'
> 
> I think this is because I've upgraded my simplejson to 1.9.1 (the only
> version now listed on PyPI).
> They recently changed it so that forward slashes aren't escaped. Which
> version do you use?
> 
> Additionally, if we are to optionally support simplejson, then what to do
> with the tests? since most of them require
> json output. Without a default encoder, the tests are a no-op.
> 
> With this is mind, and since as you've pointed out, simplejson has made it
> into the stdlib for Python 2.6/3,
> perhaps we should just leave it as a requirement and be done with it.
> 
> I think perhaps i've been guilty of being too idealistic (regarding
> supporting other json libraries).
> I propose we revert r1113.
> 
> Sorry for the confusion -
> This means that with the doc test fixes for simplejson 1.9.1, and the
> rename, geojsonlib should be ok to go for beta/rc1.
> 
> Matt
> 
> 2008/6/19 Matthew Russell <[EMAIL PROTECTED]>:
> 
>> sorry, disregard my last message, false alarm, still has some local mods.
>>
>>
>> 2008/6/19 Matthew Russell <[EMAIL PROTECTED]>:
>>
>>> Sean,
>>>
>>> all tests fail for me (python2.5) wth r1113, i'm looking into it now.
>>>
>>>
>>> Matt
>>>
>>> 2008/6/19 Sean Gillies <[EMAIL PROTECTED]>:
>>>
>>>> Cool. In that case, we might be ready for a beta or a release candidate?
>>>>
>>>> Matthew Russell wrote:
>>>>> Hi Sean,
>>>>>
>>>>> i'm ok with the optional dependance :)
>>>>> So we'll keep the current api. including dump and load,
>>>>> just make the them raise NotImplementedError with a hint to install
>>>>> simplejson or see README on how to use something another lib, or roll
>>>> your
>>>>> own.
>>>>>
>>>>>
>>>>> Cheers,
>>>>> Matt
>>>>>
>>>>> 2008/6/19 Sean Gillies <[EMAIL PROTECTED]>:
>>>>>
>>>>>> Matt,
>>>>>>
>>>>>> That seems good to me. I would, however, very much like to keep the
>>>>>> optional dependence on simplejson for dumps/loads. BTW, simplejson is
>>>> in
>>>>>> the 2.6/3.0 standard library:
>>>>>>
>>>>>> http://bugs.python.org/issue2750
>>>>>>
>>>>>> Sean
>>>>>>
>>>>>>
>>>>>> Matthew Russell wrote:
>>>>>>> Sean, Eric, those interested,
>>>>>>>
>>>>>>> Another option is to abandon my abstracton idea, and just get ride of
>>>>>>> dumps/dump/load/loads/encode/decode in favour of:
>>>>>>>
>>>>>>> # 'feature' in this example, could be
>>>>>> geojson.GeoJSON.to_instance({"type":
>>>>>>> ..., ...})
>>>>>>> feature  =
>>>> geojsonlib.Feature(geometry=geojsonlib.Point(coordinates=[x,
>>>>>> y]))
>>>>>>> d = dict(feature)
>>>>>>> myjsonlib.[encode|write|dumps](d, ...)
>>>>>>>
>>>>>>> (Where myjsonlib is simplejson, json.py, jsonlib, cjson etc)
>>>>>>>
>>>>>>> since this is all that needs to happen, and is exactly what each
>>>> 'codec'
>>>>>> in
>>>>>>> my hooks idea would accomplish, except we gain the advantage of not
>>>>>> having
>>>>>>> to track each JSON library api, give the user (us too) one less level
>>>> of
>>>>>>> indirection to follow.
>>>>>>>
>>>>>>> We'd also not have dependancy on simplejson, and have no other
>>>>>> dependancies.
>>>>>>> The GeoJSON spec declares that geojson can have arbitrary members,
>>>> this
>>>>>> is
>>>>>>> still possible,
>>>>>>> just less convienient syntax:
>>>>>>>
>>>>>>> d = {"blog":
>>>>>>>           {"placename": "California",
>>>>>>>             "location": feature}
>>>>>>> }
>>>>>>> json1 = cjson.write(d)
>>>>>>> json 2 = simplejson.dumps(d, encoding="utf-8")
>>>>>>>
>>>>>>> So, now I think this is (probably) the right way to go... what do you
>>>>>> think?
>>>>>>>
>>>>>>> 2008/6/19 Matthew Russell <[EMAIL PROTECTED]>:
>>>>>>>
>>>>>>>> Sean,
>>>>>>>>
>>>>>>>> I've done a bit of digging, an unfortunatly, writing a cjson codec
>>>> would
>>>>>> be
>>>>>>>> non-trivial, or impossible; unless the author(s) of that package
>>>>>> provided a
>>>>>>>> hook (like JSONEcoder.default is)
>>>>>>>>
>>>>>>>> jsonlib's write (equivilent of dumps/encode)  has an 'on_unknown'
>>>> hook,
>>>>>> so
>>>>>>>> that'd work,
>>>>>>>> as would all other pure-python json libraries.
>>>>>>>>
>>>>>>>> A jsonlib codec might look like:
>>>>>>>>
>>>>>>>> class JsonlibCodec(object):
>>>>>>>>     def encode(self, obj, **kwargs):
>>>>>>>>          def on_unknown(value):
>>>>>>>>              d = dict(gejsonlib.GeoJSON.to_instance(value))
>>>>>>>>              return jsonlib.write(d)
>>>>>>>>          kwargs["on_unknown"] = on_unknown
>>>>>>>>          return jsonlib.write(obj, **kwargs)
>>>>>>>>
>>>>>>>>     def decode(self, json, **kwargs):
>>>>>>>>         obj_hooj = kwargs.get("object_hook", hoo)
>>>>>>>>         o = jsonlib.read(json)
>>>>>>>>         if obj_hook:
>>>>>>>>             o = obj_hook(o)
>>>>>>>>         return o
>>>>>>>>
>>>>>>>> A json-py codec might look like:
>>>>>>>>
>>>>>>>>
>>>>>>>> import json
>>>>>>>> class JsonPyCodec(object):
>>>>>>>>     def encode(self, obj, *args, **kwargs):
>>>>>>>>          json_writer = json.JsonWriter()
>>>>>>>>          try:
>>>>>>>>              return json_writer.write(obj)
>>>>>>>>          except json.WriteException: # not a python object
>>>> corrospondng
>>>>>> to
>>>>>>>> 'primative' json type
>>>>>>>>              return
>>>>>>>> json_writer.write(dict(geojsonlib.GeoJSON.to_instance(obj)))
>>>>>>>>
>>>>>>>>      def decode(obj, *args, **kwargs):
>>>>>>>>           obj_hook = kwargs.pop("object_hook", lambda x: obj)
>>>>>>>>           return json.JsonReader().read(obj_hooj(obj))
>>>>>>>>
>>>>>>>>
>>>>>>>> Matt
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> 2008/6/18 Matthew Russell <[EMAIL PROTECTED]>:
>>>>>>>>
>>>>>>>>> Sean,
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'd be ok with keeping loads/dumps as functions in
>>>>>> geojsonlib/__init__.py
>>>>>>>>> They could even raise DepricationWaring.
>>>>>>>>>
>>>>>>>>> I've seen r1113's encoding.py, and it's similar to what I had in
>>>> mind,
>>>>>> but
>>>>>>>>> not quite.
>>>>>>>>>
>>>>>>>>> There's an extra level of indirection, geojsonlib/__init__ would
>>>>>> define:
>>>>>>>>> # nb. in the following, geojsonlib.encoding is renamed to codecs
>>>>>>>>>
>>>>>>>>> def encode(obj, codec=None, *args, **kwargs):
>>>>>>>>>      codec = codec or geojsonlib.codecs.default
>>>>>>>>>      return codec.encode(obj, *args, **kwargs)
>>>>>>>>>
>>>>>>>>> decode would be much the same.
>>>>>>>>> Then I can write a CJson() codec (which defines encode and decode),
>>>> and
>>>>>>>>> have that used instead.
>>>>>>>>>
>>>>>>>>> in geojsonlib.codecs, my hacked up version of the module goes
>>>> something
>>>>>>>>> like:
>>>>>>>>>
>>>>>>>>> class JSONCodec(objet):
>>>>>>>>>     def encode(self, obj, **kwargs): raise NotImplemented
>>>>>>>>>     def decode(self, obj, **kwargs): raise NotImplemented
>>>>>>>>>
>>>>>>>>> try:
>>>>>>>>>    import simplejson
>>>>>>>>> except ImportError:
>>>>>>>>>    default = Codec()
>>>>>>>>> else:
>>>>>>>>>    class SimpleJSONCodec(JSONCodec):
>>>>>>>>>
>>>>>>>>>        def encode(self obj, **kwargs):
>>>>>>>>>             return simplejson.dumps(obj, **kwargs)
>>>>>>>>>
>>>>>>>>>        def decode(self, obj, **kwargs):
>>>>>>>>>             return simplejson.loads(obj, **kwargs)
>>>>>>>>>
>>>>>>>>>    default = SimepJSONCodec
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> Matt
>>>>>>>>>
>>>>>>>>> 2008/6/18 Sean Gillies <[EMAIL PROTECTED]>:
>>>>>>>>>
>>>>>>>>> Matt,
>>>>>>>>>> What would you think about keeping geojsonlib.dumps/loads as is
>>>> for
>>>>>>>>>> convenience and just raise exceptions if simplejson can't be
>>>> imported?
>>>>>>>>>> See rev 1113 -- I marked the dump/load feature as an "extra" in
>>>>>> setup.py.
>>>>>>>>>> Sean
>>>>>>>>>>
>>>>>>>>>> Matthew Russell wrote:
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> this is a proposal which Sean already +1'd in the recent
>>>> "[Community]
>>>>>>>>>> [Fwd:
>>>>>>>>>>> [Geojson] GeoJSON 1.0 Released]" thread.
>>>>>>>>>>>
>>>>>>>>>>> The proposal is to remove the reliance on simplejson from
>>>> geojsonlib
>>>>>>>>>> (but
>>>>>>>>>>> keeping simplejson as the default).
>>>>>>>>>>>
>>>>>>>>>>> I'n slight alteration to my previous api suggestion for the
>>>> interface
>>>>>>>>>> for
>>>>>>>>>>> simplejson's peers,
>>>>>>>>>>> I'd like to change the api from:
>>>>>>>>>>>
>>>>>>>>>>> geojsonlib.{dumps, dump, loads, load}
>>>>>>>>>>>
>>>>>>>>>>> to:
>>>>>>>>>>>
>>>>>>>>>>> json = geojsonlib.encode(obj, codec="geojsonlib.defaultcodec",
>>>>>>>>>> *codec_args,
>>>>>>>>>>> **codec_kwargs)
>>>>>>>>>>>   - where obj is any python object supporting the geointerface,
>>>> or a
>>>>>>>>>> mapping
>>>>>>>>>>>   - returns unicode or str
>>>>>>>>>>>
>>>>>>>>>>> obj = geojsonlib.decode(json, codec="geojsonlib.defaultcodec",
>>>>>>>>>> *codec_args,
>>>>>>>>>>> **codec_kwargs)
>>>>>>>>>>>
>>>>>>>>>>>   - where 'json' is a unicode or str instance.
>>>>>>>>>>>   - reutrns a geojsonlib.GeoJSON instance or subclass thereof.
>>>>>>>>>>>
>>>>>>>>>>> The primary motivation for this is file encoding.
>>>>>>>>>>> I'd like to keep the serialisation to file-like objects within
>>>> the
>>>>>>>>>> control
>>>>>>>>>>> of the user at the I/O boundaries.
>>>>>>>>>>> Removing the dump and load functions from geojsonlib would
>>>> acheive
>>>>>>>>>> this.
>>>>>>>>>>> I also think the names encode and decode are better, since load
>>>> and
>>>>>>>>>> dumps
>>>>>>>>>>> indicate serialization to disk.
>>>>>>>>>>>
>>>>>>>>>>> So, does anyone object if the api changes from:
>>>>>>>>>>> geojsonlib.dumps -> geojson.encode
>>>>>>>>>>> geojsonlib.loads -> geojson.decode
>>>>>>>>>>> geojsonlib.dump -> file_like.write(geojsonlib.encode(obj))
>>>>>>>>>>> geojsonlib.load -> geojsonlib.decode(file_like.read())
>>>>>>>>>>>
>>>>>>>>>>> ?
>>>>>>>>>>>
>>>>>>>>>>> Once this is implemented, simplejson will only be required in the
>>>>>>>>>> default
>>>>>>>>>>> case:
>>>>>>>>>>>
>>>>>>>>>>> .encode(obj), .decode(obj)
>>>>>>>>>>>
>>>>>>>>>>> and not if you want to use another JSON library, and have an
>>>> adapter:
>>>>>>>>>>> e.g
>>>>>>>>>>>
>>>>>>>>>>> class CjsonEncoder:
>>>>>>>>>>>      def encode(self, obj):
>>>>>>>>>>>            ...
>>>>>>>>>>>
>>>>>>>>>>> .encode(obj, codec=CjsonEncoder)
>>>>>>>>>>>
>>>>>>>>>>> N.B:
>>>>>>>>>>>
>>>>>>>>>>> 'codec' can be a dotted path, or any namespace with a .encode or
>>>>>>>>>> .decode
>>>>>>>>>>> callable attribute as releveant.
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Cheers,
>>>>>>>>>>> Matt
>>>>>> _______________________________________________
>>>>>> Community mailing list
>>>>>> [email protected]
>>>>>> http://lists.gispython.org/mailman/listinfo/community
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>> ------------------------------------------------------------------------
>>>>> _______________________________________________
>>>>> Community mailing list
>>>>> [email protected]
>>>>> http://lists.gispython.org/mailman/listinfo/community
>>>> _______________________________________________
>>>> Community mailing list
>>>> [email protected]
>>>> http://lists.gispython.org/mailman/listinfo/community
>>>>
>>>
>>>
>>> --
>>> Cheers,
>>> Matt
>>
>>
>>
>> --
>> Cheers,
>> Matt
> 
> 
> 
> 

_______________________________________________
Community mailing list
[email protected]
http://lists.gispython.org/mailman/listinfo/community

Reply via email to