forked from googleapis/google-cloud-python
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhelpers.html
More file actions
201 lines (161 loc) · 14.8 KB
/
helpers.html
File metadata and controls
201 lines (161 loc) · 14.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>gcloud.datastore.helpers — gcloud 0.1 documentation</title>
<link rel="stylesheet" href="../../../_static/style.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../../',
VERSION: '0.1',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/sidebar.js"></script>
<link rel="top" title="gcloud 0.1 documentation" href="../../../index.html" />
<link rel="up" title="Module code" href="../../index.html" />
</head>
<body role="document" class="two-column docs"><a href="https://github.com/GoogleCloudPlatform/gcloud-python"><img style="position: absolute; top: 0; right: 0; border: 0; z-index: 999;" src="_static/forkme.png" alt="Fork me on GitHub"></a>
<div id="sandbar">
<header id="gc-googlebar">
<a id="gc-logo" href="../../../index.html">
<img src="_static/cloudplatform-horizontal.png" alt="Google">
</a>
<form class="gc-search" action="search.html" method="GET">
<div class="searchbox" style="width: 429px;">
<span class="button button-blue mini">Google Cloud Python API</span>
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
<input type="text" name="q" class="q" id="q" value=""
placeholder="Search" autocomplete="off" style="width: 263px;">
</div>
<button class="button button-blue" style="top: 0px; left: 444px;">
<img src="_static/search.png" alt="Search">
</button>
<input type="hidden" name="p" id="search_project" value="/compute">
</form>
</header>
</div>
<div id="gc-wrapper">
<div id="gc-appbar">
<h1><a href="../../../index.html">gcloud 0.1 documentation</a></h1>
</div>
<div id="gc-main" class="main">
<div id="gc-sidebar" class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3>All API Docs</h3>
<nav class="gc-toc">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../datastore-api.html">Cloud Datastore</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../storage-api.html">Cloud Storage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../common-api.html">Cloud Common</a></li>
</ul>
</nav>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main" id="gc-content">
<h1>Source code for gcloud.datastore.helpers</h1><div class="highlight"><pre>
<span class="sd">"""Helper methods for dealing with Cloud Datastore's Protobuf API."""</span>
<span class="kn">import</span> <span class="nn">calendar</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">import</span> <span class="nn">pytz</span>
<span class="kn">from</span> <span class="nn">gcloud.datastore.key</span> <span class="kn">import</span> <span class="n">Key</span>
<div class="viewcode-block" id="get_protobuf_attribute_and_value"><a class="viewcode-back" href="../../../datastore-api.html#gcloud.datastore.helpers.get_protobuf_attribute_and_value">[docs]</a><span class="k">def</span> <span class="nf">get_protobuf_attribute_and_value</span><span class="p">(</span><span class="n">val</span><span class="p">):</span>
<span class="sd">"""Given a value, return the protobuf attribute name and proper value.</span>
<span class="sd"> The Protobuf API uses different attribute names</span>
<span class="sd"> based on value types rather than inferring the type.</span>
<span class="sd"> This method simply determines the proper attribute name</span>
<span class="sd"> based on the type of the value provided</span>
<span class="sd"> and returns the attribute name</span>
<span class="sd"> as well as a properly formatted value.</span>
<span class="sd"> Certain value types need to be coerced into a different type (such as a</span>
<span class="sd"> `datetime.datetime` into an integer timestamp, or a</span>
<span class="sd"> `gcloud.datastore.key.Key` into a Protobuf representation.</span>
<span class="sd"> This method handles that for you.</span>
<span class="sd"> For example:</span>
<span class="sd"> >>> get_protobuf_attribute_and_value(1234)</span>
<span class="sd"> ('integer_value', 1234)</span>
<span class="sd"> >>> get_protobuf_attribute_and_value('my_string')</span>
<span class="sd"> ('string_value', 'my_string')</span>
<span class="sd"> :type val: `datetime.datetime`, :class:`gcloud.datastore.key.Key`,</span>
<span class="sd"> bool, float, integer, string</span>
<span class="sd"> :param val: The value to be scrutinized.</span>
<span class="sd"> :returns: A tuple of the attribute name and proper value type.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">datetime</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="s">'timestamp_microseconds'</span>
<span class="c"># If the datetime is naive (no timezone), consider that it was</span>
<span class="c"># intended to be UTC and replace the tzinfo to that effect.</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">val</span><span class="o">.</span><span class="n">tzinfo</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">pytz</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
<span class="c"># Regardless of what timezone is on the value, convert it to UTC.</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="o">.</span><span class="n">astimezone</span><span class="p">(</span><span class="n">pytz</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
<span class="c"># Convert the datetime to a microsecond timestamp.</span>
<span class="n">value</span> <span class="o">=</span> <span class="nb">long</span><span class="p">(</span><span class="n">calendar</span><span class="o">.</span><span class="n">timegm</span><span class="p">(</span><span class="n">val</span><span class="o">.</span><span class="n">timetuple</span><span class="p">())</span> <span class="o">*</span> <span class="mf">1e6</span><span class="p">)</span> <span class="o">+</span> <span class="n">val</span><span class="o">.</span><span class="n">microsecond</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">Key</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">'key'</span><span class="p">,</span> <span class="n">val</span><span class="o">.</span><span class="n">to_protobuf</span><span class="p">()</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">'boolean'</span><span class="p">,</span> <span class="n">val</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">'double'</span><span class="p">,</span> <span class="n">val</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">long</span><span class="p">)):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">'integer'</span><span class="p">,</span> <span class="n">val</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">'string'</span><span class="p">,</span> <span class="n">val</span>
<span class="k">return</span> <span class="n">name</span> <span class="o">+</span> <span class="s">'_value'</span><span class="p">,</span> <span class="n">value</span>
</div>
<div class="viewcode-block" id="get_value_from_protobuf"><a class="viewcode-back" href="../../../datastore-api.html#gcloud.datastore.helpers.get_value_from_protobuf">[docs]</a><span class="k">def</span> <span class="nf">get_value_from_protobuf</span><span class="p">(</span><span class="n">pb</span><span class="p">):</span>
<span class="sd">"""Given a protobuf for a Property, get the correct value.</span>
<span class="sd"> The Cloud Datastore Protobuf API returns a Property Protobuf</span>
<span class="sd"> which has one value set and the rest blank.</span>
<span class="sd"> This method retrieves the the one value provided.</span>
<span class="sd"> Some work is done to coerce the return value into a more useful type</span>
<span class="sd"> (particularly in the case of a timestamp value, or a key value).</span>
<span class="sd"> :type pb: :class:`gcloud.datastore.datastore_v1_pb2.Property`</span>
<span class="sd"> :param pb: The Property Protobuf.</span>
<span class="sd"> :returns: The value provided by the Protobuf.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'timestamp_microseconds_value'</span><span class="p">):</span>
<span class="n">microseconds</span> <span class="o">=</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">timestamp_microseconds_value</span>
<span class="k">return</span> <span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcfromtimestamp</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">+</span>
<span class="n">timedelta</span><span class="p">(</span><span class="n">microseconds</span><span class="o">=</span><span class="n">microseconds</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'key_value'</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Key</span><span class="o">.</span><span class="n">from_protobuf</span><span class="p">(</span><span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">key_value</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'boolean_value'</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">boolean_value</span>
<span class="k">elif</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'double_value'</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">double_value</span>
<span class="k">elif</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'integer_value'</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">integer_value</span>
<span class="k">elif</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">HasField</span><span class="p">(</span><span class="s">'string_value'</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pb</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">string_value</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># TODO(jjg): Should we raise a ValueError here?</span>
<span class="k">return</span> <span class="bp">None</span></div>
</pre></div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</div>
<footer id="gc-footer" class="footer" role="contentinfo">
<div id="gc-copyright">
© Copyright 2014, JJ Geewax.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.1.
</div>
</footer>
</body>
</html>