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

Reply via email to