Index: third_party/google-endpoints/strict_rfc3339-0.7-py2.7.egg-info/PKG-INFO |
diff --git a/third_party/google-endpoints/strict_rfc3339-0.7-py2.7.egg-info/PKG-INFO b/third_party/google-endpoints/strict_rfc3339-0.7-py2.7.egg-info/PKG-INFO |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bfd2c8dc2694b8b0f6e9901111dcff22f6eef309 |
--- /dev/null |
+++ b/third_party/google-endpoints/strict_rfc3339-0.7-py2.7.egg-info/PKG-INFO |
@@ -0,0 +1,152 @@ |
+Metadata-Version: 1.1 |
+Name: strict-rfc3339 |
+Version: 0.7 |
+Summary: Strict, simple, lightweight RFC3339 functions |
+Home-page: http://www.danielrichman.co.uk/libraries/strict-rfc3339.html |
+Author: Daniel Richman, Adam Greig |
+Author-email: main@danielrichman.co.uk |
+License: GNU General Public License Version 3 |
+Description: Strict, simple, lightweight RFC3339 functions |
+ ============================================= |
+ |
+ Goals |
+ ----- |
+ |
+ - Convert unix timestamps to and from RFC3339. |
+ - Either produce RFC3339 strings with a UTC offset (Z) or with the offset |
+ that the C time module reports is the local timezone offset. |
+ - Simple with minimal dependencies/libraries. |
+ - Avoid timezones as much as possible. |
+ - Be very strict and follow RFC3339. |
+ |
+ Caveats |
+ ------- |
+ |
+ - Leap seconds are not quite supported, since timestamps do not support them, |
+ and it requires access to timezone data. |
+ - You may be limited by the size of `time_t` on 32 bit systems. |
+ |
+ In both cases, see 'Notes' below. |
+ |
+ Rationale |
+ --------- |
+ |
+ - A lot of libraries have trouble with DST transitions and ambiguous times. |
+ - Generally, using the python datetime object causes trouble, introducing |
+ problems with timezones. |
+ - The excellent `pytz` library seems to achieve timezone perfection, however |
+ it didn't (at the time of writing) have a method for getting the local |
+ timezone or the 'now' time in the local zone. |
+ - I saw a lot of problems ultimately due to information lost when converting |
+ or transferring between two libraries (e.g., `time` -> `datetime` loses DST |
+ info in the tuple) |
+ |
+ Usage |
+ ----- |
+ |
+ Validation: |
+ |
+ >>> strict_rfc3339.validate_rfc3339("some rubbish") |
+ False |
+ >>> strict_rfc3339.validate_rfc3339("2013-03-25T12:42:31+00:32") |
+ True |
+ |
+ Indeed, we can then: |
+ |
+ >>> strict_rfc3339.rfc3339_to_timestamp("2013-03-25T12:42:31+00:32") |
+ 1364213431 |
+ >>> tuple(time.gmtime(1364213431))[:6] |
+ (2013, 3, 25, 12, 10, 31) |
+ |
+ No need for two function calls: |
+ |
+ >>> strict_rfc3339.rfc3339_to_timestamp("some rubbish") |
+ Traceback [...] |
+ strict_rfc3339.InvalidRFC3339Error |
+ |
+ Producing strings (for this example `TZ=America/New_York`): |
+ |
+ >>> strict_rfc3339.timestamp_to_rfc3339_utcoffset(1364213431) |
+ '2013-03-25T12:10:31Z' |
+ >>> strict_rfc3339.timestamp_to_rfc3339_localoffset(1364213431) |
+ '2013-03-25T08:10:31-04:00' |
+ |
+ And with `TZ=Europe/London`: |
+ |
+ >>> strict_rfc3339.timestamp_to_rfc3339_localoffset(1364213431) |
+ '2013-03-25T12:10:31+00:00' |
+ |
+ Convenience functions: |
+ |
+ >>> strict_rfc3339.now_to_rfc3339_utcoffset() |
+ '2013-03-25T21:39:35Z' |
+ >>> strict_rfc3339.now_to_rfc3339_localoffset() |
+ '2013-03-25T17:39:39-04:00' |
+ |
+ Floats: |
+ |
+ >>> strict_rfc3339.now_to_rfc3339_utcoffset(integer=True) # The default |
+ '2013-03-25T22:04:01Z' |
+ >>> strict_rfc3339.now_to_rfc3339_utcoffset(integer=False) |
+ '2013-03-25T22:04:01.04399Z' |
+ >>> strict_rfc3339.rfc3339_to_timestamp("2013-03-25T22:04:10.04399Z") |
+ 1364249050.0439899 |
+ |
+ Behind the scenes |
+ ----------------- |
+ |
+ These functions are essentially string formatting and arithmetic only. A very |
+ small number of functions do the heavy lifting. These come from two modules: |
+ `time` and `calendar`. |
+ |
+ `time` is a thin wrapper around the C time functions. I'm working on the |
+ assumption that these are usually of high quality and are correct. From the |
+ `time` module, `strict_rfc3339` uses: |
+ |
+ - `time`: (actually calls `gettimeofday`) to get the current timestamp / "now" |
+ - `gmtime`: splits a timestamp into a UTC time tuple |
+ - `localtime`: splits a timestamp into a local time tuple |
+ |
+ Based on the assumption that they are correct, we can use the difference |
+ between the values returned by `gmtime` and `localtime` to find the local |
+ offset. As clunky as it sounds, it's far easier than using a fully fledged |
+ timezone library. |
+ |
+ `calendar` is implemented in python. From `calendar`, `strict_rfc3339` uses: |
+ |
+ - `timegm`: turns a UTC time tuple into a timestamp. This essentially just |
+ multiplies each number in the tuple by the number of seconds in it. It does |
+ use `datetime.date` to work out the number of days between Jan 1 1970 and the |
+ Y-M-D in the tuple, but this is fine. It does not perform much validation at |
+ all. |
+ - `monthrange`: gives the number of days in a (year, month). I checked and |
+ (at least in my copy of python 2.6) the function used for leap years is |
+ identical to the one specified in RFC3339 itself. |
+ |
+ Notes |
+ ----- |
+ |
+ - RFC3339 specifies an offset, not a timezone, and the difference is |
+ important. Timezones are evil. |
+ - It is perhaps simpler to think of a RFC3339 string as a human readable |
+ method of specifying a moment in time (only). These functions merely provide |
+ access to the one-to-many timestamp-to-RFC3339 mapping. |
+ - Timestamps don't support leap seconds: a day is always 86400 "long". |
+ Also, validating leap seconds is particularly fiddly, because not only do |
+ you need some data, but it must be kept up to date. |
+ For this reason, `strict_rfc3339` does not support leap seconds: in validation, |
+ `seconds == 60` or `seconds == 61` is rejected. |
+ In the case of reverse leap seconds, calendar.timegm will blissfully accept |
+ it. The result would be about as correct as you could get. |
+ - RFC3339 generation using `gmtime` or `localtime` may be limited by the size |
+ of `time_t` on the system: if it is 32 bit, you're limited to dates between |
+ (approx) 1901 and 2038. This does not affect `rfc3339_to_timestamp`. |
+ |
+Platform: UNKNOWN |
+Classifier: Development Status :: 4 - Beta |
+Classifier: Intended Audience :: Developers |
+Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3) |
+Classifier: Operating System :: OS Independent |
+Classifier: Programming Language :: Python |
+Classifier: Programming Language :: Python :: 2 |
+Classifier: Programming Language :: Python :: 3 |