Merge lp:~terrycojones/tickery/fluiddb-to-fluidinfo-798338 into lp:tickery
- fluiddb-to-fluidinfo-798338
- Merge into trunk
Proposed by
Terry Jones
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Terry Jones | ||||
Approved revision: | 10 | ||||
Merge reported by: | Terry Jones | ||||
Merged at revision: | not available | ||||
Proposed branch: | lp:~terrycojones/tickery/fluiddb-to-fluidinfo-798338 | ||||
Merge into: | lp:tickery | ||||
Diff against target: |
908 lines (+157/-155) 22 files modified
README (+8/-8) bin/create-twitter-namespaces-and-tags.py (+4/-4) doc/Makefile (+2/-2) doc/conf.py (+1/-1) doc/running.rst (+11/-11) doc/todo.rst (+6/-6) fabfile.py (+4/-3) resources/upstart/www.tickery.net.conf (+1/-1) tickery/ftwitter.py (+30/-30) tickery/oidcache.py (+7/-6) tickery/options.py (+4/-4) tickery/query.py (+1/-1) tickery/service.py (+10/-10) tickery/utils.py (+5/-5) tickery/www/about.py (+27/-27) tickery/www/advanced.py (+29/-29) tickery/www/banner.py (+1/-1) tickery/www/defaults.py (+2/-2) tickery/www/public/index.html (+1/-1) tickery/www/results.py (+1/-1) tickery/www/server.py (+1/-1) tickery/www/tickerytab.py (+1/-1) |
||||
To merge this branch: | bzr merge lp:~terrycojones/tickery/fluiddb-to-fluidinfo-798338 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Terry Jones | Approve | ||
Review via email:
|
Commit message
Description of the change
Use Fluidinfo instead of FluidDB in many places...
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'README' | |||
2 | --- README 2010-07-20 09:47:02 +0000 | |||
3 | +++ README 2011-06-16 17:39:31 +0000 | |||
4 | @@ -1,16 +1,16 @@ | |||
5 | 1 | Welcome! | 1 | Welcome! |
6 | 2 | -------- | 2 | -------- |
7 | 3 | 3 | ||
9 | 4 | Tickery is an open-source application written on FluidDB | 4 | Tickery is an open-source application written on Fluidinfo |
10 | 5 | (http://fluidinfo.com/). You can play with our running version at | 5 | (http://fluidinfo.com/). You can play with our running version at |
11 | 6 | http://tickery.net | 6 | http://tickery.net |
12 | 7 | 7 | ||
13 | 8 | Tickery provides a fun way to explore sets of Twitter friends. There's much | 8 | Tickery provides a fun way to explore sets of Twitter friends. There's much |
15 | 9 | more to the story however, as its underlying data is stored in FluidDB. This | 9 | more to the story however, as its underlying data is stored in Fluidinfo. This |
16 | 10 | means it can be added to by anyone (i.e., you!), and searched on in any way. | 10 | means it can be added to by anyone (i.e., you!), and searched on in any way. |
17 | 11 | 11 | ||
18 | 12 | We've open-sourced Tickery to help programmers see the insides of a | 12 | We've open-sourced Tickery to help programmers see the insides of a |
20 | 13 | substantial application written to use FluidDB. Although the Tickery | 13 | substantial application written to use Fluidinfo. Although the Tickery |
21 | 14 | documentation is currently very light, we hope to be able to change this. | 14 | documentation is currently very light, we hope to be able to change this. |
22 | 15 | You're welcome to help, of course. | 15 | You're welcome to help, of course. |
23 | 16 | 16 | ||
24 | @@ -21,10 +21,10 @@ | |||
25 | 21 | Fluidinfo blog: | 21 | Fluidinfo blog: |
26 | 22 | 22 | ||
27 | 23 | Meet Tickery | 23 | Meet Tickery |
29 | 24 | http://blogs.fluidinfo.com/fluidDB/2010/01/21/meet-tickery/ | 24 | http://blogs.fluidinfo.com/fluidinfo/2010/01/21/meet-tickery/ |
30 | 25 | 25 | ||
31 | 26 | Tickery, for programmers | 26 | Tickery, for programmers |
33 | 27 | http://blogs.fluidinfo.com/fluidDB/2010/01/21/tickery-for-programmers/ | 27 | http://blogs.fluidinfo.com/fluidinfo/2010/01/21/tickery-for-programmers/ |
34 | 28 | 28 | ||
35 | 29 | Running Tickery | 29 | Running Tickery |
36 | 30 | --------------- | 30 | --------------- |
37 | @@ -39,10 +39,10 @@ | |||
38 | 39 | Questions? | 39 | Questions? |
39 | 40 | ---------- | 40 | ---------- |
40 | 41 | 41 | ||
43 | 42 | For discussion of Tickery, we suggest you join the FluidDB users mailing list | 42 | For discussion of Tickery, we suggest you join the Fluidinfo users mailing list |
44 | 43 | at http://groups.google.com/group/fluiddb-users or join us in #fluiddb on | 43 | at http://groups.google.com/group/fluiddb-users or join us in #fluidinfo on |
45 | 44 | irc.freenode.net Please say hi, we're very interested in helping people to | 44 | irc.freenode.net Please say hi, we're very interested in helping people to |
47 | 45 | understand both Tickery and FluidDB. | 45 | understand both Tickery and Fluidinfo. |
48 | 46 | 46 | ||
49 | 47 | 47 | ||
50 | 48 | Happy hacking! | 48 | Happy hacking! |
51 | 49 | 49 | ||
52 | === modified file 'bin/create-twitter-namespaces-and-tags.py' | |||
53 | --- bin/create-twitter-namespaces-and-tags.py 2011-06-16 16:10:07 +0000 | |||
54 | +++ bin/create-twitter-namespaces-and-tags.py 2011-06-16 17:39:31 +0000 | |||
55 | @@ -80,7 +80,7 @@ | |||
56 | 80 | (TWITTER_ID_TAG_NAME, 'Twitter user id.'), | 80 | (TWITTER_ID_TAG_NAME, 'Twitter user id.'), |
57 | 81 | (TWITTER_SCREENNAME_TAG_NAME, 'Twitter screen name.'), | 81 | (TWITTER_SCREENNAME_TAG_NAME, 'Twitter screen name.'), |
58 | 82 | (TWITTER_UPDATED_AT_TAG_NAME, | 82 | (TWITTER_UPDATED_AT_TAG_NAME, |
60 | 83 | 'Time (in seconds) of last update of this user in FluidDB.'), | 83 | 'Time (in seconds) of last update of this user in Fluidinfo.'), |
61 | 84 | (TWITTER_N_FRIENDS_TAG_NAME, 'Number of friends of a Twitter user.'), | 84 | (TWITTER_N_FRIENDS_TAG_NAME, 'Number of friends of a Twitter user.'), |
62 | 85 | (TWITTER_N_FOLLOWERS_TAG_NAME, | 85 | (TWITTER_N_FOLLOWERS_TAG_NAME, |
63 | 86 | 'Number of followers of a Twitter user.'), | 86 | 'Number of followers of a Twitter user.'), |
64 | @@ -97,13 +97,13 @@ | |||
65 | 97 | def nok(failure): | 97 | def nok(failure): |
66 | 98 | print 'Failed:', failure | 98 | print 'Failed:', failure |
67 | 99 | if hasattr(failure.value, 'response_headers'): | 99 | if hasattr(failure.value, 'response_headers'): |
69 | 100 | foundFluidDBHeader = False | 100 | foundFluidinfoHeader = False |
70 | 101 | for header in failure.value.response_headers: | 101 | for header in failure.value.response_headers: |
71 | 102 | if header.startswith('x-fluiddb-'): | 102 | if header.startswith('x-fluiddb-'): |
73 | 103 | foundFluidDBHeader = True | 103 | foundFluidinfoHeader = True |
74 | 104 | print '\t%s: %s' % ( | 104 | print '\t%s: %s' % ( |
75 | 105 | header, failure.value.response_headers[header][0]) | 105 | header, failure.value.response_headers[header][0]) |
77 | 106 | if not foundFluidDBHeader: | 106 | if not foundFluidinfoHeader: |
78 | 107 | print 'Headers: %r' % (failure.value.response_headers) | 107 | print 'Headers: %r' % (failure.value.response_headers) |
79 | 108 | else: | 108 | else: |
80 | 109 | return failure | 109 | return failure |
81 | 110 | 110 | ||
82 | === modified file 'doc/Makefile' | |||
83 | --- doc/Makefile 2011-06-14 20:36:36 +0000 | |||
84 | +++ doc/Makefile 2011-06-16 17:39:31 +0000 | |||
85 | @@ -60,9 +60,9 @@ | |||
86 | 60 | @echo | 60 | @echo |
87 | 61 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ | 61 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ |
88 | 62 | ".qhcp project file in _build/qthelp, like this:" | 62 | ".qhcp project file in _build/qthelp, like this:" |
90 | 63 | @echo "# qcollectiongenerator _build/qthelp/fluidDB.qhcp" | 63 | @echo "# qcollectiongenerator _build/qthelp/fluidinfo.qhcp" |
91 | 64 | @echo "To view the help file:" | 64 | @echo "To view the help file:" |
93 | 65 | @echo "# assistant -collectionFile _build/qthelp/fluidDB.qhc" | 65 | @echo "# assistant -collectionFile _build/qthelp/fluidinfo.qhc" |
94 | 66 | 66 | ||
95 | 67 | latex: | 67 | latex: |
96 | 68 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex | 68 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex |
97 | 69 | 69 | ||
98 | === modified file 'doc/conf.py' | |||
99 | --- doc/conf.py 2011-06-16 16:10:07 +0000 | |||
100 | +++ doc/conf.py 2011-06-16 17:39:31 +0000 | |||
101 | @@ -155,7 +155,7 @@ | |||
102 | 155 | #html_file_suffix = '' | 155 | #html_file_suffix = '' |
103 | 156 | 156 | ||
104 | 157 | # Output file base name for HTML help builder. | 157 | # Output file base name for HTML help builder. |
106 | 158 | htmlhelp_basename = 'fluidDBdoc' | 158 | htmlhelp_basename = 'fluidinfodoc' |
107 | 159 | 159 | ||
108 | 160 | 160 | ||
109 | 161 | # -- Options for LaTeX output ------------------------------------------------ | 161 | # -- Options for LaTeX output ------------------------------------------------ |
110 | 162 | 162 | ||
111 | === modified file 'doc/running.rst' | |||
112 | --- doc/running.rst 2010-07-20 09:47:02 +0000 | |||
113 | +++ doc/running.rst 2011-06-16 17:39:31 +0000 | |||
114 | @@ -9,7 +9,7 @@ | |||
115 | 9 | Tickery's behavior with what you'll see in the source code. | 9 | Tickery's behavior with what you'll see in the source code. |
116 | 10 | 10 | ||
117 | 11 | We've open sourced Tickery so other developers can have a close look at | 11 | We've open sourced Tickery so other developers can have a close look at |
119 | 12 | how a non-trivial FluidDB application is put together. | 12 | how a non-trivial Fluidinfo application is put together. |
120 | 13 | 13 | ||
121 | 14 | But we also want to make it possible for you to run your own version of | 14 | But we also want to make it possible for you to run your own version of |
122 | 15 | Tickery. | 15 | Tickery. |
123 | @@ -38,23 +38,23 @@ | |||
124 | 38 | * `Ply <http://www.dabeaz.com/ply/>`_. | 38 | * `Ply <http://www.dabeaz.com/ply/>`_. |
125 | 39 | * `Sphinx <http://sphinx.pocoo.org/>`_ (to build this documentation) | 39 | * `Sphinx <http://sphinx.pocoo.org/>`_ (to build this documentation) |
126 | 40 | 40 | ||
129 | 41 | One-time FluidDB setup | 41 | One-time Fluidinfo setup |
130 | 42 | ---------------------- | 42 | ------------------------ |
131 | 43 | 43 | ||
132 | 44 | To run your own version of Tickery (as opposed to just browsing the source | 44 | To run your own version of Tickery (as opposed to just browsing the source |
135 | 45 | code to see how Tickery does its thing), you'll need to use a FluidDB user | 45 | code to see how Tickery does its thing), you'll need to use a Fluidinfo user |
136 | 46 | other than the one we use (we use ``twitter.com``). If you have a FluidDB | 46 | other than the one we use (we use ``twitter.com``). If you have a Fluidinfo |
137 | 47 | account, you can use it, otherwise go to http://fluidinfo.com/accounts/new/ | 47 | account, you can use it, otherwise go to http://fluidinfo.com/accounts/new/ |
139 | 48 | and create a FluidDB account. | 48 | and create a Fluidinfo account. |
140 | 49 | 49 | ||
145 | 50 | Put the FluidDB username you want to use into the ``TWITTER_USERNAME`` | 50 | Put the Fluidinfo username you want to use into the ``TWITTER_USERNAME`` |
146 | 51 | variable in ``tickery/www/defaults`` and the FluidDB password into an | 51 | variable in ``tickery/www/defaults`` and the Fluidinfo password into an |
147 | 52 | environment variable named ``FLUIDDB_TWITTER_PASSWORD``. You should then be | 52 | environment variable named ``FLUIDINFO_TWITTER_PASSWORD``. You should then be |
148 | 53 | able to create the necessary FluidDB namespaces and tags for your FluidDB | 53 | able to create the necessary Fluidinfo namespaces and tags for your Fluidinfo |
149 | 54 | user with the ``bin/create-twitter-namespaces-and-tags.py`` script. | 54 | user with the ``bin/create-twitter-namespaces-and-tags.py`` script. |
150 | 55 | 55 | ||
151 | 56 | This does as it says: creates the namespaces and tags that the user in | 56 | This does as it says: creates the namespaces and tags that the user in |
153 | 57 | FluidDB will need to have in order for Tickery to work. | 57 | Fluidinfo will need to have in order for Tickery to work. |
154 | 58 | 58 | ||
155 | 59 | One-time Twitter setup | 59 | One-time Twitter setup |
156 | 60 | ---------------------- | 60 | ---------------------- |
157 | 61 | 61 | ||
158 | === modified file 'doc/todo.rst' | |||
159 | --- doc/todo.rst 2010-07-20 09:47:02 +0000 | |||
160 | +++ doc/todo.rst 2011-06-16 17:39:31 +0000 | |||
161 | @@ -19,14 +19,14 @@ | |||
162 | 19 | * Make status window auto-update | 19 | * Make status window auto-update |
163 | 20 | * Canonicalize some queries to improve cache hit ratio. | 20 | * Canonicalize some queries to improve cache hit ratio. |
164 | 21 | * Set a timer to periodically update # of users tracked by Tickery. | 21 | * Set a timer to periodically update # of users tracked by Tickery. |
166 | 22 | * Add a button to allow a user to update their Twitter details in FluidDB. | 22 | * Add a button to allow a user to update their Twitter details in Fluidinfo. |
167 | 23 | (i.e., we spider them, update their followers etc) | 23 | (i.e., we spider them, update their followers etc) |
169 | 24 | * Add a refreshFromFluidDB method to the caches that can use it. | 24 | * Add a refreshFromFluidinfo method to the caches that can use it. |
170 | 25 | * The cache should expire things. Switch to memcached? | 25 | * The cache should expire things. Switch to memcached? |
171 | 26 | * Need to re-spider users and refresh/update/expire other cache info. | 26 | * Need to re-spider users and refresh/update/expire other cache info. |
172 | 27 | * Add twitter.com/SUL tags. | 27 | * Add twitter.com/SUL tags. |
175 | 28 | * Requests to twitter (and FluidDB?) should have timeouts. | 28 | * Requests to twitter (and Fluidinfo?) should have timeouts. |
176 | 29 | * Add an offline mode that only works on cached data in case FluidDB | 29 | * Add an offline mode that only works on cached data in case Fluidinfo |
177 | 30 | or Twitter are down/inaccessible. Set this on/off on the admin page. | 30 | or Twitter are down/inaccessible. Set this on/off on the admin page. |
178 | 31 | * What do we do when a user changes from public to protected? | 31 | * What do we do when a user changes from public to protected? |
179 | 32 | * Setting the visible limit on the simple tab text boxes doesn't work too well. | 32 | * Setting the visible limit on the simple tab text boxes doesn't work too well. |
180 | @@ -66,8 +66,8 @@ | |||
181 | 66 | * Add the ability to toggle noisy logging. | 66 | * Add the ability to toggle noisy logging. |
182 | 67 | * Make admin interface auto-update? | 67 | * Make admin interface auto-update? |
183 | 68 | * Allow us to act on the cache. | 68 | * Allow us to act on the cache. |
186 | 69 | * Allow us to rebuild or refresh from FluidDB. | 69 | * Allow us to rebuild or refresh from Fluidinfo. |
187 | 70 | * Ability to remove users from FluidDB? | 70 | * Ability to remove users from Fluidinfo? |
188 | 71 | * Shows usage stats. | 71 | * Shows usage stats. |
189 | 72 | * Should be able to send a HUP to Tickery to have caches dumped. | 72 | * Should be able to send a HUP to Tickery to have caches dumped. |
190 | 73 | 73 | ||
191 | 74 | 74 | ||
192 | === modified file 'fabfile.py' | |||
193 | --- fabfile.py 2011-06-16 17:12:50 +0000 | |||
194 | +++ fabfile.py 2011-06-16 17:39:31 +0000 | |||
195 | @@ -1,6 +1,6 @@ | |||
196 | 1 | """ | 1 | """ |
197 | 2 | This fabfile contains the recipe for automatically testing and deploying the | 2 | This fabfile contains the recipe for automatically testing and deploying the |
199 | 3 | api.fluiddb.com website. | 3 | tickery.net website. |
200 | 4 | 4 | ||
201 | 5 | Fabfiles are strange and configuring them is sometimes a bit hit and miss, | 5 | Fabfiles are strange and configuring them is sometimes a bit hit and miss, |
202 | 6 | but nevertheless the following functions are defined by fabric: | 6 | but nevertheless the following functions are defined by fabric: |
203 | @@ -56,7 +56,8 @@ | |||
204 | 56 | 56 | ||
205 | 57 | run('. /srv/tickery/%(path)s/bin/activate' % env) | 57 | run('. /srv/tickery/%(path)s/bin/activate' % env) |
206 | 58 | 58 | ||
208 | 59 | run('/srv/tickery/%(path)s/bin/pip install --upgrade -r /srv/tickery/%(path)s/requirements.txt' % env) | 59 | run('/srv/tickery/%(path)s/bin/pip install --upgrade ' |
209 | 60 | '-r /srv/tickery/%(path)s/requirements.txt' % env) | ||
210 | 60 | 61 | ||
211 | 61 | run('mkdir -p /srv/tickery/%(path)s/var/run' % env) | 62 | run('mkdir -p /srv/tickery/%(path)s/var/run' % env) |
212 | 62 | run('chmod a+w /srv/tickery/%(path)s/var/run' % env) | 63 | run('chmod a+w /srv/tickery/%(path)s/var/run' % env) |
213 | @@ -73,7 +74,7 @@ | |||
214 | 73 | require('hosts', provided_by=[live]) | 74 | require('hosts', provided_by=[live]) |
215 | 74 | run('rm -f /srv/tickery/%(sitename)s' % env) | 75 | run('rm -f /srv/tickery/%(sitename)s' % env) |
216 | 75 | run('ln -s /srv/tickery/%(path)s /srv/tickery/%(sitename)s' % env) | 76 | run('ln -s /srv/tickery/%(path)s /srv/tickery/%(sitename)s' % env) |
218 | 76 | # run('restart %(sitename)s' % env) | 77 | # run('restart %(sitename)s' % env) |
219 | 77 | 78 | ||
220 | 78 | 79 | ||
221 | 79 | def deploy(): | 80 | def deploy(): |
222 | 80 | 81 | ||
223 | === modified file 'resources/upstart/www.tickery.net.conf' | |||
224 | --- resources/upstart/www.tickery.net.conf 2011-06-16 17:12:50 +0000 | |||
225 | +++ resources/upstart/www.tickery.net.conf 2011-06-16 17:39:31 +0000 | |||
226 | @@ -13,7 +13,7 @@ | |||
227 | 13 | . $VIRTUALENV_HOME/bin/activate | 13 | . $VIRTUALENV_HOME/bin/activate |
228 | 14 | export TICKERY_CONSUMER_KEY=xxx | 14 | export TICKERY_CONSUMER_KEY=xxx |
229 | 15 | export TICKERY_CONSUMER_SECRET=xxx | 15 | export TICKERY_CONSUMER_SECRET=xxx |
231 | 16 | export FLUIDDB_TWITTER_PASSWORD=xxx | 16 | export FLUIDINFO_TWITTER_PASSWORD=xxx |
232 | 17 | exec /sbin/start-stop-daemon --start --chdir $VIRTUALENV_HOME \ | 17 | exec /sbin/start-stop-daemon --start --chdir $VIRTUALENV_HOME \ |
233 | 18 | --chuid $TICKERY_USER --exec /usr/bin/env -- twistd \ | 18 | --chuid $TICKERY_USER --exec /usr/bin/env -- twistd \ |
234 | 19 | --pidfile=/srv/tickery/tickery.net/var/run/tickery.$$.pid \ | 19 | --pidfile=/srv/tickery/tickery.net/var/run/tickery.$$.pid \ |
235 | 20 | 20 | ||
236 | === modified file 'tickery/ftwitter.py' | |||
237 | --- tickery/ftwitter.py 2011-06-16 16:57:37 +0000 | |||
238 | +++ tickery/ftwitter.py 2011-06-16 17:39:31 +0000 | |||
239 | @@ -30,7 +30,7 @@ | |||
240 | 30 | TWITTER_N_FOLLOWERS_TAG_NAME, TWITTER_N_STATUSES_TAG_NAME) | 30 | TWITTER_N_FOLLOWERS_TAG_NAME, TWITTER_N_STATUSES_TAG_NAME) |
241 | 31 | 31 | ||
242 | 32 | # This is the maximum requests that will be sent out at once by anything | 32 | # This is the maximum requests that will be sent out at once by anything |
244 | 33 | # using a task.Cooperator. That's usually FluidDB, but it can also mean | 33 | # using a task.Cooperator. That's usually Fluidinfo, but it can also mean |
245 | 34 | # this many requests going at once to Twitter to pick up user details. | 34 | # this many requests going at once to Twitter to pick up user details. |
246 | 35 | MAX_SIMULTANEOUS_REQUESTS = 5 | 35 | MAX_SIMULTANEOUS_REQUESTS = 5 |
247 | 36 | 36 | ||
248 | @@ -109,19 +109,19 @@ | |||
249 | 109 | pass | 109 | pass |
250 | 110 | 110 | ||
251 | 111 | 111 | ||
265 | 112 | class FluidDBParseError(Exception): | 112 | class FluidinfoParseError(Exception): |
266 | 113 | pass | 113 | pass |
267 | 114 | 114 | ||
268 | 115 | 115 | ||
269 | 116 | class FluidDBNonexistentAttribute(Exception): | 116 | class FluidinfoNonexistentAttribute(Exception): |
270 | 117 | pass | 117 | pass |
271 | 118 | 118 | ||
272 | 119 | 119 | ||
273 | 120 | class FluidDBPermissionDenied(Exception): | 120 | class FluidinfoPermissionDenied(Exception): |
274 | 121 | pass | 121 | pass |
275 | 122 | 122 | ||
276 | 123 | 123 | ||
277 | 124 | class FluidDBError(Exception): | 124 | class FluidinfoError(Exception): |
278 | 125 | pass | 125 | pass |
279 | 126 | 126 | ||
280 | 127 | 127 | ||
281 | @@ -269,7 +269,7 @@ | |||
282 | 269 | userJob.workToDo += (nFriendsToAdd * WORK_TO_CREATE_A_FRIEND) | 269 | userJob.workToDo += (nFriendsToAdd * WORK_TO_CREATE_A_FRIEND) |
283 | 270 | start = time.time() | 270 | start = time.time() |
284 | 271 | 271 | ||
286 | 272 | # Create FluidDB objects for all the friends that we don't yet know | 272 | # Create Fluidinfo objects for all the friends that we don't yet know |
287 | 273 | # about. | 273 | # about. |
288 | 274 | jobs = makeCreateUserJobs(friendsToAdd) | 274 | jobs = makeCreateUserJobs(friendsToAdd) |
289 | 275 | deferreds = [] | 275 | deferreds = [] |
290 | @@ -419,10 +419,10 @@ | |||
291 | 419 | log.msg('Query cache hit (size %d) for %r.' % (len(result), queryStr)) | 419 | log.msg('Query cache hit (size %d) for %r.' % (len(result), queryStr)) |
292 | 420 | return defer.succeed(result) | 420 | return defer.succeed(result) |
293 | 421 | 421 | ||
298 | 422 | _fluidDBErrors = { | 422 | _fluidinfoErrors = { |
299 | 423 | 'TParseError': FluidDBParseError, | 423 | 'TParseError': FluidinfoParseError, |
300 | 424 | 'TPathPermissionDenied': FluidDBPermissionDenied, | 424 | 'TPathPermissionDenied': FluidinfoPermissionDenied, |
301 | 425 | 'TNonexistentAttribute': FluidDBNonexistentAttribute, | 425 | 'TNonexistentAttribute': FluidinfoNonexistentAttribute, |
302 | 426 | } | 426 | } |
303 | 427 | 427 | ||
304 | 428 | 428 | ||
305 | @@ -430,23 +430,23 @@ | |||
306 | 430 | fail.trap(error.Error) | 430 | fail.trap(error.Error) |
307 | 431 | errorClass = fail.value.response_headers.get('x-fluiddb-error-class') | 431 | errorClass = fail.value.response_headers.get('x-fluiddb-error-class') |
308 | 432 | if errorClass is None: | 432 | if errorClass is None: |
312 | 433 | log.msg('No Fluiddb error class header! Query %r got HTTP status %s' % | 433 | log.msg('No Fluidinfo error class header! ' |
313 | 434 | (query, fail.value.status)) | 434 | 'Query %r got HTTP status %s' % (query, fail.value.status)) |
314 | 435 | raise FluidDBError() | 435 | raise FluidinfoError() |
315 | 436 | else: | 436 | else: |
316 | 437 | errorClass = errorClass[0] | 437 | errorClass = errorClass[0] |
317 | 438 | 438 | ||
318 | 439 | try: | 439 | try: |
319 | 440 | log.msg('Error Class %r' % (errorClass,)) | 440 | log.msg('Error Class %r' % (errorClass,)) |
321 | 441 | raise _fluidDBErrors[errorClass]() | 441 | raise _fluidinfoErrors[errorClass]() |
322 | 442 | except KeyError: | 442 | except KeyError: |
324 | 443 | log.msg('Unhandled Fluiddb error class %r Query %r got ' | 443 | log.msg('Unhandled Fluidinfo error class %r Query %r got ' |
325 | 444 | 'HTTP status %s' % | 444 | 'HTTP status %s' % |
326 | 445 | (errorClass, query, fail.value.status)) | 445 | (errorClass, query, fail.value.status)) |
331 | 446 | raise FluidDBError() | 446 | raise FluidinfoError() |
332 | 447 | 447 | ||
333 | 448 | 448 | ||
334 | 449 | def fluidDBQuery(endpoint, query): | 449 | def fluidinfoQuery(endpoint, query): |
335 | 450 | d = Object.query(endpoint, query) | 450 | d = Object.query(endpoint, query) |
336 | 451 | d.addCallback(lambda results: [r.uuid for r in results]) | 451 | d.addCallback(lambda results: [r.uuid for r in results]) |
337 | 452 | d.addErrback(_queryErr, query) | 452 | d.addErrback(_queryErr, query) |
338 | @@ -511,7 +511,7 @@ | |||
339 | 511 | d = cache.oidUidScreennameCache.objectByUid( | 511 | d = cache.oidUidScreennameCache.objectByUid( |
340 | 512 | uid, userNameCache=cache.userCache) | 512 | uid, userNameCache=cache.userCache) |
341 | 513 | d.addCallback(lambda o: o.set(endpoint, tag, None)) | 513 | d.addCallback(lambda o: o.set(endpoint, tag, None)) |
343 | 514 | # The logged in user may not yet exist in FluidDB. | 514 | # The logged in user may not yet exist in Fluidinfo. |
344 | 515 | d.addErrback(_ignoreHTTPStatus, http.NOT_FOUND) | 515 | d.addErrback(_ignoreHTTPStatus, http.NOT_FOUND) |
345 | 516 | return d | 516 | return d |
346 | 517 | 517 | ||
347 | @@ -523,7 +523,7 @@ | |||
348 | 523 | d = cache.oidUidScreennameCache.objectByUid( | 523 | d = cache.oidUidScreennameCache.objectByUid( |
349 | 524 | uid, userNameCache=cache.userCache) | 524 | uid, userNameCache=cache.userCache) |
350 | 525 | d.addCallback(lambda o: o.delete(endpoint, tag)) | 525 | d.addCallback(lambda o: o.delete(endpoint, tag)) |
352 | 526 | # The logged in user may not yet exist in FluidDB. | 526 | # The logged in user may not yet exist in Fluidinfo. |
353 | 527 | d.addErrback(_ignoreHTTPStatus, http.NOT_FOUND) | 527 | d.addErrback(_ignoreHTTPStatus, http.NOT_FOUND) |
354 | 528 | return d | 528 | return d |
355 | 529 | 529 | ||
356 | 530 | 530 | ||
357 | === modified file 'tickery/oidcache.py' | |||
358 | --- tickery/oidcache.py 2011-06-16 16:10:07 +0000 | |||
359 | +++ tickery/oidcache.py 2011-06-16 17:39:31 +0000 | |||
360 | @@ -91,14 +91,14 @@ | |||
361 | 91 | nResults = len(results) | 91 | nResults = len(results) |
362 | 92 | if nResults == 0: | 92 | if nResults == 0: |
363 | 93 | raise Exception( | 93 | raise Exception( |
365 | 94 | 'Screenname %r not known to FluidDB' % screenname) | 94 | 'Screenname %r not known to Fluidinfo' % screenname) |
366 | 95 | elif nResults == 1: | 95 | elif nResults == 1: |
367 | 96 | objectId = results[0].uuid | 96 | objectId = results[0].uuid |
368 | 97 | self.add(objectId, screenname=screenname) | 97 | self.add(objectId, screenname=screenname) |
369 | 98 | return objectId | 98 | return objectId |
370 | 99 | else: | 99 | else: |
371 | 100 | log.err('ERROR: Twitter screenname %r found %d times ' | 100 | log.err('ERROR: Twitter screenname %r found %d times ' |
373 | 101 | 'in FluidDB! ObjectIds = %r' % | 101 | 'in Fluidinfo! ObjectIds = %r' % |
374 | 102 | (screenname, nResults, results)) | 102 | (screenname, nResults, results)) |
375 | 103 | # Don't crash: just return the first object id found. | 103 | # Don't crash: just return the first object id found. |
376 | 104 | return results[0] | 104 | return results[0] |
377 | @@ -118,13 +118,14 @@ | |||
378 | 118 | if nResults: | 118 | if nResults: |
379 | 119 | if nResults > 1: | 119 | if nResults > 1: |
380 | 120 | msg = ('User with Twitter id %d exists %d times ' | 120 | msg = ('User with Twitter id %d exists %d times ' |
382 | 121 | 'in FluidDB! Ignoring.' % (uid, nResults)) | 121 | 'in Fluidinfo! Ignoring.' % (uid, nResults)) |
383 | 122 | log.err(msg) | 122 | log.err(msg) |
384 | 123 | raise Exception(msg) | 123 | raise Exception(msg) |
385 | 124 | else: | 124 | else: |
386 | 125 | o = results[0] | 125 | o = results[0] |
387 | 126 | self.add(o.uuid, uid, screenname) | 126 | self.add(o.uuid, uid, screenname) |
389 | 127 | log.msg('Found FluidDB object for Twitter user %d.' % uid) | 127 | log.msg('Found Fluidinfo object for Twitter user %d.' % |
390 | 128 | uid) | ||
391 | 128 | else: | 129 | else: |
392 | 129 | about = '%s:uid:%d' % (TWITTER_USERNAME, uid) | 130 | about = '%s:uid:%d' % (TWITTER_USERNAME, uid) |
393 | 130 | o = yield Object.create(self.endpoint, about) | 131 | o = yield Object.create(self.endpoint, about) |
394 | @@ -160,8 +161,8 @@ | |||
395 | 160 | self.clean = False | 161 | self.clean = False |
396 | 161 | 162 | ||
397 | 162 | def objectIdsToUsers(self, objectIds, userCache): | 163 | def objectIdsToUsers(self, objectIds, userCache): |
400 | 163 | '''Convert a list of FluidDB object ids to a 2-tuple, a list of | 164 | '''Convert a list of Fluidinfo object ids to a 2-tuple, a list of |
401 | 164 | Twitter screennames and a list of any FluidDB object ids that did | 165 | Twitter screennames and a list of any Fluidinfo object ids that did |
402 | 165 | not correspond to Twitter users.''' | 166 | not correspond to Twitter users.''' |
403 | 166 | users = [] | 167 | users = [] |
404 | 167 | ids = [] | 168 | ids = [] |
405 | 168 | 169 | ||
406 | === modified file 'tickery/options.py' | |||
407 | --- tickery/options.py 2011-06-14 20:36:36 +0000 | |||
408 | +++ tickery/options.py 2011-06-16 17:39:31 +0000 | |||
409 | @@ -19,11 +19,11 @@ | |||
410 | 19 | 19 | ||
411 | 20 | class EndpointOptions(usage.Options): | 20 | class EndpointOptions(usage.Options): |
412 | 21 | optParameters = [ | 21 | optParameters = [ |
414 | 22 | ['endpoint', None, None, 'The FluidDB endpoint URL.'], | 22 | ['endpoint', None, None, 'The Fluidinfo endpoint URL.'], |
415 | 23 | ] | 23 | ] |
416 | 24 | optFlags = [ | 24 | optFlags = [ |
419 | 25 | ['local', 'L', 'If True use the a local FluidDB'], | 25 | ['local', 'L', 'If True use the a local Fluidinfo'], |
420 | 26 | ['sandbox', 'S', 'If True use the sandbox FluidDB'], | 26 | ['sandbox', 'S', 'If True use the sandbox Fluidinfo'], |
421 | 27 | ] | 27 | ] |
422 | 28 | 28 | ||
423 | 29 | def postOptions(self): | 29 | def postOptions(self): |
424 | @@ -41,7 +41,7 @@ | |||
425 | 41 | else: | 41 | else: |
426 | 42 | endpointURL = defaults.SANDBOX_ENDPOINT | 42 | endpointURL = defaults.SANDBOX_ENDPOINT |
427 | 43 | else: | 43 | else: |
429 | 44 | endpointURL = defaults.FLUIDDB_ENDPOINT | 44 | endpointURL = defaults.FLUIDINFO_ENDPOINT |
430 | 45 | if not endpointURL.endswith('/'): | 45 | if not endpointURL.endswith('/'): |
431 | 46 | endpointURL += '/' | 46 | endpointURL += '/' |
432 | 47 | self['endpoint'] = endpointURL | 47 | self['endpoint'] = endpointURL |
433 | 48 | 48 | ||
434 | === modified file 'tickery/query.py' | |||
435 | --- tickery/query.py 2011-06-16 16:10:07 +0000 | |||
436 | +++ tickery/query.py 2011-06-16 17:39:31 +0000 | |||
437 | @@ -189,7 +189,7 @@ | |||
438 | 189 | 189 | ||
439 | 190 | 190 | ||
440 | 191 | def queryTreeToString(queryTree, fdbUsername, fdbNamespace): | 191 | def queryTreeToString(queryTree, fdbUsername, fdbNamespace): |
442 | 192 | """Return a query string that can be sent to FluidDB. Note that we turn | 192 | """Return a query string that can be sent to Fluidinfo. Note that we turn |
443 | 193 | all screennames into lowercase in the complete tag names. That's | 193 | all screennames into lowercase in the complete tag names. That's |
444 | 194 | because that's the way we create the tags. | 194 | because that's the way we create the tags. |
445 | 195 | """ | 195 | """ |
446 | 196 | 196 | ||
447 | === modified file 'tickery/service.py' | |||
448 | --- tickery/service.py 2011-06-16 16:10:07 +0000 | |||
449 | +++ tickery/service.py 2011-06-16 17:39:31 +0000 | |||
450 | @@ -56,7 +56,7 @@ | |||
451 | 56 | [self.cache.adderCache.added(s) for s in screennames]} | 56 | [self.cache.adderCache.added(s) for s in screennames]} |
452 | 57 | 57 | ||
453 | 58 | def _objectIdsToUsers(self, (users, ids)): | 58 | def _objectIdsToUsers(self, (users, ids)): |
455 | 59 | '''Convert a list of FluidDB object ids to a JSON RPC result dict | 59 | '''Convert a list of Fluidinfo object ids to a JSON RPC result dict |
456 | 60 | containing a list of Twitter screennames.''' | 60 | containing a list of Twitter screennames.''' |
457 | 61 | if ids: | 61 | if ids: |
458 | 62 | log.err('Unexpected object ids matched query: %r' % (ids,)) | 62 | log.err('Unexpected object ids matched query: %r' % (ids,)) |
459 | @@ -158,13 +158,13 @@ | |||
460 | 158 | d.addErrback(log.err) | 158 | d.addErrback(log.err) |
461 | 159 | return d | 159 | return d |
462 | 160 | 160 | ||
468 | 161 | def _fluidDBError(self, fail, query): | 161 | def _fluidinfoError(self, fail, query): |
469 | 162 | err = fail.check(ftwitter.FluidDBParseError, | 162 | err = fail.check(ftwitter.FluidinfoParseError, |
470 | 163 | ftwitter.FluidDBError, | 163 | ftwitter.FluidinfoError, |
471 | 164 | ftwitter.FluidDBNonexistentAttribute, | 164 | ftwitter.FluidinfoNonexistentAttribute, |
472 | 165 | ftwitter.FluidDBPermissionDenied) | 165 | ftwitter.FluidinfoPermissionDenied) |
473 | 166 | if err is None: | 166 | if err is None: |
475 | 167 | log.msg('Error on FluidDB query %r:' % query) | 167 | log.msg('Error on Fluidinfo query %r:' % query) |
476 | 168 | log.err(fail) | 168 | log.err(fail) |
477 | 169 | errorClass = 'unknown' | 169 | errorClass = 'unknown' |
478 | 170 | else: | 170 | else: |
479 | @@ -176,7 +176,7 @@ | |||
480 | 176 | } | 176 | } |
481 | 177 | } | 177 | } |
482 | 178 | 178 | ||
484 | 179 | def jsonrpc_fluidDBQuery(self, cookie, tabName, query): | 179 | def jsonrpc_fluidinfoQuery(self, cookie, tabName, query): |
485 | 180 | try: | 180 | try: |
486 | 181 | data = self.cache.cookieCache[cookie] | 181 | data = self.cache.cookieCache[cookie] |
487 | 182 | except KeyError: | 182 | except KeyError: |
488 | @@ -185,14 +185,14 @@ | |||
489 | 185 | screenname = data[0]['screen_name'] | 185 | screenname = data[0]['screen_name'] |
490 | 186 | log.msg('QUERY: tab=%s user=%r query=%r' % ( | 186 | log.msg('QUERY: tab=%s user=%r query=%r' % ( |
491 | 187 | tabName, screenname, query)) | 187 | tabName, screenname, query)) |
493 | 188 | d = ftwitter.fluidDBQuery(self.endpoint, query) | 188 | d = ftwitter.fluidinfoQuery(self.endpoint, query) |
494 | 189 | d.addCallback(self._checkTooManyResults) | 189 | d.addCallback(self._checkTooManyResults) |
495 | 190 | d.addCallback( | 190 | d.addCallback( |
496 | 191 | self.cache.oidUidScreennameCache.objectIdsToUsers, | 191 | self.cache.oidUidScreennameCache.objectIdsToUsers, |
497 | 192 | self.cache.userCache) | 192 | self.cache.userCache) |
498 | 193 | d.addCallback(self._objectIdsToUsersWherePossible) | 193 | d.addCallback(self._objectIdsToUsersWherePossible) |
499 | 194 | d.addErrback(self._screennameListError) # Catches TooManyResults | 194 | d.addErrback(self._screennameListError) # Catches TooManyResults |
501 | 195 | d.addErrback(self._fluidDBError, query) | 195 | d.addErrback(self._fluidinfoError, query) |
502 | 196 | return d | 196 | return d |
503 | 197 | 197 | ||
504 | 198 | def _loginRedirectURL(self, URL): | 198 | def _loginRedirectURL(self, URL): |
505 | 199 | 199 | ||
506 | === modified file 'tickery/utils.py' | |||
507 | --- tickery/utils.py 2011-06-16 16:10:07 +0000 | |||
508 | +++ tickery/utils.py 2011-06-16 17:39:31 +0000 | |||
509 | @@ -19,18 +19,18 @@ | |||
510 | 19 | from txfluiddb.client import _HasPath | 19 | from txfluiddb.client import _HasPath |
511 | 20 | 20 | ||
512 | 21 | 21 | ||
515 | 22 | def fluidDBRootPassword(): | 22 | def fluidinfoRootPassword(): |
516 | 23 | VAR = 'FLUIDDB_ROOT_PASSWORD' | 23 | VAR = 'FLUIDINFO_ROOT_PASSWORD' |
517 | 24 | try: | 24 | try: |
518 | 25 | return os.environ[VAR] | 25 | return os.environ[VAR] |
519 | 26 | except KeyError: | 26 | except KeyError: |
520 | 27 | raise usage.UsageError('You must set a %s environment variable.' % VAR) | 27 | raise usage.UsageError('You must set a %s environment variable.' % VAR) |
521 | 28 | 28 | ||
522 | 29 | 29 | ||
524 | 30 | class FluidDBOptions(usage.Options): | 30 | class FluidinfoOptions(usage.Options): |
525 | 31 | optParameters = [ | 31 | optParameters = [ |
528 | 32 | ['fluiddb-user', None, 'fluiddb', "The system user's name."], | 32 | ['fluidinfo-user', None, 'fluidinfo', "The system user's name."], |
529 | 33 | ['fluiddb-password', None, None, "The system user's password."], | 33 | ['fluidinfo-password', None, None, "The system user's password."], |
530 | 34 | ] | 34 | ] |
531 | 35 | 35 | ||
532 | 36 | 36 | ||
533 | 37 | 37 | ||
534 | === modified file 'tickery/www/about.py' | |||
535 | --- tickery/www/about.py 2011-06-16 16:10:07 +0000 | |||
536 | +++ tickery/www/about.py 2011-06-16 17:39:31 +0000 | |||
537 | @@ -34,27 +34,27 @@ | |||
538 | 34 | 34 | ||
539 | 35 | But there's a more important reason why we built Tickery: to | 35 | But there's a more important reason why we built Tickery: to |
540 | 36 | illustrate the flexibility and potential of | 36 | illustrate the flexibility and potential of |
542 | 37 | <a href=\"http://fluidinfo.com/fluiddb\">FluidDB</a>, | 37 | <a href=\"http://fluidinfo.com/fluiddb\">Fluidinfo</a>, |
543 | 38 | the underlying database. | 38 | the underlying database. |
544 | 39 | 39 | ||
545 | 40 | </p> | 40 | </p> |
546 | 41 | 41 | ||
547 | 42 | <p> | 42 | <p> |
548 | 43 | 43 | ||
550 | 44 | FluidDB is quite different from traditional databases. What distinguishes | 44 | Fluidinfo is quite different from traditional databases. What distinguishes |
551 | 45 | it most is its open approach to information control: anyone, or any | 45 | it most is its open approach to information control: anyone, or any |
552 | 46 | application, is always permitted to add information to any object in | 46 | application, is always permitted to add information to any object in |
554 | 47 | FluidDB. | 47 | Fluidinfo. |
555 | 48 | 48 | ||
556 | 49 | </p> | 49 | </p> |
557 | 50 | 50 | ||
558 | 51 | <p> | 51 | <p> |
559 | 52 | 52 | ||
561 | 53 | This means that <em>Tickery is completely open.</em> The FluidDB objects | 53 | This means that <em>Tickery is completely open.</em> The Fluidinfo objects |
562 | 54 | that Tickery uses to hold information about Twitter users are yours to play | 54 | that Tickery uses to hold information about Twitter users are yours to play |
563 | 55 | with too. You can contribute additional information about Twitter users, | 55 | with too. You can contribute additional information about Twitter users, |
564 | 56 | and can query on it (using the advanced tab). You can also build your own | 56 | and can query on it (using the advanced tab). You can also build your own |
566 | 57 | applications that use FluidDB, exactly as Tickery does. Those applications | 57 | applications that use Fluidinfo, exactly as Tickery does. Those applications |
567 | 58 | can search using the tags that Tickery has added, or on anything that you | 58 | can search using the tags that Tickery has added, or on anything that you |
568 | 59 | or others might add. | 59 | or others might add. |
569 | 60 | 60 | ||
570 | @@ -63,9 +63,9 @@ | |||
571 | 63 | <p> | 63 | <p> |
572 | 64 | 64 | ||
573 | 65 | 65 | ||
575 | 66 | With FluidDB, no one—not even you—has to anticipate your future | 66 | With Fluidinfo, no one—not even you—has to anticipate your future |
576 | 67 | needs, and you never have to ask for permission to add new information. To | 67 | needs, and you never have to ask for permission to add new information. To |
578 | 68 | complement this openness at the highest-level, FluidDB has an underlying | 68 | complement this openness at the highest-level, Fluidinfo has an underlying |
579 | 69 | identity and permissions system that ensures existing data can only be | 69 | identity and permissions system that ensures existing data can only be |
580 | 70 | accessed by the people and applications you choose. | 70 | accessed by the people and applications you choose. |
581 | 71 | 71 | ||
582 | @@ -74,49 +74,49 @@ | |||
583 | 74 | <p> | 74 | <p> |
584 | 75 | 75 | ||
585 | 76 | At Fluidinfo, we believe it will one day be <em>much</em> easier to work | 76 | At Fluidinfo, we believe it will one day be <em>much</em> easier to work |
587 | 77 | with information. We've built FluidDB to show you what we think the future | 77 | with information. We've built Fluidinfo to show you what we think the future |
588 | 78 | will look like. It's a future in which we'll work with information in more | 78 | will look like. It's a future in which we'll work with information in more |
589 | 79 | flexible ways, and with data that is | 79 | flexible ways, and with data that is |
591 | 80 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/24/\ | 80 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/24/\ |
592 | 81 | truly-social-data/\">truly social</a>. | 81 | truly-social-data/\">truly social</a>. |
593 | 82 | 82 | ||
594 | 83 | </p> | 83 | </p> |
595 | 84 | 84 | ||
596 | 85 | <h3>Next</h3> | 85 | <h3>Next</h3> |
597 | 86 | 86 | ||
599 | 87 | For details on how Tickery uses FluidDB to hold information on Twitter | 87 | For details on how Tickery uses Fluidinfo to hold information on Twitter |
600 | 88 | users, read the help popup on the Advanced tab. To learn more about how | 88 | users, read the help popup on the Advanced tab. To learn more about how |
602 | 89 | FluidDB works, a good starting place is the <a | 89 | Fluidinfo works, a good starting place is the <a |
603 | 90 | href=\"http://doc.fluidinfo.com/fluidDB/\">high-level description</a>. | 90 | href=\"http://doc.fluidinfo.com/fluidDB/\">high-level description</a>. |
604 | 91 | 91 | ||
605 | 92 | To learn more about how we think about information, and what we're aiming | 92 | To learn more about how we think about information, and what we're aiming |
609 | 93 | at with FluidDB, have a look at the <a | 93 | at with Fluidinfo, have a look at the <a |
610 | 94 | href=\"http://blogs.fluidinfo.com/fluidDB\">FluidDB blog</a>. In particular, | 94 | href=\"http://blogs.fluidinfo.com/fluidinfo\">Fluidinfo blog</a>. In |
611 | 95 | the following articles provide a good set of viewpoints: | 95 | particular, following articles provide a good set of viewpoints: |
612 | 96 | 96 | ||
614 | 97 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/24/\ | 97 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/24/\ |
615 | 98 | truly-social-data/\">Truly Social Data</a>, | 98 | truly-social-data/\">Truly Social Data</a>, |
619 | 99 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/25/\ | 99 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/25/\ |
620 | 100 | kaleidoscope-10-takes-on-fluiddb/\">Kaleidoscope: 10 Takes on FluidDB</a>, | 100 | kaleidoscope-10-takes-on-fluiddb/\">Kaleidoscope: 10 Takes on Fluidinfo</a>, |
621 | 101 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/28/\ | 101 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/28/\ |
622 | 102 | information-naturally/\">Information. Naturally.</a>, | 102 | information-naturally/\">Information. Naturally.</a>, |
625 | 103 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/10/03/\ | 103 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/10/03/\ |
626 | 104 | fluiddb-as-a-universal-metadata-engine/\">FluidDB as a Universal Metadata | 104 | fluiddb-as-a-universal-metadata-engine/\">Fluidinfo as a Universal Metadata |
627 | 105 | Engine</a>, | 105 | Engine</a>, |
629 | 106 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/11/12/\ | 106 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/11/12/\ |
630 | 107 | why-are-post-it-notes-sticky/\">Why are Post-It Notes Sticky?</a>, | 107 | why-are-post-it-notes-sticky/\">Why are Post-It Notes Sticky?</a>, |
631 | 108 | and | 108 | and |
633 | 109 | <a href=\"http://blogs.fluidinfo.com/fluidDB/2009/12/01/\ | 109 | <a href=\"http://blogs.fluidinfo.com/fluidinfo/2009/12/01/\ |
634 | 110 | putting-metadata-onto-tweets-with-fluiddb/\">Putting Metadata onto Tweets | 110 | putting-metadata-onto-tweets-with-fluiddb/\">Putting Metadata onto Tweets |
636 | 111 | with FluidDB</a>. | 111 | with Fluidinfo</a>. |
637 | 112 | 112 | ||
638 | 113 | <p> | 113 | <p> |
639 | 114 | 114 | ||
642 | 115 | If you'd like to use the FluidDB API, please <a | 115 | If you'd like to use the Fluidinfo API, please <a |
643 | 116 | href=\"http://fluidinfo.com/accounts/new\">reserve a FluidDB username</a> | 116 | href=\"http://fluidinfo.com/accounts/new\">reserve a Fluidinfo username</a> |
644 | 117 | and then <a href=\"mailto:api@fluidinfo.com\">send us mail</a> to get a | 117 | and then <a href=\"mailto:api@fluidinfo.com\">send us mail</a> to get a |
647 | 118 | password. Note that FluidDB is still in an early <a | 118 | password. Note that Fluidinfo is still in an early <a |
648 | 119 | href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/17/\ | 119 | href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/17/\ |
649 | 120 | a-private-alpha-launch/\">private alpha</a> phase. | 120 | a-private-alpha-launch/\">private alpha</a> phase. |
650 | 121 | 121 | ||
651 | 122 | </p> | 122 | </p> |
652 | 123 | 123 | ||
653 | === modified file 'tickery/www/advanced.py' | |||
654 | --- tickery/www/advanced.py 2011-06-16 16:10:07 +0000 | |||
655 | +++ tickery/www/advanced.py 2011-06-16 17:39:31 +0000 | |||
656 | @@ -19,34 +19,34 @@ | |||
657 | 19 | from pyjamas.ui.HTML import HTML | 19 | from pyjamas.ui.HTML import HTML |
658 | 20 | 20 | ||
659 | 21 | _instructions = """ | 21 | _instructions = """ |
661 | 22 | <h3 class=\"huh-h3\">Exposing FluidDB</h3> | 22 | <h3 class=\"huh-h3\">Exposing Fluidinfo</h3> |
662 | 23 | 23 | ||
663 | 24 | <p> | 24 | <p> |
664 | 25 | 25 | ||
665 | 26 | Tickery stores information on Twitter users in | 26 | Tickery stores information on Twitter users in |
667 | 27 | <a href=\"http://fluidinfo.com/fluiddb\">FluidDB</a>. | 27 | <a href=\"http://fluidinfo.com/fluiddb\">Fluidinfo</a>. |
668 | 28 | 28 | ||
669 | 29 | The simple and intermediate tabs just provide convenient—but also | 29 | The simple and intermediate tabs just provide convenient—but also |
671 | 30 | constrained—query interfaces to FluidDB. The advanced tab takes the | 30 | constrained—query interfaces to Fluidinfo. The advanced tab takes the |
672 | 31 | gloves off, letting you interact with <a | 31 | gloves off, letting you interact with <a |
674 | 32 | href=\"http://fluidinfo.com/fluiddb\">FluidDB</a> using its native query | 32 | href=\"http://fluidinfo.com/fluiddb\">Fluidinfo</a> using its native query |
675 | 33 | language. Though the native query language is a little more verbose, there | 33 | language. Though the native query language is a little more verbose, there |
676 | 34 | are <span class=\"instructions-em\">many</span> interesting possibilities | 34 | are <span class=\"instructions-em\">many</span> interesting possibilities |
677 | 35 | when you can search on anything you like. | 35 | when you can search on anything you like. |
678 | 36 | 36 | ||
679 | 37 | </p><p> | 37 | </p><p> |
680 | 38 | 38 | ||
683 | 39 | Why FluidDB and not just a traditional database? Part of the answer is that | 39 | Why Fluidinfo and not just a traditional database? Part of the answer is that |
684 | 40 | FluidDB allows anyone to add new data. You can query on that too, right | 40 | Fluidinfo allows anyone to add new data. You can query on that too, right |
685 | 41 | here on the advanced tab. | 41 | here on the advanced tab. |
686 | 42 | 42 | ||
687 | 43 | </p> | 43 | </p> |
688 | 44 | 44 | ||
690 | 45 | <h3 class=\"huh-h3\">The FluidDB query language</h3> | 45 | <h3 class=\"huh-h3\">The Fluidinfo query language</h3> |
691 | 46 | 46 | ||
692 | 47 | <p> | 47 | <p> |
693 | 48 | 48 | ||
695 | 49 | FluidDB stores a tagged object for each Twitter user that Tickery knows | 49 | Fluidinfo stores a tagged object for each Twitter user that Tickery knows |
696 | 50 | about. The query language is designed to match objects based on the | 50 | about. The query language is designed to match objects based on the |
697 | 51 | presence of tags, and their values. Let's first see what happens behind | 51 | presence of tags, and their values. Let's first see what happens behind |
698 | 52 | the scenes on the simple and intermediate tabs. | 52 | the scenes on the simple and intermediate tabs. |
699 | @@ -61,23 +61,23 @@ | |||
700 | 61 | %(friends)s/%(simpleUser2)s\">has %(friends)s/%(simpleUser1)s and \ | 61 | %(friends)s/%(simpleUser2)s\">has %(friends)s/%(simpleUser1)s and \ |
701 | 62 | has %(friends)s/%(simpleUser2)s</a> | 62 | has %(friends)s/%(simpleUser2)s</a> |
702 | 63 | 63 | ||
704 | 64 | being sent to FluidDB. I.e., Tickery asks FluidDB for all objects that have | 64 | being sent to Fluidinfo. I.e., Tickery asks Fluidinfo for all objects that have |
705 | 65 | a <span class=\"example\">%(friends)s/%(simpleUser1)s</span> tag and also a | 65 | a <span class=\"example\">%(friends)s/%(simpleUser1)s</span> tag and also a |
706 | 66 | <span class=\"example\">%(friends)s/%(simpleUser2)s</span> tag. | 66 | <span class=\"example\">%(friends)s/%(simpleUser2)s</span> tag. |
707 | 67 | 67 | ||
708 | 68 | </p><p> | 68 | </p><p> |
709 | 69 | 69 | ||
711 | 70 | On the intermediate tab, queries are also translated directly into FluidDB | 70 | On the intermediate tab, queries are also translated directly into Fluidinfo |
712 | 71 | queries. For example, the query | 71 | queries. For example, the query |
713 | 72 | 72 | ||
714 | 73 | <a href=\"%(intq)sbiz+except+ev\">biz except ev</a> | 73 | <a href=\"%(intq)sbiz+except+ev\">biz except ev</a> |
715 | 74 | 74 | ||
717 | 75 | results in the FluidDB query: | 75 | results in the Fluidinfo query: |
718 | 76 | 76 | ||
719 | 77 | <a href=\"%(advancedq)shas+%(friends)s/biz+except+has+%(friends)s/ev\">\ | 77 | <a href=\"%(advancedq)shas+%(friends)s/biz+except+has+%(friends)s/ev\">\ |
720 | 78 | has %(friends)s/biz except has %(friends)s/ev</a>. | 78 | has %(friends)s/biz except has %(friends)s/ev</a>. |
721 | 79 | 79 | ||
723 | 80 | That is, Tickery asks FluidDB for all objects that have a | 80 | That is, Tickery asks Fluidinfo for all objects that have a |
724 | 81 | <span class=\"example\">%(friends)s/biz</span> | 81 | <span class=\"example\">%(friends)s/biz</span> |
725 | 82 | tag, | 82 | tag, |
726 | 83 | <span class=\"example\">except</span> | 83 | <span class=\"example\">except</span> |
727 | @@ -95,7 +95,7 @@ | |||
728 | 95 | 95 | ||
729 | 96 | <p> | 96 | <p> |
730 | 97 | 97 | ||
732 | 98 | The FluidDB objects matching the above queries all also have <span | 98 | The Fluidinfo objects matching the above queries all also have <span |
733 | 99 | class=\"example\">twitter.com/users/screen_name</span> and <span | 99 | class=\"example\">twitter.com/users/screen_name</span> and <span |
734 | 100 | class=\"example\">twitter.com/users/id</span> tags, which Tickery uses to | 100 | class=\"example\">twitter.com/users/id</span> tags, which Tickery uses to |
735 | 101 | help display its results. | 101 | help display its results. |
736 | @@ -110,7 +110,7 @@ | |||
737 | 110 | 110 | ||
738 | 111 | <a href='%(advancedq)stwitter.com/users/screen_name+=+\"%(simpleUser1)s\"'>\ | 111 | <a href='%(advancedq)stwitter.com/users/screen_name+=+\"%(simpleUser1)s\"'>\ |
739 | 112 | twitter.com/users/screen_name = \"%(simpleUser1)s\"</a>. | 112 | twitter.com/users/screen_name = \"%(simpleUser1)s\"</a>. |
741 | 113 | FluidDB has some other Twitter tags on its objects too. For example, you | 113 | Fluidinfo has some other Twitter tags on its objects too. For example, you |
742 | 114 | can query | 114 | can query |
743 | 115 | 115 | ||
744 | 116 | <a href='%(advancedq)stwitter.com/users/followers_count+>+100000'>\ | 116 | <a href='%(advancedq)stwitter.com/users/followers_count+>+100000'>\ |
745 | @@ -126,11 +126,11 @@ | |||
746 | 126 | 126 | ||
747 | 127 | </p><p> | 127 | </p><p> |
748 | 128 | 128 | ||
750 | 129 | Because FluidDB objects can be added to by anyone, we can query on tags | 129 | Because Fluidinfo objects can be added to by anyone, we can query on tags |
751 | 130 | that were added by other people and that have nothing to do with | 130 | that were added by other people and that have nothing to do with |
753 | 131 | Twitter. For example, my user name in both FluidDB and Twitter is <span | 131 | Twitter. For example, my user name in both Fluidinfo and Twitter is <span |
754 | 132 | class=\"example\">terrycojones</span>. I've added a <span | 132 | class=\"example\">terrycojones</span>. I've added a <span |
756 | 133 | class=\"example\">terrycojones/met</span> tag to FluidDB's objects for | 133 | class=\"example\">terrycojones/met</span> tag to Fluidinfo's objects for |
757 | 134 | Twitter people that I've met in person. So the query | 134 | Twitter people that I've met in person. So the query |
758 | 135 | 135 | ||
759 | 136 | <a href='%(advancedq)shas+%(friends)s/terrycojones+and+has+terrycojones/met'>\ | 136 | <a href='%(advancedq)shas+%(friends)s/terrycojones+and+has+terrycojones/met'>\ |
760 | @@ -148,7 +148,7 @@ | |||
761 | 148 | 148 | ||
762 | 149 | The possibilities here are literally endless. They get interesting | 149 | The possibilities here are literally endless. They get interesting |
763 | 150 | rapidly, even with just a couple of extra tags in the mix. For example, | 150 | rapidly, even with just a couple of extra tags in the mix. For example, |
765 | 151 | the other FluidDB programmer, Esteve, has also added <span | 151 | the other Fluidinfo programmer, Esteve, has also added <span |
766 | 152 | class=\"example\">esteve/met</span> tags to the people he follows and has | 152 | class=\"example\">esteve/met</span> tags to the people he follows and has |
767 | 153 | met. The query | 153 | met. The query |
768 | 154 | 154 | ||
769 | @@ -168,7 +168,7 @@ | |||
770 | 168 | should introduce each other to. Imagine the additional richness we could | 168 | should introduce each other to. Imagine the additional richness we could |
771 | 169 | extract from Twitter if someone wrote e.g., a Firefox extension that simply | 169 | extract from Twitter if someone wrote e.g., a Firefox extension that simply |
772 | 170 | let you click to indicate which of the people you follow you've also met. | 170 | let you click to indicate which of the people you follow you've also met. |
774 | 171 | And that's just one additional tag in FluidDB. It's easy to dream up many | 171 | And that's just one additional tag in Fluidinfo. It's easy to dream up many |
775 | 172 | others. | 172 | others. |
776 | 173 | 173 | ||
777 | 174 | </p> | 174 | </p> |
778 | @@ -179,14 +179,14 @@ | |||
779 | 179 | 179 | ||
780 | 180 | The best part of all this is that you can play too. | 180 | The best part of all this is that you can play too. |
781 | 181 | 181 | ||
785 | 182 | The most important thing to understand about the underlying FluidDB objects | 182 | The most important thing to understand about the underlying Fluidinfo |
786 | 183 | is that while their tags have owners and permissions, the objects | 183 | objects is that while their tags have owners and permissions, the objects |
787 | 184 | themselves do not. So you can use the FluidDB API | 184 | themselves do not. So you can use the Fluidinfo API |
788 | 185 | 185 | ||
789 | 186 | (<a href=\"http://doc.fluidinfo.com/fluidDB/index.html\">description</a>, | 186 | (<a href=\"http://doc.fluidinfo.com/fluidDB/index.html\">description</a>, |
790 | 187 | <a href=\"http://doc.fluidinfo.com/fluidDB/api/index.html\">details</a>) | 187 | <a href=\"http://doc.fluidinfo.com/fluidDB/api/index.html\">details</a>) |
791 | 188 | 188 | ||
793 | 189 | to add any tags you like to FluidDB objects, <span | 189 | to add any tags you like to Fluidinfo objects, <span |
794 | 190 | class=\"instructions-em\">including the objects that Tickery has | 190 | class=\"instructions-em\">including the objects that Tickery has |
795 | 191 | tagged</span>, and you can query on them in any combination. | 191 | tagged</span>, and you can query on them in any combination. |
796 | 192 | 192 | ||
797 | @@ -194,11 +194,11 @@ | |||
798 | 194 | 194 | ||
799 | 195 | <p> | 195 | <p> |
800 | 196 | 196 | ||
803 | 197 | If you'd like to use the FluidDB API, please <a | 197 | If you'd like to use the Fluidinfo API, please <a |
804 | 198 | href=\"http://fluidinfo.com/accounts/new\">reserve a FluidDB username</a> | 198 | href=\"http://fluidinfo.com/accounts/new\">reserve a Fluidinfo username</a> |
805 | 199 | and then <a href=\"mailto:api@fluidinfo.com\">send us mail</a> to get a | 199 | and then <a href=\"mailto:api@fluidinfo.com\">send us mail</a> to get a |
808 | 200 | password. Note that FluidDB is still in an early <a | 200 | password. Note that Fluidinfo is still in an early <a |
809 | 201 | href=\"http://blogs.fluidinfo.com/fluidDB/2009/08/17/\ | 201 | href=\"http://blogs.fluidinfo.com/fluidinfo/2009/08/17/\ |
810 | 202 | a-private-alpha-launch/\">private alpha</a> phase. | 202 | a-private-alpha-launch/\">private alpha</a> phase. |
811 | 203 | 203 | ||
812 | 204 | </p> | 204 | </p> |
813 | @@ -222,8 +222,8 @@ | |||
814 | 222 | {'tw': 'twitter.com', 'fr': 'friends'}) | 222 | {'tw': 'twitter.com', 'fr': 'friends'}) |
815 | 223 | 223 | ||
816 | 224 | def __init__(self, topPanel): | 224 | def __init__(self, topPanel): |
818 | 225 | self.goButtonRemoteMethod = 'fluidDBQuery' | 225 | self.goButtonRemoteMethod = 'fluidinfoQuery' |
819 | 226 | self.instructions = HTML(_instructions) | 226 | self.instructions = HTML(_instructions) |
821 | 227 | self.instructionsTitle = ('The FluidDB query language ' | 227 | self.instructionsTitle = ('The Fluidinfo query language ' |
822 | 228 | '& the advanced tab') | 228 | '& the advanced tab') |
823 | 229 | LargeQueryTab.__init__(self, topPanel) | 229 | LargeQueryTab.__init__(self, topPanel) |
824 | 230 | 230 | ||
825 | === modified file 'tickery/www/banner.py' | |||
826 | --- tickery/www/banner.py 2011-06-16 16:10:07 +0000 | |||
827 | +++ tickery/www/banner.py 2011-06-16 17:39:31 +0000 | |||
828 | @@ -29,7 +29,7 @@ | |||
829 | 29 | self.add(Image('tickery.png', StyleName='banner-image')) | 29 | self.add(Image('tickery.png', StyleName='banner-image')) |
830 | 30 | strapline = HTML( | 30 | strapline = HTML( |
831 | 31 | '''Explore <a href="http://twitter.com">Twitter</a> with | 31 | '''Explore <a href="http://twitter.com">Twitter</a> with |
833 | 32 | <a href="http://fluidinfo.com/fluiddb">FluidDB</a>''', | 32 | <a href="http://fluidinfo.com">Fluidinfo</a>''', |
834 | 33 | StyleName='strapline') | 33 | StyleName='strapline') |
835 | 34 | self.add(strapline) | 34 | self.add(strapline) |
836 | 35 | 35 | ||
837 | 36 | 36 | ||
838 | === modified file 'tickery/www/defaults.py' | |||
839 | --- tickery/www/defaults.py 2011-06-16 16:10:07 +0000 | |||
840 | +++ tickery/www/defaults.py 2011-06-16 17:39:31 +0000 | |||
841 | @@ -25,7 +25,7 @@ | |||
842 | 25 | 25 | ||
843 | 26 | OAUTH_COOKIE = 'tickery-oauth' | 26 | OAUTH_COOKIE = 'tickery-oauth' |
844 | 27 | 27 | ||
846 | 28 | TWITTER_PASSWORD_VAR = 'FLUIDDB_TWITTER_PASSWORD' | 28 | TWITTER_PASSWORD_VAR = 'FLUIDINFO_TWITTER_PASSWORD' |
847 | 29 | TWITTER_USERNAME = u'twitter.com' | 29 | TWITTER_USERNAME = u'twitter.com' |
848 | 30 | TWITTER_NAME = u'Twitter Inc.' | 30 | TWITTER_NAME = u'Twitter Inc.' |
849 | 31 | TWITTER_EMAIL = u'info@fluidinfo.com' | 31 | TWITTER_EMAIL = u'info@fluidinfo.com' |
850 | @@ -45,7 +45,7 @@ | |||
851 | 45 | TWITTER_N_STATUSES_TAG_NAME = u'statuses_count' | 45 | TWITTER_N_STATUSES_TAG_NAME = u'statuses_count' |
852 | 46 | # TWITTER_LOCATION_TAG_NAME = u'location' | 46 | # TWITTER_LOCATION_TAG_NAME = u'location' |
853 | 47 | 47 | ||
855 | 48 | FLUIDDB_ENDPOINT = 'http://fluiddb.fluidinfo.com/' | 48 | FLUIDINFO_ENDPOINT = 'http://fluiddb.fluidinfo.com/' |
856 | 49 | SANDBOX_ENDPOINT = 'http://sandbox.fluidinfo.com/' | 49 | SANDBOX_ENDPOINT = 'http://sandbox.fluidinfo.com/' |
857 | 50 | LOCAL_ENDPOINT = 'http://localhost:8080/' | 50 | LOCAL_ENDPOINT = 'http://localhost:8080/' |
858 | 51 | 51 | ||
859 | 52 | 52 | ||
860 | === modified file 'tickery/www/public/index.html' | |||
861 | --- tickery/www/public/index.html 2010-07-20 09:47:02 +0000 | |||
862 | +++ tickery/www/public/index.html 2011-06-16 17:39:31 +0000 | |||
863 | @@ -2,7 +2,7 @@ | |||
864 | 2 | <head> | 2 | <head> |
865 | 3 | <meta name="pygwt:module" content="index"> | 3 | <meta name="pygwt:module" content="index"> |
866 | 4 | <link rel="stylesheet" href="index.css"> | 4 | <link rel="stylesheet" href="index.css"> |
868 | 5 | <title>Tickery - Explore Twitter with FluidDB</title> | 5 | <title>Tickery - Explore Twitter with Fluidinfo</title> |
869 | 6 | </head> | 6 | </head> |
870 | 7 | <body bgcolor="white"> | 7 | <body bgcolor="white"> |
871 | 8 | <script language="javascript" src="bootstrap.js"></script> | 8 | <script language="javascript" src="bootstrap.js"></script> |
872 | 9 | 9 | ||
873 | === modified file 'tickery/www/results.py' | |||
874 | --- tickery/www/results.py 2011-06-16 16:10:07 +0000 | |||
875 | +++ tickery/www/results.py 2011-06-16 17:39:31 +0000 | |||
876 | @@ -59,7 +59,7 @@ | |||
877 | 59 | objectIds = objectIds[:5] | 59 | objectIds = objectIds[:5] |
878 | 60 | else: | 60 | else: |
879 | 61 | plural1, plural2 = '', 'es' | 61 | plural1, plural2 = '', 'es' |
881 | 62 | title = '%s FluidDB object id%s match%s%s' % ( | 62 | title = '%s Fluidinfo object id%s match%s%s' % ( |
882 | 63 | nObjectIds, plural1, plural2, showing) | 63 | nObjectIds, plural1, plural2, showing) |
883 | 64 | text = '<br/>'.join(objectIds) | 64 | text = '<br/>'.join(objectIds) |
884 | 65 | self.sender.results.add(HTML( | 65 | self.sender.results.add(HTML( |
885 | 66 | 66 | ||
886 | === modified file 'tickery/www/server.py' | |||
887 | --- tickery/www/server.py 2010-07-20 09:47:02 +0000 | |||
888 | +++ tickery/www/server.py 2011-06-16 17:39:31 +0000 | |||
889 | @@ -19,5 +19,5 @@ | |||
890 | 19 | def __init__(self): | 19 | def __init__(self): |
891 | 20 | JSONProxy.__init__(self, '/tickery', | 20 | JSONProxy.__init__(self, '/tickery', |
892 | 21 | ['nUsers', 'spideredScreennames', 'friendOf', 'intermediateQuery', | 21 | ['nUsers', 'spideredScreennames', 'friendOf', 'intermediateQuery', |
894 | 22 | 'fluidDBQuery', 'simpleTweet', 'tweet', 'login', 'logout', | 22 | 'fluidinfoQuery', 'simpleTweet', 'tweet', 'login', 'logout', |
895 | 23 | 'screenameFromCookie', 'friendsIds', 'follow', 'unfollow']) | 23 | 'screenameFromCookie', 'friendsIds', 'follow', 'unfollow']) |
896 | 24 | 24 | ||
897 | === modified file 'tickery/www/tickerytab.py' | |||
898 | --- tickery/www/tickerytab.py 2011-06-16 16:10:07 +0000 | |||
899 | +++ tickery/www/tickerytab.py 2011-06-16 17:39:31 +0000 | |||
900 | @@ -56,7 +56,7 @@ | |||
901 | 56 | """Explore sets of Twitter friends by querying on their user names""", | 56 | """Explore sets of Twitter friends by querying on their user names""", |
902 | 57 | 57 | ||
903 | 58 | 'advanced': | 58 | 'advanced': |
905 | 59 | """Query Twitter friends & more with the full FluidDB query language""", | 59 | """Query Twitter friends & more with the full Fluidinfo query language""", |
906 | 60 | } | 60 | } |
907 | 61 | 61 | ||
908 | 62 | HELP_TEXT = 'huh?' | 62 | HELP_TEXT = 'huh?' |
LGTM!