diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..5417ab2 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,28 @@ +# .coveragerc to control coverage.py +[run] +branch = True +source=myql + +[report] +# Regexes for lines to exclude from consideration +exclude_lines = + # Have to re-enable the standard pragma + pragma: no cover + + # Don't complain about missing debug-only code: + def __repr__ + if self\.debug + + # Don't complain if tests don't hit defensive assertion code: + raise AssertionError + raise NotImplementedError + + # Don't complain if non-runnable code isn't run: + if 0: + if __name__ == .__main__.: + +ignore_errors = True + +[html] +directory = htmlcov + diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index 25dfc84..49b33e8 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,7 @@ coverage.xml # Sphinx documentation docs/_build/ +myconfig.py +*.xml +site +*.json diff --git a/.travis.yml b/.travis.yml index c15d94b..40c424c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,23 @@ +sudo: false language: python python: - - "2.7" - -install: - - pip install -r requirements.txt --use-mirrors - + - '2.7' + - '3.3' + - '3.4' + - '3.5' + - pypy + - pypy3 +install: + - pip install -r requirements.txt + - pip install coverage coveralls pytest +script: + - coverage run --source=myql -m pytest -v tests/tests.py +env: + global: + secure: hXpkZqclyUXMX586jS4BtJmYsrszVr/jWbMiLWLOZ2z7n5LK9INziKkOqYu0JTBskAHVEmhxJ7oNOD9gI/06btLO5NLBONN3qtsHq4UruCo0Zlx2BgaDfR5FqnrVqk+fMbLCbzWgo0wShM4o8jTGy7l22xqhhYAsuubmayqEfPk= +before_install: +- openssl aes-256-cbc -K $encrypted_60f42691f4f2_key -iv $encrypted_60f42691f4f2_iv + -in credentials.json.enc -out credentials.json -d +after_success: + - coverage report -m + - coveralls diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 index d7f1051..c304a72 --- a/LICENSE +++ b/LICENSE @@ -1,339 +1,22 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +The MIT License (MIT) - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +Copyright (c) 2015 josuebrunel - Preamble +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..8e5e8a9 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include requirements.txt +include README.rst diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 30174c8..32a6e96 --- a/README.md +++ b/README.md @@ -1,9 +1,20 @@ -lokingYQL +[mYQL](http://myql.readthedocs.org/en/latest/) ========= -LokingYQL is a Python wrapper of the Yahoo Query Language. +[![Build Status](https://travis-ci.org/josuebrunel/myql.svg?branch=master)](https://travis-ci.org/josuebrunel/myql) [![Documentation Status](https://readthedocs.org/projects/myql/badge/?version=latest)](https://myql.readthedocs.org) +[![Code Health](https://landscape.io/github/josuebrunel/myql/master/landscape.svg?style=flat)](https://landscape.io/github/josuebrunel/myql/master) +[![PyPI](https://img.shields.io/pypi/status/myql.svg?style=flat)](https://pypi.python.org/pypi/myql) +[![PyPI](https://img.shields.io/pypi/v/myql.svg?style=flat)](https://pypi.python.org/pypi/myql) +[![PyPI](https://img.shields.io/pypi/dm/myql.svg?style=flat)](https://pypi.python.org/pypi/myql) +[![PyPI](https://img.shields.io/pypi/pyversions/myql.svg)](https://pypi.python.org/pypi/myql) +[![PyPI](https://img.shields.io/pypi/implementation/myql.svg?style=flat)](https://pypi.python.org/pypi/myql) +[![Coverage Status](https://coveralls.io/repos/josuebrunel/myql/badge.svg?branch=testing)](https://coveralls.io/r/josuebrunel/myql?branch=master) +[![PyPI](https://img.shields.io/pypi/l/myql.svg?style=flat)](https://pypi.python.org/pypi/myql) -Yahoo! Query Langauge Documentation and Support + +mYQL is a Python wrapper of the Yahoo Query Language. + +Yahoo! Query Language Documentation and Support =============================================== * Yahoo! Query Language - http://developer.yahoo.com/yql/ @@ -12,78 +23,154 @@ Yahoo! Query Langauge Documentation and Support * Yahoo! Social APIs - http://developer.yahoo.com/social/ * Yahoo! QUery Language Console https://developer.yahoo.com/yql/console/ -version 1.0 -=========== - -* Access to resources requiring authentication - -version 0.5.6 -============= -* fetch data -* access to community data -* select data format (xml/json) -* change data source -* filter data +### Features -fixes: ------- -* fix handling of default and on the fly response format -* fix limit on ***select(...).where(...)*** when no limit value is passed -* fix limit on ***get(...)*** +* Simple YQL Query +* Authenticated YQL Query ( OAuth ) +* StockScraper +* YQL Open Table (Classes and Metaclasses) Generator +* Response prettyfier -installation +Installation ============ ```shell -$ python setup.py install -``` - -how to use -========== - -```python ->>> import lokingyql ->>> yql = lokingyql.LokingYQL() ->>> yql.diagnostics = True # To turn diagnostics on +$ pip install myql ``` -access to community tables --------------------------- +Quick Start +=========== -```python ->>> yql = lokingyql.LokingYQL() ->>> rep = yql.rawQuery('desc yahoo.finance.quotes ') ->>> rep.json() -{u'error': {u'lang': u'en-US', u'description': u'No definition found for Table yahoo.finance.quotes'}} ->>> yql.community= True # Setting up access to community ->>> rep = yql.rawQuery('desc yahoo.finance.quotes ') ->>> rep.json() -{u'query': {u'count': 1, u'lang': u'en-US', u'results': {u'table': {u'src': u'http://www.datatables.org/yahoo/finance/yahoo.finance.quotes.xml', u'hash': u'061616a1c033ae89aaf2cbe83790b979', u'name': u'yahoo.finance.quotes', u'request': {u'select': {u'key': {u'required': u'true', u'type': u'xs:string', u'name': u'symbol'}}}, u'meta': {u'sampleQuery': u'\n\t\t\tselect * from yahoo.finance.quotes where symbol in ("YHOO","AAPL","GOOG","MSFT")\n\t\t'}, u'security': u'ANY'}}, u'created': u'2014-08-24T11:26:48Z'}} ->>> -``` +It's important to know that **response** is a just **requests.models.Response** object. +Yes indeed, ***mYQL*** uses ***requests*** :smile: -***OR*** +By default, you have access to the **community tables**. If for whatsoever reason you would like to not have access to those tables ```python ->>> import lokingyql ->>> yql = lokingyql.LokingYQL(community=True) ->>> # do your magic +>>> import myql +>>> yql = myql.MYQL(community=False) ``` -changing response format (xml or json) --------------------------------------- +####Changing response format (xml or json) The response format is by default ***json***. ```python ->>> import lokingyql ->>> yql = lokingyql.LokingYQL(format='xml', community=True) ->>> rep = yql.rawQuery('select name, woeid from geo.states where place="Congo"') ->>> rep.text -u'\nCuvette-Ouest Department55998384Cuvette Department2344968Plateaux District2344973Sangha2344974Lekoumou2344970Pool Department2344975Likouala Department2344971Niari Department2344972Brazzaville2344976Bouenza Department2344967Kouilou2344969\n\n' ->>> rep = yql.rawQuery('select name, woeid from geo.states where place="Congo"', format='json') ->>> rep.json() -{u'query': {u'count': 11, u'lang': u'en-US', u'results': {u'place': [{u'woeid': u'55998384', u'name': u'Cuvette-Ouest Department'}, {u'woeid': u'2344968', u'name': u'Cuvette Department'}, {u'woeid': u'2344973', u'name': u'Plateaux District'}, {u'woeid': u'2344974', u'name': u'Sangha'}, {u'woeid': u'2344970', u'name': u'Lekoumou'}, {u'woeid': u'2344975', u'name': u'Pool Department'}, {u'woeid': u'2344971', u'name': u'Likouala Department'}, {u'woeid': u'2344972', u'name': u'Niari Department'}, {u'woeid': u'2344976', u'name': u'Brazzaville'}, {u'woeid': u'2344967', u'name': u'Bouenza Department'}, {u'woeid': u'2344969', u'name': u'Kouilou'}]}, u'created': u'2014-08-27T04:52:38Z'}} +>>> import myql +>>> from myql.utils import pretty_json, pretty_xml +>>> yql = myql.MYQL(format='xml', community=True) +>>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"') +>>> print(pretty_xml(resp.content)) + + + + + Cuvette-Ouest Department + 55998384 + + + Cuvette Department + 2344968 + + + Plateaux District + 2344973 + + + Sangha + 2344974 + + + Lekoumou + 2344970 + + + Pool Department + 2344975 + + + Likouala Department + 2344971 + + + Niari Department + 2344972 + + + Brazzaville + 2344976 + + + Bouenza Department + 2344967 + + + Kouilou + 2344969 + + + + + + +>>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"', format='json') +>>> print(pretty_json(resp.content)) +{ + "query": { + "count": 11, + "created": "2015-06-07T11:58:20Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Cuvette-Ouest Department", + "woeid": "55998384" + }, + { + "name": "Cuvette Department", + "woeid": "2344968" + }, + { + "name": "Plateaux District", + "woeid": "2344973" + }, + { + "name": "Sangha", + "woeid": "2344974" + }, + { + "name": "Lekoumou", + "woeid": "2344970" + }, + { + "name": "Pool Department", + "woeid": "2344975" + }, + { + "name": "Likouala Department", + "woeid": "2344971" + }, + { + "name": "Niari Department", + "woeid": "2344972" + }, + { + "name": "Brazzaville", + "woeid": "2344976" + }, + { + "name": "Bouenza Department", + "woeid": "2344967" + }, + { + "name": "Kouilou", + "woeid": "2344969" + } + ] + } + } +} + >>> ``` @@ -91,89 +178,298 @@ u'\n>> ``` -rawQuery(query) ----------------- +####raw_query(query) Allows you to directly type your query ```python ->>> response = yql.rawQuery("select * from geo.countries where place='North America'") +>>> response = yql.raw_query("select * from geo.countries where place='North America'") >>> # deal with the response ``` -select(table, fields, limit).where(filters, ...) ------------------------------------------------- -Select a table i.e *weather.forecast*. -If *table* not provided, it will use the default table. If there's no such thing as a default table, it will raise a *NoTableSelectedError* +####select(table, fields, limit).where(filters, ...) ***NB*** : A simple select doesn't return any data. Use ***GET*** instead. ```python ->>> response = yql.select('geo.countries', [name, code, woeid]).where(['name', '=', 'Canada']) ->>> response.json() -{u'query': {u'count': 1, u'lang': u'en-US', u'results': {u'place': {u'woeid': u'23424775', u'name': u'Canada'}}, u'created': u'2014-08-16T19:04:08Z'}} +>>> response = yql.select('geo.countries', ['name', 'code', 'woeid']).where(['name', '=', 'Canada']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-06-07T12:10:39Z", + "lang": "en-US", + "results": { + "place": { + "name": "Canada", + "woeid": "23424775" + } + } + } +} + >>> ... ->>> rep = yql.select('geo.countries', ['name', 'woeid'], 2).where(['place', '=', 'Africa']) ->>> rep.json() -{u'query': {u'count': 2, u'lang': u'en-US', u'results': {u'place': [{u'woeid': u'23424740', u'name': u'Algeria'}, {u'woeid': u'23424745', u'name': u'Angola'}]}, u'created': u'2014-08-17T10:52:49Z'}} ->>> ->>> rep = yql.select('geo.countries', ['name', 'woeid'], 2).where(['place', 'in', ('Africa', 'Europe')]) ->>> rep.json() -{u'query': {u'count': 2, u'lang': u'en-US', u'results': {u'place': [{u'woeid': u'23424740', u'name': u'Algeria'}, {u'woeid': u'23424745', u'name': u'Angola'}]}, u'created': u'2014-08-17T11:22:49Z'}} +>>> response = yql.select('geo.countries', ['name', 'woeid'], 2).where(['place', 'in', ('Africa', 'Europe')]) +>>> from myql.utils import dump +>>> dump(response) +{ + "query": { + "count": 2, + "created": "2015-06-07T12:27:04Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Algeria", + "woeid": "23424740" + }, + { + "name": "Angola", + "woeid": "23424745" + } + ] + } + } +} + >>> ``` -get(table, fields, limit) --------------------------- - +####get(table, fields, limit) Same as ***SELECT***, but instead returns data. **REMINDER** : Some tables require a **where clause**, therefore ***GET*** won't work on those tables, use *select(...).where(...)* instead . ```python ->>> yql.get('geo.countries', ['name', 'woeid'], 1) ->>> rep.json() -{u'query': {u'count': 1, u'lang': u'en-US', u'results': {u'place': {u'woeid': u'23424966', u'name': u'Sao Tome and Principe'}}, u'created': u'2014-08-17T10:32:25Z'}} +>>> from myql.utils import dump +>>> response = yql.get('geo.countries', ['name', 'woeid'], 1) +>>> dump(response) +{ + "query": { + "count": 1, + "created": "2015-06-07T12:29:01Z", + "lang": "en-US", + "results": { + "place": { + "name": "Sao Tome and Principe", + "woeid": "23424966" + } + } + } +} + >>> ``` +####insert(table, (field1, field2, ..., fieldN),(value1, value2, ..., valueN)) +Insert values into a table. Arguments 2 and 3 may be **tuples** or **list**. -create() ---------- +```python +>>> from myql.utils import pretty_json +>>> response = yql.insert('yql.storage.admin',('value',),('http://josuebrunel.org',)) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:25:56Z", + "lang": "en-US", + "results": { + "inserted": { + "execute": "store://KkkC5xDw4v32IcWWSQ4YRe", + "select": "store://Zc5LHXcmYM7XBfSbo9tzFL", + "update": "store://Rqb5fbQyDvrfHJiClWnZ6q" + } + } + } +} +``` -insert() ---------- +####update(table,[field1, ..., fieldN],[value1, ..., ...valueN]).where(filters, ...) +Update fields values. This method __is always followed by ***where()***__. Arguments 2 and 3 may be **tuples** or **list**. -update() --------- +```python +>>> from myql.utils import pretty_json +>>> response = yql.update('yql.storage',('value',),('https://josuebrunel.org',)).where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:32:52Z", + "lang": "en-US", + "results": { + "success": "Updated store://KkkC5xDw4v32IcWWSQ4YRe" + } + } +} +``` + +####delete(table).where(filters, ...) +Delete records +```python +>>> from myql.utils import pretty_json +>>> response = self.yql.delete('yql.storage').where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:38:28Z", + "lang": "en-US", + "results": { + "success": "store://Rqb5fbQyDvrfHJiClWnZ6q deleted" + } + } +} + +``` + +####Using OAuth + +***mYQL*** comes with ***[yahoo_oauth](http://yahoo-oauth.readthedocs.org/en/master/)***, which is an OAuth library for Yahoo! APIs. + +```python +>>> from yahoo_oauth import OAuth1 +>>> oauth = OAuth1(None, None, from_file='credentials.json') # only consumer_key and consumer_secret are required. +>>> from myql import MYQL +>>> yql = MYQL(format='xml', oauth=oauth) +>>> response = yql.get_guid('josue_brunel') # Deal with the response +``` + +#### Stocks Scraper + +The full documentation on ***StockScraper*** is [here](https://myql.readthedocs.org/en/latest/stockscraper/) + +#### Release Notes + + +##### 1.2.6 +----------- -delete() ---------- +* Fixed [#148](https://github.com/josuebrunel/myql/issues/148) +##### 1.2.5 +----------- +* camelCase dropped for underscore +* Support for substitution variable i.e @myvar +* Support of Remote Filters +* Support of Post Query Filters +##### 1.2.4 +----------- +* Weather module added +* StockScraper now under Finance namespace +##### 1.2.3 +----------- + +* Fixed issue related to date in StockRetriver.get_historical_info [#107](https://github.com/josuebrunel/myql/issues/107) +* Fixed issue with **IN** condition in **where** clause [#106](https://github.com/josuebrunel/myql/issues/107) +* Fix definition of raw_input for python3 [#105](https://github.com/josuebrunel/myql/issues/105) +* Yahoo-OAuth included as main oauth library [#112](https://github.com/josuebrunel/myql/issues/112) + +##### 1.2.2 +------- +* **Python3** support OK [#71](https://github.com/josuebrunel/myql/issues/71) +* **PyPy/PyPy3** support OK +* Fixed issue with **IN** condition in **where** clause +* Fixed issue when passing an empty list/tuple (**[]/()**) in a **where** clause besides first argument +* Import of ***[StockParser](https://github.com/gurch101/StockScraper)*** from Gurchet Rai OK [#68](https://github.com/josuebrunel/myql/issues/68) +* Insert, Update, Delete methods added [#67](https://github.com/josuebrunel/myql/issues/67) +* Dummy *try/except* removed from main module +* Fixed **Invalid OAuth Signature** when using a refreshed token [#64](https://github.com/josuebrunel/myql/issues/64) +* Fixed misused of ***MYQL.use(...)*** [#76](https://github.com/josuebrunel/myql/issues/76) +* Fixed format issue [#82](https://github.com/josuebrunel/myql/issues/82) +* Added useful functions in utils [#81](https://github.com/josuebrunel/myql/issues/81) +* Default access to community tables +* Response prettyfier : *pretty_json, pretty_xml* + +##### v 1.2.1 +------ +* Multiple requests while using OAuth fixed + +##### 1.2.0 +------- +* OpenTable classes +* Access to resources requiring authentication + +##### 0.5.6 +------------- +* fetch data +* access to community data +* select data format (xml/json) +* change data source +* filter data +* fix handling of default response format on the fly +* fix limit on ***select(...).where(...)*** when no limit value is passed +* fix limit on ***get(...)*** diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..54c0553 --- /dev/null +++ b/README.rst @@ -0,0 +1,532 @@ +`mYQL `__ +================================================= + +|Build Status| |Documentation Status| |Code Health| |PyPI| |PyPI| |PyPI| +|PyPI| |PyPI| |Coverage Status| |PyPI| + +mYQL is a Python wrapper of the Yahoo Query Language. + +Yahoo! Query Language Documentation and Support +=============================================== + +- Yahoo! Query Language - http://developer.yahoo.com/yql/ +- Yahoo! Developer Network: http://developer.yahoo.com +- Yahoo! Application Platform - http://developer.yahoo.com/yap/ +- Yahoo! Social APIs - http://developer.yahoo.com/social/ +- Yahoo! QUery Language Console + https://developer.yahoo.com/yql/console/ + +Features +~~~~~~~~ + +- Simple YQL Query +- Authenticated YQL Query ( OAuth ) +- StockScraper +- YQL Open Table (Classes and Metaclasses) Generator +- Response prettyfier + +Installation +============ + +.. code:: shell + + $ pip install myql + +Quick Start +=========== + +It's important to know that **response** is a just +**requests.models.Response** object. Yes indeed, ***mYQL*** uses +***requests*** :smile: + +By default, you have access to the **community tables**. If for +whatsoever reason you would like to not have access to those tables + +.. code:: python + + >>> import myql + >>> yql = myql.MYQL(community=False) + +Changing response format (xml or json) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The response format is by default ***json***. + +.. code:: python + + >>> import myql + >>> from myql.utils import pretty_json, pretty_xml + >>> yql = myql.MYQL(format='xml', community=True) + >>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"') + >>> print(pretty_xml(resp.content)) + + + + + Cuvette-Ouest Department + 55998384 + + + Cuvette Department + 2344968 + + + Plateaux District + 2344973 + + + Sangha + 2344974 + + + Lekoumou + 2344970 + + + Pool Department + 2344975 + + + Likouala Department + 2344971 + + + Niari Department + 2344972 + + + Brazzaville + 2344976 + + + Bouenza Department + 2344967 + + + Kouilou + 2344969 + + + + + + + >>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"', format='json') + >>> print(pretty_json(resp.content)) + { + "query": { + "count": 11, + "created": "2015-06-07T11:58:20Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Cuvette-Ouest Department", + "woeid": "55998384" + }, + { + "name": "Cuvette Department", + "woeid": "2344968" + }, + { + "name": "Plateaux District", + "woeid": "2344973" + }, + { + "name": "Sangha", + "woeid": "2344974" + }, + { + "name": "Lekoumou", + "woeid": "2344970" + }, + { + "name": "Pool Department", + "woeid": "2344975" + }, + { + "name": "Likouala Department", + "woeid": "2344971" + }, + { + "name": "Niari Department", + "woeid": "2344972" + }, + { + "name": "Brazzaville", + "woeid": "2344976" + }, + { + "name": "Bouenza Department", + "woeid": "2344967" + }, + { + "name": "Kouilou", + "woeid": "2344969" + } + ] + } + } + } + + >>> + +Methods +------- + +use(yql\_table\_url,name=yql\_table\_name) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Maps a table name to the URL of an Open Data Table. + +.. code:: python + + >>> yql.use('http://www.josuebrunel.org//users.xml', name='myusers') + +desc(tablename) +^^^^^^^^^^^^^^^ + +Returns table description + +.. code:: python + + >>> response = yql.desc('weather.forecast') + >>> print(pretty_json(response.content)) + { + "query": { + "count": 1, + "created": "2015-06-07T12:00:27Z", + "lang": "en-US", + "results": { + "table": { + "hash": "aae78b1462a6a8fbc748aec4cf292767", + "meta": { + "author": "Yahoo! Inc", + "description": "Weather forecast table", + "documentationURL": "http://developer.yahoo.com/weather/", + "sampleQuery": "select * from weather.forecast where woeid=2502265" + }, + "name": "weather.forecast", + "request": { + "select": [ + { + "key": [ + { + "name": "location", + "required": "true", + "type": "xs:string" + }, + { + "name": "u", + "type": "xs:string" + } + ] + }, + { + "key": [ + { + "name": "woeid", + "required": "true", + "type": "xs:string" + }, + { + "name": "u", + "type": "xs:string" + } + ] + } + ] + }, + "security": "ANY" + } + } + } + } + + >>> + +raw\_query(query) +^^^^^^^^^^^^^^^^^ + +Allows you to directly type your query + +.. code:: python + + >>> response = yql.raw_query("select * from geo.countries where place='North America'") + >>> # deal with the response + +select(table, fields, limit).where(filters, ...) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +***NB*** : A simple select doesn't return any data. Use ***GET*** +instead. + +.. code:: python + + >>> response = yql.select('geo.countries', ['name', 'code', 'woeid']).where(['name', '=', 'Canada']) + >>> print(pretty_json(response.content)) + { + "query": { + "count": 1, + "created": "2015-06-07T12:10:39Z", + "lang": "en-US", + "results": { + "place": { + "name": "Canada", + "woeid": "23424775" + } + } + } + } + + >>> ... + >>> response = yql.select('geo.countries', ['name', 'woeid'], 2).where(['place', 'in', ('Africa', 'Europe')]) + >>> from myql.utils import dump + >>> dump(response) + { + "query": { + "count": 2, + "created": "2015-06-07T12:27:04Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Algeria", + "woeid": "23424740" + }, + { + "name": "Angola", + "woeid": "23424745" + } + ] + } + } + } + + >>> + +get(table, fields, limit) +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Same as ***SELECT***, but instead returns data. + +**REMINDER** : Some tables require a **where clause**, therefore +***GET*** won't work on those tables, use *select(...).where(...)* +instead . + +.. code:: python + + >>> from myql.utils import dump + >>> response = yql.get('geo.countries', ['name', 'woeid'], 1) + >>> dump(response) + { + "query": { + "count": 1, + "created": "2015-06-07T12:29:01Z", + "lang": "en-US", + "results": { + "place": { + "name": "Sao Tome and Principe", + "woeid": "23424966" + } + } + } + } + + >>> + +insert(table, (field1, field2, ..., fieldN),(value1, value2, ..., valueN)) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Insert values into a table. Arguments 2 and 3 may be **tuples** or +**list**. + +.. code:: python + + >>> from myql.utils import pretty_json + >>> response = yql.insert('yql.storage.admin',('value',),('http://josuebrunel.org',)) + >>> print(pretty_json(response.content)) + { + "query": { + "count": 1, + "created": "2015-05-14T13:25:56Z", + "lang": "en-US", + "results": { + "inserted": { + "execute": "store://KkkC5xDw4v32IcWWSQ4YRe", + "select": "store://Zc5LHXcmYM7XBfSbo9tzFL", + "update": "store://Rqb5fbQyDvrfHJiClWnZ6q" + } + } + } + } + +update(table,[field1, ..., fieldN],[value1, ..., ...valueN]).where(filters, ...) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Update fields values. This method **is always followed by +***where()*****. Arguments 2 and 3 may be **tuples** or **list**. + +.. code:: python + + >>> from myql.utils import pretty_json + >>> response = yql.update('yql.storage',('value',),('https://josuebrunel.org',)).where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) + >>> print(pretty_json(response.content)) + { + "query": { + "count": 1, + "created": "2015-05-14T13:32:52Z", + "lang": "en-US", + "results": { + "success": "Updated store://KkkC5xDw4v32IcWWSQ4YRe" + } + } + } + +delete(table).where(filters, ...) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Delete records + +.. code:: python + + >>> from myql.utils import pretty_json + >>> response = self.yql.delete('yql.storage').where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) + >>> print(pretty_json(response.content)) + { + "query": { + "count": 1, + "created": "2015-05-14T13:38:28Z", + "lang": "en-US", + "results": { + "success": "store://Rqb5fbQyDvrfHJiClWnZ6q deleted" + } + } + } + +Using OAuth +^^^^^^^^^^^ + +***mYQL*** comes with +***`yahoo\_oauth `__***, +which is an OAuth library for Yahoo! APIs. + +.. code:: python + + >>> from yahoo_oauth import OAuth1 + >>> oauth = OAuth1(None, None, from_file='credentials.json') # only consumer_key and consumer_secret are required. + >>> from myql import MYQL + >>> yql = MYQL(format='xml', oauth=oauth) + >>> response = yql.get_guid('josue_brunel') # Deal with the response + +Stocks Scraper +^^^^^^^^^^^^^^ + +The full documentation on ***StockScraper*** is +`here `__ + +Release Notes +^^^^^^^^^^^^^ + +##### 1.2.6 +----------- + +- Fixed `#148 `__ + +##### 1.2.5 +----------- + +- camelCase dropped for underscore +- Support for substitution variable i.e @myvar +- Support of Remote Filters +- Support of Post Query Filters + +##### 1.2.4 +----------- + +- Weather module added +- StockScraper now under Finance namespace + +##### 1.2.3 +----------- + +- Fixed issue related to date in StockRetriver.get\_historical\_info + `#107 `__ +- Fixed issue with **IN** condition in **where** clause + `#106 `__ +- Fix definition of raw\_input for python3 + `#105 `__ +- Yahoo-OAuth included as main oauth library + `#112 `__ + +##### 1.2.2 +----------- + +- **Python3** support OK + `#71 `__ +- **PyPy/PyPy3** support OK +- Fixed issue with **IN** condition in **where** clause +- Fixed issue when passing an empty list/tuple (**[]/()**) in a + **where** clause besides first argument +- Import of + ***`StockParser `__*** from + Gurchet Rai OK + `#68 `__ +- Insert, Update, Delete methods added + `#67 `__ +- Dummy *try/except* removed from main module +- Fixed **Invalid OAuth Signature** when using a refreshed token + `#64 `__ +- Fixed misused of ***MYQL.use(...)*** + `#76 `__ +- Fixed format issue + `#82 `__ +- Added useful functions in utils + `#81 `__ +- Default access to community tables +- Response prettyfier : *pretty\_json, pretty\_xml* + +##### v 1.2.1 +------------- + +- Multiple requests while using OAuth fixed + +##### 1.2.0 +----------- + +- OpenTable classes +- Access to resources requiring authentication + +##### 0.5.6 +----------- + +- fetch data +- access to community data +- select data format (xml/json) +- change data source +- filter data +- fix handling of default response format on the fly +- fix limit on ***select(...).where(...)*** when no limit value is + passed +- fix limit on ***get(...)*** + +.. |Build Status| image:: https://travis-ci.org/josuebrunel/myql.svg?branch=master + :target: https://travis-ci.org/josuebrunel/myql +.. |Documentation Status| image:: https://readthedocs.org/projects/myql/badge/?version=latest + :target: https://myql.readthedocs.org +.. |Code Health| image:: https://landscape.io/github/josuebrunel/myql/master/landscape.svg?style=flat + :target: https://landscape.io/github/josuebrunel/myql/master +.. |PyPI| image:: https://img.shields.io/pypi/status/myql.svg?style=flat + :target: https://pypi.python.org/pypi/myql +.. |PyPI| image:: https://img.shields.io/pypi/v/myql.svg?style=flat + :target: https://pypi.python.org/pypi/myql +.. |PyPI| image:: https://img.shields.io/pypi/dm/myql.svg?style=flat + :target: https://pypi.python.org/pypi/myql +.. |PyPI| image:: https://img.shields.io/pypi/pyversions/myql.svg + :target: https://pypi.python.org/pypi/myql +.. |PyPI| image:: https://img.shields.io/pypi/implementation/myql.svg?style=flat + :target: https://pypi.python.org/pypi/myql +.. |Coverage Status| image:: https://coveralls.io/repos/josuebrunel/myql/badge.svg?branch=testing + :target: https://coveralls.io/r/josuebrunel/myql?branch=master +.. |PyPI| image:: https://img.shields.io/pypi/l/myql.svg?style=flat + :target: https://pypi.python.org/pypi/myql diff --git a/convert_to_rst.sh b/convert_to_rst.sh new file mode 100755 index 0000000..99b9c58 --- /dev/null +++ b/convert_to_rst.sh @@ -0,0 +1,13 @@ +################################################## +# +# Author : josuebrunel +# Filename : convert_to_rst.sh +# Description : use pandoc to convert md file to rst +# Creation Date : 10-05-2015 +# Last Modified : Thu 21 May 2015 11:17:35 AM CEST +# +################################################## + +rm -rf index.html +wget http://myql.readthedocs.org/en/latest/index.html +pandoc index.html -t rst -o README.rst diff --git a/credentials.json.enc b/credentials.json.enc new file mode 100644 index 0000000..062ed7f Binary files /dev/null and b/credentials.json.enc differ diff --git a/dev_requirements.txt b/dev_requirements.txt new file mode 100644 index 0000000..3907346 --- /dev/null +++ b/dev_requirements.txt @@ -0,0 +1,30 @@ +Jinja2>=2.8 +Markdown>=2.6.2 +MarkupSafe>=0.23 +PyYAML>=3.11 +argparse>=1.2.1 +backports.ssl-match-hostname>=3.4.0.2 +certifi>=2015.9.6.2 +click>=5.1 +coverage>=4.0 +coveralls>=1.0 +docopt>=0.6.2 +ghp-import>=0.4.1 +livereload>=2.4.0 +mccabe>=0.3.1 +mkdocs>=0.14.0 +oauthlib>=1.0.3 +pep8>=1.6.2 +pluggy>=0.3.1 +py>=1.4.30 +pyflakes>=1.0.0 +pytest>=2.8.1 +python-dateutil>=2.4.2 +rauth>=0.7.1 +requests>=2.7.0 +requests-oauthlib>=0.5.0 +six>=1.9.0 +tornado>=4.2.1 +tox>=2.1.1 +virtualenv>=13.1.2 +yahoo-oauth>=0.1.7 diff --git a/docs/contrib.md b/docs/contrib.md new file mode 100644 index 0000000..d6301c7 --- /dev/null +++ b/docs/contrib.md @@ -0,0 +1,37 @@ +##How to contribute + +It's easy to contribute to ***MYQL***. + +1. Fork the repository +2. Develop your patches/fixes/features +3. Test your changes ( > py2.6 ) +4. Submit a pull request + +That's all + +###Tips + +If you want to add a new feature to the library, you better put it in ***myql/contrib/my_awesome_feature/*** + +Let's say i want to add a **weather** module. + +```shell +$ mkdir myql/contrib/weather/ +$ vim myql/contrib/__init__.py +``` + +```python +... +import weather +``` + +```shell +$ vim myql/contrib/weather/__init__.py +from weather import my_stuff +$ vim myql/contrib/weather/weather.py +``` + +```python +from myql.myql import MYQL # If ever you want to use the module +# Your code +``` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..5d9fcab --- /dev/null +++ b/docs/index.md @@ -0,0 +1,399 @@ +mYQL +========= + +mYQL is a Python wrapper of the Yahoo Query Language. + +## Yahoo! Query Language Documentation and Support + +* [Yahoo! Query Language](http://developer.yahoo.com/yql/) +* [Yahoo! Developer Network](http://developer.yahoo.com) +* [Yahoo! Application Platform](http://developer.yahoo.com/yap/) +* [Yahoo! Social APIs](http://developer.yahoo.com/social/) +* [Yahoo! Query Language Console](https://developer.yahoo.com/yql/console/) + +Installation +============ + +```shell +$ pip install myql +``` + +Quick Start +=========== + +It's important to know that **response** is a just **requests.models.Response** object. +Yes indeed, ***mYQL*** uses ***requests*** :smile: + +By default, you have access to the **community tables**. If for whatsoever reason you would like to not have access to those tables + +```python +>>> import myql +>>> yql = myql.MYQL(community=False) +``` + +#### Response format (xml or json) + +The response format is by default ***json***. + +```python +>>> import myql +>>> from myql.utils import pretty_json, pretty_xml +>>> yql = myql.MYQL(format='xml', community=True) +>>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"') +>>> print(pretty_xml(resp.content)) + + + + + Cuvette-Ouest Department + 55998384 + + + Cuvette Department + 2344968 + + + Plateaux District + 2344973 + + + Sangha + 2344974 + + + Lekoumou + 2344970 + + + Pool Department + 2344975 + + + Likouala Department + 2344971 + + + Niari Department + 2344972 + + + Brazzaville + 2344976 + + + Bouenza Department + 2344967 + + + Kouilou + 2344969 + + + + + + +>>> resp = yql.raw_query('select name, woeid from geo.states where place="Congo"', format='json') +>>> print(pretty_json(resp.content)) +{ + "query": { + "count": 11, + "created": "2015-06-07T11:58:20Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Cuvette-Ouest Department", + "woeid": "55998384" + }, + { + "name": "Cuvette Department", + "woeid": "2344968" + }, + { + "name": "Plateaux District", + "woeid": "2344973" + }, + { + "name": "Sangha", + "woeid": "2344974" + }, + { + "name": "Lekoumou", + "woeid": "2344970" + }, + { + "name": "Pool Department", + "woeid": "2344975" + }, + { + "name": "Likouala Department", + "woeid": "2344971" + }, + { + "name": "Niari Department", + "woeid": "2344972" + }, + { + "name": "Brazzaville", + "woeid": "2344976" + }, + { + "name": "Bouenza Department", + "woeid": "2344967" + }, + { + "name": "Kouilou", + "woeid": "2344969" + } + ] + } + } +} + +>>> +``` + + +Methods +------- + +####use(yql_table_url,name=yql_table_name) +Maps a table name to the URL of an Open Data Table. + +```python +>>> yql.use('http://www.josuebrunel.org//users.xml', name='myusers') +``` + +####desc(tablename) +Returns table description + +```python +>>> response = yql.desc('weather.forecast') +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-06-07T12:00:27Z", + "lang": "en-US", + "results": { + "table": { + "hash": "aae78b1462a6a8fbc748aec4cf292767", + "meta": { + "author": "Yahoo! Inc", + "description": "Weather forecast table", + "documentationURL": "http://developer.yahoo.com/weather/", + "sampleQuery": "select * from weather.forecast where woeid=2502265" + }, + "name": "weather.forecast", + "request": { + "select": [ + { + "key": [ + { + "name": "location", + "required": "true", + "type": "xs:string" + }, + { + "name": "u", + "type": "xs:string" + } + ] + }, + { + "key": [ + { + "name": "woeid", + "required": "true", + "type": "xs:string" + }, + { + "name": "u", + "type": "xs:string" + } + ] + } + ] + }, + "security": "ANY" + } + } + } +} + +>>> +``` + +####raw_query(query) + +Allows you to directly type your query + +```python +>>> response = yql.raw_query("select * from geo.countries where place='North America'") +>>> # deal with the response +``` + + +####select(table, fields, limit, **kwargs).where(filters, ...) + +***NB*** : A simple select doesn't return any data. Use ***GET*** instead. + +```python +>>> response = yql.select('geo.countries', ['name', 'code', 'woeid']).where(['name', '=', 'Canada']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-06-07T12:10:39Z", + "lang": "en-US", + "results": { + "place": { + "name": "Canada", + "woeid": "23424775" + } + } + } +} + +>>> ... +>>> response = yql.select('geo.countries', ['name', 'woeid'], 2).where(['place', 'in', ('Africa', 'Europe')]) +>>> from myql.utils import dump +>>> dump(response) +{ + "query": { + "count": 2, + "created": "2015-06-07T12:27:04Z", + "lang": "en-US", + "results": { + "place": [ + { + "name": "Algeria", + "woeid": "23424740" + }, + { + "name": "Angola", + "woeid": "23424745" + } + ] + } + } +} + +>>> +``` + +####get(table, fields, limit, **kwargs) +Same as ***SELECT***, but instead returns data. + +**REMINDER** : Some tables require a **where clause**, therefore ***GET*** won't work on those tables, use *select(...).where(...)* instead . + +```python +>>> from myql.utils import dump +>>> response = yql.get('geo.countries', ['name', 'woeid'], 1) +>>> dump(response) +{ + "query": { + "count": 1, + "created": "2015-06-07T12:29:01Z", + "lang": "en-US", + "results": { + "place": { + "name": "Sao Tome and Principe", + "woeid": "23424966" + } + } + } +} + +>>> +``` + +####insert(table, (field1, field2, ..., fieldN),(value1, value2, ..., valueN)) +Insert values into a table. Arguments 2 and 3 may be **tuples** or **list**. + +```python +>>> from myql.utils import pretty_json +>>> response = yql.insert('yql.storage.admin',('value',),('http://josuebrunel.org',)) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:25:56Z", + "lang": "en-US", + "results": { + "inserted": { + "execute": "store://KkkC5xDw4v32IcWWSQ4YRe", + "select": "store://Zc5LHXcmYM7XBfSbo9tzFL", + "update": "store://Rqb5fbQyDvrfHJiClWnZ6q" + } + } + } +} +``` + +####update(table,[field1, ..., fieldN],[value1, ..., ...valueN]).where(filters, ...) +Update fields values. This method __is always followed by ***where()***__. Arguments 2 and 3 may be **tuples** or **list**. + +```python +>>> from myql.utils import pretty_json +>>> response = yql.update('yql.storage',('value',),('https://josuebrunel.org',)).where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:32:52Z", + "lang": "en-US", + "results": { + "success": "Updated store://KkkC5xDw4v32IcWWSQ4YRe" + } + } +} +``` + +####delete(table).where(filters, ...) +Delete records +```python +>>> from myql.utils import pretty_json +>>> response = self.yql.delete('yql.storage').where(['name','=','store://Rqb5fbQyDvrfHJiClWnZ6q']) +>>> print(pretty_json(response.content)) +{ + "query": { + "count": 1, + "created": "2015-05-14T13:38:28Z", + "lang": "en-US", + "results": { + "success": "store://Rqb5fbQyDvrfHJiClWnZ6q deleted" + } + } +} + +``` + +## Using OAuth + +***mYQL*** comes with ***[yahoo_oauth](https://pypi.python.org/pypi/myql)***, which is an OAuth library for Yahoo! APIs. + +```python +>>> from yahoo_oauth import OAuth1 +>>> oauth = OAuth1(None, None, from_file='credentials.json') # only consumer_key and consumer_secret are required. +>>> from myql import MYQL +>>> yql = MYQL(format='xml', oauth=oauth) +>>> response = yql.get_guid('josue_brunel') # Deal with the response +``` + +## Utils + +***mYQL*** comes with some useful functions, such as: + +#### *prettyty(response, format)* +    According to the format, call *pretty_json* or *pretty_xml* + +#### *pretty_json(response.content)* +    prettyfy a JSON response content + +#### *pretty_xml(response.content)* +    Prettyfy a XML response content + +#### *dump(response)* +    Print a prettyfied response diff --git a/docs/myql.md b/docs/myql.md new file mode 100644 index 0000000..3dc1ece --- /dev/null +++ b/docs/myql.md @@ -0,0 +1,208 @@ +MYQL +==== + +### **Definition** + +#### *MYQL(community=True, format='json', jsonCompact=False, crossProduct=None, debug=False, oauth=None)* + +### **Methods** + +#### *MYQL.payload_builder(query, format='json')* + +Return a dictionary of parameters + +* ***query*** : the YQL Query +* ***format*** : xml or json + +#### *MQYL.execute_query(payload)* + +Execute the query and returns and response + +* ***payload*** : Dict of parameters + + +#### *MYQL.raw_query(query, format=None, pretty=False)* + +Call *payloadBuilder* to build paramaters and *executeQuery* to execute que *query* then return a response. + +* ***query*** : the YQL Query +* ***format*** : xml or json + +#### *MQYL.use(yql_table_url, name=yql_table_name)* + + Change the service provider + +* ***url*** : url of the service provider + +```python +>>> from myql import YQL +>>> yql = YQL(format='json') +>>> yql.use('http://www.josuebrunel.org/users.xml',name='users') +>>> response = self.yql.raw_query('select * from users', format='xml') +``` + +#### *MYQL.set({key:value, ..., keyN:valueN})* + +Set variable to use in your YQL statement + +```python +>>> from myql import YQL +>>> yql = YQL() +>>> yql.set({'home':'Congo'}) +>>> states = yql.select('geo.states', remote_filter=(5,)).where(['place', '=', '@home']) +``` + +#### *MQYL.desc(table)* + +Get the description of a table. + +* ***table*** : Table name + +#### *MQYL.get(table, items=[], limit=None, **kwargs)* + +Get **items** from **table**. + +* ***table*** : Table name +* ***items*** : Element/columns to get from the table +* ***limit*** : limit of element to fetch + + +#### *MQYL.select(table, items=[], limit=None, **kwargs)* +This method is always followed by a **where**. It doesn't return a response if called alone. + +* ***table*** : Table name +* ***items*** : Element/columns to get from the table +* ***limit*** : limit of element to fetch + +```python +>>> yql.select('social.profile', ['guid', 'givenName', 'gender']) +``` + +#### *MYQL.insert(table,[field1, field2, ..., fieldN],[value1, value2, ..., valueN])* +* ***table***: Table name +* ***fields***: List or Tuple of fields +* ***values***: List or Tuple of values + +```python +>>> response = yql.insert('yql.storage.admin',('value',),('http://josuebrunel.org',)) +``` + +#### *MYQL.update(table,[field1, field2, ..., fieldN],[value1, value2, ..., valueN])* +This method is always followed by a **where**. It doesn't return a response if called alone. + +* ***table***: Table name +* ***fields***: List or Tuple of fields to update +* ***values***: List or Tuple of new values + +```python +>>> response = yql.update('yql.storage',('value',),('https://josuebrunel.org',)).where(['name','=',"store://Rqb5fbQyDvrfHJiClWnZ6q"]) +``` + +#### *MYQL.delete(table)* +This method is always followed by a **where**. It doesn t return a response if called alone. + +* ***table***: Table name + +```python +>>> response = self.yql.delete('yql.storage').where(['name','=',"store://Rqb5fbQyDvrfHJiClWnZ6q"]) +``` + +#### *MQYL.where(\*args)* + +* ***\*args*** : List of conditions + +```python +>>> yql.select('mytable.friends').where(['name', '=', 'alain'], ['location', '!=', 'paris']) +``` + +#### *MQYL.show_tables()* + +List all tables + +#### *MQYL.get_guid(username)* + +Return a user *guid* + +* ***username*** : yahoo id i.e 'josue_brunel' + + +### **Filters** + +mYQL implements 2 types of filters : + +* Remote filters +* Post Query Filters + +##### **Remote Filters** +***Remote filters*** are defined as **tuple**, such as ***()*** or ***(, )***. + +- *Python Code* : +```python +from myql import YQL +yql = YQL() +data = self.yql.get('geo.countries', remote_filter=(10,)) +``` + +- *YQL Statement* : +```sql +> SELECT * FROM geo.countries(10) ; +``` + +- *Python Code* : + +```python +data = self.yql.get('geo.countries', remote_filter=(10,20)) +``` + +- *YQL Statement* : +```sql +> SELECT * FROM geo.countries(10,20) ; +``` + + +##### **Post Query Filters** + +**Filters** or **Function** applied to the result of the ***Query***. + +- ***reverse*** +```python +func_filters = ['reverse'] +data = yql.select('geo.states', func_filters=func_filters).where(['place', '=', 'Congo']) +``` + +- ***tail*** +```python +func_filters = [('tail', 2)] +data = yql.select('geo.states', func_filters=func_filters).where(['place', '=', 'Congo']) +``` + +- ***truncate*** +```python +func_filters = [('truncate', 2)] +data = yql.select('geo.states', func_filters=func_filters).where(['place', '=', 'Congo']) +``` + +- ***unique*** +```python +func_filters = [ + {'unique': [ + ('field','content'), + ('hideRepeatCount','false') + ]}, + ('truncate', 5) +] +data = yql.get('yql.table.list', func_filters=func_filters) +``` + +- ***sort*** +```python +func_filters = [ + {'sort': [ + ('field','name'), + ('descending','true') + ]}, + ('tail', 10), + #('reverse') +] +data = yql.select('geo.counties', func_filters=func_filters).where(['place', '=', 'CA']) +``` diff --git a/docs/oauth.md b/docs/oauth.md new file mode 100644 index 0000000..8e25358 --- /dev/null +++ b/docs/oauth.md @@ -0,0 +1,19 @@ +Yahoo-OAuth +===================== + +The ***YOAuth*** module is not supported anymore. mYQL comes with + ***[Yahoo-OAuth](http://yahoo-oauth.readthedocs.org/en/master/)***. + From now on, this will be the library to use to when you want to use **OAuth**. + Nothing has really changed anyway, since *yahoo-oauth* is based on *YOAuth*. + +You can read the full documentation [here](http://yahoo-oauth.readthedocs.org/en/master/) + +```python +>>> import myql +>>> from yahoo_oauth import OAuth1 +>>> oauth = OAuth1(None, None, from_file='credentials.json') +>>> yql = myql.MYQL(format='xml',oauth=oauth) +>>> response = yql.get_guid('josue_brunel') +... +``` + diff --git a/docs/stockscraper.md b/docs/stockscraper.md new file mode 100644 index 0000000..bcf96af --- /dev/null +++ b/docs/stockscraper.md @@ -0,0 +1,586 @@ +StockScraper +============ + +***[StockScraper](https://github.com/gurch101/StockScraper)*** is a module written by **[Gurchet Rai](https://github.com/gurch101/)** and has just been imported into *mYQL*. + +Full [Documentation](http://www.gurchet-rai.net/dev/yahoo-finance-yql) + +### **Definition** + +#### *StockRetriever(format='json', debug=False, oauth=None)* + +* ***format*** : xml or json +* ***debug*** : True or False +* ***oauth*** : yahoo_oauth (OAuth1) + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +``` + +### **Methods** + +#### *StockRetriever.get_current_info(symbolList, columns=None)* + +* ***symbolList*** : List of symbol to retrieve +* ***columns*** : List of column to fetch + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_current_info(["YHOO","AAPL","GOOG"]) +``` + +```json +{ + "query": { + "count": 3, + "created": "2015-05-20T12:56:27Z", + "lang": "en-US", + "results": { + "quote": [ + { + "AfterHoursChangeRealtime": null, + "AnnualizedGain": null, + "Ask": "42.22", + "AskRealtime": null, + "AverageDailyVolume": "13763800", + "Bid": "42.20", + "BidRealtime": null, + "BookValue": "35.91", + "Change": "-3.38", + "ChangeFromFiftydayMovingAverage": "-3.03", + "ChangeFromTwoHundreddayMovingAverage": "-5.46", + "ChangeFromYearHigh": "-11.64", + "ChangeFromYearLow": "8.05", + "ChangePercentRealtime": null, + "ChangeRealtime": null, + "Change_PercentChange": "-3.38 - -7.62%", + "ChangeinPercent": "-7.62%", + "Commission": null, + "Currency": "USD", + "DaysHigh": "44.66", + "DaysLow": "39.12", + "DaysRange": "39.12 - 44.66", + "DaysRangeRealtime": null, + "DaysValueChange": null, + "DaysValueChangeRealtime": null, + "DividendPayDate": null, + "DividendShare": null, + "DividendYield": null, + "EBITDA": "598.70M", + "EPSEstimateCurrentYear": "0.78", + "EPSEstimateNextQuarter": "0.21", + "EPSEstimateNextYear": "0.79", + "EarningsShare": "7.32", + "ErrorIndicationreturnedforsymbolchangedinvalid": null, + "ExDividendDate": null, + "FiftydayMovingAverage": "44.01", + "HighLimit": null, + "HoldingsGain": null, + "HoldingsGainPercent": null, + "HoldingsGainPercentRealtime": null, + "HoldingsGainRealtime": null, + "HoldingsValue": null, + "HoldingsValueRealtime": null, + "LastTradeDate": "5/19/2015", + "LastTradePriceOnly": "40.98", + "LastTradeRealtimeWithTime": null, + "LastTradeTime": "4:00pm", + "LastTradeWithTime": "4:00pm - 40.98", + "LowLimit": null, + "MarketCapRealtime": null, + "MarketCapitalization": "38.46B", + "MoreInfo": null, + "Name": "Yahoo! Inc.", + "Notes": null, + "OneyrTargetPrice": "54.45", + "Open": "44.48", + "OrderBookRealtime": null, + "PEGRatio": "-4.24", + "PERatio": "5.60", + "PERatioRealtime": null, + "PercebtChangeFromYearHigh": "-22.12%", + "PercentChange": "-7.62%", + "PercentChangeFromFiftydayMovingAverage": "-6.89%", + "PercentChangeFromTwoHundreddayMovingAverage": "-11.75%", + "PercentChangeFromYearLow": "+24.45%", + "PreviousClose": "44.36", + "PriceBook": "1.24", + "PriceEPSEstimateCurrentYear": "52.54", + "PriceEPSEstimateNextYear": "51.22", + "PricePaid": null, + "PriceSales": "8.84", + "SharesOwned": null, + "ShortRatio": "2.10", + "StockExchange": "NMS", + "Symbol": "YHOO", + "TickerTrend": null, + "TradeDate": null, + "TwoHundreddayMovingAverage": "46.44", + "Volume": "48892169", + "YearHigh": "52.62", + "YearLow": "32.93", + "YearRange": "32.93 - 52.62", + "symbol": "YHOO" + }, + ... + ] + } + } +} +``` + +#### *StockRetriever.get_news_feed(symbol)* + +* ***symbol*** : Symbol news to retrieve + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_news_feed('YHOO') +``` + +```json +{ + "query": { + "count": 2, + "created": "2015-05-20T13:05:27Z", + "lang": "en-US", + "results": { + "item": [ + { + "description": null, + "link": "http://us.rd.yahoo.com/finance/news/rss/story/*http://finance.yahoo.com/news/video-may-20-premarket-briefing-110800770.html", + "title": "May 20 Premarket Briefing: 10 Things You Should Know" + }, + { + "description": "[at MarketWatch] - How alarmed should be about a former Fed\u2019s warning on a taper tantrum and volatility, from China to Yahoo.", + "link": "http://us.rd.yahoo.com/finance/external/cbsm/rss/SIG=11iiumket/*http://www.marketwatch.com/News/Story/Story.aspx?guid=F8AC52CC-FEAB-11E4-8608-290076337AAF&siteid=yhoof2", + "title": "Why it might pay to listen to a Fed old timer\u2019s tantrum warning" + } + ] + } + } +} +``` + +#### *StockRetriever.get_historical_info(symbol, items=None, startDate=None, endDate=None, limit=None)* + +* ***symbol*** : Symbol news to retrieve +* ***items*** : columns to retrieve +* ***startDate*** : starting date +* ***endDate*** : ending date +* ***limit*** : number of results to return + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_historical_info('YHOO',items=['Open','Close','High','Low'], limit=5,startDate='2014-09-11',endDate='2015-02-10') +``` + +```json +{ + "query": { + "count": 5, + "created": "2015-05-24T05:12:21Z", + "lang": "en-US", + "results": { + "quote": [ + { + "Close": "43.07", + "High": "43.18", + "Low": "42.66", + "Open": "42.90" + }, + { + "Close": "42.57", + "High": "43.15", + "Low": "42.54", + "Open": "42.61" + }, + { + "Close": "42.94", + "High": "43.66", + "Low": "42.67", + "Open": "43.57" + }, + { + "Close": "43.55", + "High": "44.26", + "Low": "43.03", + "Open": "44.08" + }, + { + "Close": "44.05", + "High": "44.98", + "Low": "43.88", + "Open": "44.80" + } + ] + } + } +} + +``` + +#### *StockRetriever.get_options_info(symbol, items=[], expiration=None)* + +* ***symbol*** : Symbol news to retrieve +* ***items*** : list of attributes to retrieve +* ***expiration*** : Date of expiration (type : str) + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_options_info('YHOO') +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-05-20T13:09:02Z", + "lang": "en-US", + "results": { + "optionsChain": { + "symbol": "YHOO" + } + } + } +} +``` + +#### *StockRetriever.get_index_summary(symbol, items=[])* + +* ***symbol*** : Symbol news to retrieve +* ***items*** : list of attributes to retrieve + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_index_summary('GOOG',('Volume','Change')) +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-05-20T13:09:48Z", + "lang": "en-US", + "results": { + "quote": { + "Change": null, + "Volume": "16" + } + } + } +} +``` + +#### *StockRetriever.get_industry_index(index_id,items=[])* + +* ***index_id*** : index id +* ***items*** : list of attributes to retrieve + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_industry_index(112) +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-05-20T13:10:55Z", + "lang": "en-US", + "results": { + "industry": { + "company": [ + { + "name": "Adarsh\nPlant Protect Ltd", + "symbol": "ADARSHPL.BO" + }, + { + "name": "African\nPotash Ltd", + "symbol": "AFPO.L" + }, + { + "name": "Agrium\nInc", + "symbol": "AGU.DE" + }, + { + "name": "Agrium\nInc", + "symbol": "AGU.TO" + }, + ... + { + "name": "Zuari\nAgro Chemicals Ltd", + "symbol": "ZUARI.NS" + }, + { + "name": "Zuari\nGlobal Ltd", + "symbol": "ZUARIAGRO.NS" + }, + { + "name": "Zuari\nGlobal Ltd", + "symbol": "ZUARIIND.BO" + } + ], + "id": "112", + "name": "" + } + } + } +} +``` + +#### *StockRetriever.get_xchange_rate(pairs, items=None)* + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_xchange_rate(['EURUSD','GBPUSD']) +``` + +```json +{ + "query": { + "count": 2, + "created": "2015-06-27T13:48:51Z", + "lang": "en-US", + "results": { + "rate": [ + { + "Ask": "1.1174", + "Bid": "1.1162", + "Date": "6/27/2015", + "Name": "EUR/USD", + "Rate": "1.1168", + "Time": "12:53pm", + "id": "EURUSD" + }, + { + "Ask": "1.5756", + "Bid": "1.5738", + "Date": "6/27/2015", + "Name": "GBP/USD", + "Rate": "1.5747", + "Time": "12:53pm", + "id": "GBPUSD" + } + ] + } + } +} + +``` + +#### *StockRetriever.get_dividendhistory(symbol, startDate, endDate)* + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_dividendhistory('AAPL',"2008-01-01", "2015-06-15") +``` + +```json +{ + "query": { + "count": 12, + "created": "2015-06-27T13:42:27Z", + "lang": "en-US", + "results": { + "quote": [ + { + "Date": "2015-05-07", + "Dividends": "0.520000", + "Symbol": "AAPL" + }, + { + "Date": "2015-02-05", + "Dividends": "0.470000", + "Symbol": "AAPL" + }, + { + "Date": "2014-11-06", + "Dividends": "0.470000", + "Symbol": "AAPL" + }, + { + "Date": "2014-08-07", + "Dividends": "0.470000", + "Symbol": "AAPL" + }, + { + "Date": "2014-05-08", + "Dividends": "0.470000", + "Symbol": "AAPL" + }, + { + "Date": "2014-02-06", + "Dividends": "0.435710", + "Symbol": "AAPL" + }, + { + "Date": "2013-11-06", + "Dividends": "0.435710", + "Symbol": "AAPL" + }, + { + "Date": "2013-08-08", + "Dividends": "0.435710", + "Symbol": "AAPL" + }, + { + "Date": "2013-05-09", + "Dividends": "0.435710", + "Symbol": "AAPL" + }, + { + "Date": "2013-02-07", + "Dividends": "0.378570", + "Symbol": "AAPL" + }, + { + "Date": "2012-11-07", + "Dividends": "0.378570", + "Symbol": "AAPL" + }, + { + "Date": "2012-08-09", + "Dividends": "0.378570", + "Symbol": "AAPL" + } + ] + } + } +} + +``` + +#### *StockRetriever.get_balancesheet(symbol)* + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = self.stock.get_balancesheet('YHOO') +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-07-08T09:01:12Z", + "lang": "en-US", + "results": { + "balancesheet": { + "symbol": "YHOO", + "timeframe": "quarterly" + } + } + } +} +``` + +#### *StockRetriever.get_symbols(company_name)* + +     **Always returns data as JSON** + +```python +from myql.contrib.finance.stockscraper import StockRetriever +stocks = StockRetriever(format='json') +data = stocks.get_symbols('Google') +``` + +```json +{ + "ResultSet": { + "Query": "google", + "Result": [ + { + "exch": "NMS", + "exchDisp": "NASDAQ", + "name": "Google Inc.", + "symbol": "GOOG", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "NMS", + "exchDisp": "NASDAQ", + "name": "Google Inc.", + "symbol": "GOOGL", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "GER", + "exchDisp": "XETRA", + "name": "Google Inc.", + "symbol": "GGQ7.DE", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "MEX", + "exchDisp": "Mexico", + "name": "Google Inc.", + "symbol": "GOOG.MX", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "MEX", + "exchDisp": "Mexico", + "name": "GOOGLE-A", + "symbol": "GOOGL.MX", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "BUE", + "exchDisp": "Buenos Aires", + "name": "Google Inc.", + "symbol": "GOOGL.BA", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "FRA", + "exchDisp": "Frankfurt", + "name": "GOOGLE-A", + "symbol": "GGQ1.F", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "MUN", + "exchDisp": "Munich", + "name": "GOOGLE-A", + "symbol": "GGQ1.MU", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "EBS", + "exchDisp": "Swiss", + "name": "GOOGLE-A", + "symbol": "GOOGL.SW", + "type": "S", + "typeDisp": "Equity" + }, + { + "exch": "MUN", + "exchDisp": "Munich", + "name": "GOOGLE-C", + "symbol": "GGQ7.MU", + "type": "S", + "typeDisp": "Equity" + } + ] + } +} + +``` diff --git a/docs/table.md b/docs/table.md new file mode 100644 index 0000000..85be75a --- /dev/null +++ b/docs/table.md @@ -0,0 +1,271 @@ +YQL Open Table +============== + +## Table +This class represents the **root** element of a YQL Table Definition File. You can read about the full documentation [here](https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#yql-opentables-tables-element) + +### **Definition** + +#### *Table(name, author, apiKeyURL, documentationURL, sampleQuery=[], description=None, table_attr=None, bindings=[])* + +```python +>>> from myql.contrib.table import Table +>>> mytable = Table('mytable', 'Josue Kouka', 'http://josuerunel.org/mytable/','http://josuerunel.org/mytable/docs.html',sampleQuery = ['SELECT * FROM mytable', 'SELECT name FROM mytable WHERE id = 77'], description='Just a simple tabe', table_attr={'xmlns':'http://query.yahooapis.com/v1/schema/table.xsd', 'securityLevel':'any', 'https':'false'}) +``` + +### **Methods** + +#### *Table.addBinder(binder_object)* +Add a binder to the table +```python +>>> mytable.addBinder(select_binder) +``` +#### *Table.removeBinder(binder_object)* +Remove a binder from the table +```python +>>> mytable.removeBinder(select_binder) +``` +#### *Table.save(name=None, path=None)* +Save the table as a *xml file* with Table Object name if *name* is not provided. If *path*, saves the *xml file* to the specified location +```python +>>> mytable.save(name='test',path='/var/www/josuebrunel.org/mytable/') +``` + +## Inputs +There are 3 kind of *inputs* as described in the [documentation](https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#yql-opentables-key) : + +* ***key*** +* ***map*** +* ***value*** + +### **Definitions** + +* #### *InputKey(id, type, paramType, like='', required=False, default='', private=False, const=False, batchable=False, maxBatchItems=0)* +```python +song = InputKey(id='song', type='xs:string', paramType='path', required=True) +``` +* #### *InputValue(id, type, paramType, like='', required=False, default='', private=False, const=False, batchable=False, maxBatchItems=0)* +```python +song = InputValue(id='song', type='xs:string', paramType='path', required=True, const='12' ) +``` +* #### *InputMap(id, type, paramType, like='', required=False, default='', private=False, const=False, batchable=False, maxBatchItems=0)* + +All of those classes are based on ***BaseInput***. + +***like*** is a replacement for ***as*** which is a python keyword. In the *xml* file, ***as*** will be displayed. + + + +### **Methods** +No methods defined + +## Paging +This class describe a ***paging*** element. A ***paging*** is deifined by one of the 3 classes below : + +* ***PagingPage*** +* ***PagingUrl*** +* ***PagingOffset*** + +Check out the full [documentation](https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#yql-opentables-paging) +### **Definitions** + +* #### *PagingPage(start={}, pageSize={}, total={})* +```python +>>> mypage = PagingPage({'id': 'ItemPage', 'default': '1'}, {'id':'Count' ,'max':'25'},{'default': '10'}) +``` +* #### *PagingUrl(nextpage)* +```python +>>> mypage = PagingUrl("ysearchresponse.nextpage") +``` +* #### *PagingOffset(matrix, start={}, pageSize={}, total={})* +```python +>>> mypage = PagingOffset({'id': 'ItemPage', 'default': '1'}, {'id':'Count' ,'max':'25'},{'default': '10'}) +``` + +All these classes above subclass ***BasePaging*** . + +### **Methods** +No methods defined + +## Binder +This class represents an element under ****. Which means : + +* select +* insert +* update +* delete + + +You can read about the full documentation [here](https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#yql-opentables-select) + +### **Definition** + +#### *Binder(name, itemPath, produces, pollingFrequencySeconds=0, urls=[], inputs=[], paging=None)* + +```python +>>> select = Binder('select', 'products.product', 'xml') +``` + +### **Methods** + +#### *Binder.addInput(input_object)* : +Add an input object to the binder +```python +>>> song = InputKey(id='song', type='xs:string', paramType='path', required=True) +>>> select.addBinder(song) +``` +#### *Binder.removeInput(input_id, input_type)* +Remove an input object from the binder. ***input_type*** may be ***key, value or map*** +```python +>>> select.removeBinder('song','select') +``` +#### *Binder.addUrl(url)* +Add an url to the binder +```python +>>> select.addUrl('http://lol.com/{song}') +``` +#### *Binder.removeUrl(url)* +Remove an url from the binder +```python +>>> select.removeUrl('http://lol.com/{song}') +``` +#### *Binder.addPaging(paging_instance)* +Add a paging to the binder +```python +>>> mypage = PagingUrl("ysearchresponse.nextpage") +>>> select.addPaging(mypage) +``` +#### *Binder.removePaging()* +Remove a paging from the binder +```python +>>> select.removePaging() +``` + +## BinderFunction + +This class represents a stored function. Read the full documentation [here](https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#reference-function) + +### **Definition** + +#### *BinderFunction(func_name, func_code='', func_file=None, inputs=[])* + +* ***func_name*** : function name +* ***func_code*** : function code passed as string +* ***func_file*** : file containing the function +* ***inputs*** : list of inputs + +```python +>>> myfunc = BinderFunction('concat', func_code="console.log('Hello Josh!!!')") +``` + +### **Methods** + +As ***Binder***, ***BinderFunction*** is a subclass of ***BaseBinder***. They both share the same methods + +## The MetaClass API + +***BinderModel*** and ***TableModel*** are the only classes to keep in mind here. They're respectively subclasses of ***BinderMeta*** and ***TableMeta***. Those last two help providing a powerful API to define YQL Table. + +They say *"A picture is worth a thousand of words"* and I say *"A code snippet +is worth ..."* . You got it (^_^). + +Copy and paste the code snippet in the *example.py* below + +```python +from myql.contrib.table import BinderModel, InputKey, PagingPage, PagingUrl, InputValue, BinderFunction +from myql.contrib.table import TableModel, BinderFrom + +class SelectBinder(BinderModel): + name = 'select' + itemPath = 'products.product' + produces = 'xml' + pollingFrequencySeconds = 30 + urls = ['http://lol.com/services?artist={artis}','http://lol.com/services/song={song}'] + paging = PagingPage({'id': 'ItemPage', 'default': '1'}, {'id':'Count' ,'max':'25'},{'default': '10'}) + artist = InputKey(id='artist', type='xs:string', paramType='path') + song = InputKey(id='song', type='xs:string', paramType='path', required=True) + +class InsertBinder(BinderModel): + name = 'insert' + itemPath = 'products.product' + produces = 'xml' + pollingFrequencySeconds = 30 + urls = ['http://lol.com/services?artist={artis}','http://lol.com/services/song={song}'] + paging = PagingUrl(nextpage={'path':'yqlsearch.nextpage'}) + artist = InputKey(id='artist', type='xs:string', paramType='path') + song = InputValue(id='song', type='xs:string', paramType='path', required=True) + + +class TestTable(TableModel): + name = 'Test' + author = 'Josue Kouka' + apiKeyURL = 'http://josuebrunel.org/api' + documentationURL = 'http://josuebrunel.org/doc.html' + description = "Just a test table" + sampleQuery = ['SELECT * FROM mytable','SELECT name FROM mytable WHERE id=4656', "SELECT * FROM mytable WHERE name='Josh'"] + select = BinderFrom(SelectBinder) + insert = BinderFrom(InsertBinder) + func1 = BinderFunction('concat', func_code="console.log('Hello Josh!!!')") + +TestTable.table.save(name='Example') +``` + +Run + +```shell +$ python example.py +$ cat Example.xml +``` + +```xml + + + + http://josuebrunel.org/api + Josue Kouka + Just a test table + http://josuebrunel.org/doc.html + SELECT * FROM mytable + SELECT name FROM mytable WHERE id=4656 + SELECT * FROM mytable WHERE name='Josh' + + + + + ![CDATA]console.log('Hello Josh!!!')]] + + + + + http://lol.com/services?artist={artis} + http://lol.com/services/song={song} + + + + + + + + + + + +
+ +``` + +Voila, i think we're done here diff --git a/docs/weather.md b/docs/weather.md new file mode 100644 index 0000000..b0fb3f3 --- /dev/null +++ b/docs/weather.md @@ -0,0 +1,483 @@ +Weather +======= + +### **Definition** + +####*Weather(unit=None, **kwargs**)* + +* ***unit*** : alternative to default is **c** +* ***kwargs*** : Any possible argument of **YQL** + +```python +from myql.contrib.weather import Weather +weather = Weather(unit='c', format='json') +``` + + +### **Methods** + +#### *Weather.get_weather_in(place, unit=None, items=None)* +>Return weather information according to the place passed in + +```python +data = weather.get_weather_in('choisy-le-roi', 'c',['location', 'units', 'item.condition']) +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-07-08T08:34:05Z", + "lang": "en-US", + "results": { + "channel": { + "astronomy": { + "sunrise": "5:55 am", + "sunset": "9:53 pm" + }, + "atmosphere": { + "humidity": "59", + "pressure": "1015.92", + "rising": "0", + "visibility": "9.99" + }, + "description": "Yahoo! Weather for Choisy-le-Roi, FR", + "image": { + "height": "18", + "link": "http://weather.yahoo.com", + "title": "Yahoo! Weather", + "url": "http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif", + "width": "142" + }, + "item": { + "condition": { + "code": "30", + "date": "Wed, 08 Jul 2015 10:00 am CEST", + "temp": "18", + "text": "Partly Cloudy" + }, + "description": "\n
\nCurrent Conditions:
\nPartly Cloudy, 18 C
\n
Forecast:
\nWed - Cloudy. High: 22 Low: 13
\nThu - Partly Cloudy. High: 25 Low: 11
\nFri - Sunny. High: 28 Low: 13
\nSat - Mostly Sunny. High: 31 Low: 13
\nSun - Partly Cloudy. High: 25 Low: 15
\n
\nFull Forecast at Yahoo! Weather

\n(provided by The Weather Channel)
\n", + "forecast": [ + { + "code": "26", + "date": "8 Jul 2015", + "day": "Wed", + "high": "22", + "low": "13", + "text": "Cloudy" + }, + { + "code": "30", + "date": "9 Jul 2015", + "day": "Thu", + "high": "25", + "low": "11", + "text": "Partly Cloudy" + }, + { + "code": "32", + "date": "10 Jul 2015", + "day": "Fri", + "high": "28", + "low": "13", + "text": "Sunny" + }, + { + "code": "34", + "date": "11 Jul 2015", + "day": "Sat", + "high": "31", + "low": "13", + "text": "Mostly Sunny" + }, + { + "code": "30", + "date": "12 Jul 2015", + "day": "Sun", + "high": "25", + "low": "15", + "text": "Partly Cloudy" + } + ], + "guid": { + "content": "FRXX3747_2015_07_12_7_00_CEST", + "isPermaLink": "false" + }, + "lat": "48.76", + "link": "http://us.rd.yahoo.com/dailynews/rss/weather/Choisy-le-Roi__FR/*http://weather.yahoo.com/forecast/FRXX3747_c.html", + "long": "2.42", + "pubDate": "Wed, 08 Jul 2015 10:00 am CEST", + "title": "Conditions for Choisy-le-Roi, FR at 10:00 am CEST" + }, + "language": "en-us", + "lastBuildDate": "Wed, 08 Jul 2015 10:00 am CEST", + "link": "http://us.rd.yahoo.com/dailynews/rss/weather/Choisy-le-Roi__FR/*http://weather.yahoo.com/forecast/FRXX3747_c.html", + "location": { + "city": "Choisy-le-Roi", + "country": "France", + "region": "" + }, + "title": "Yahoo! Weather - Choisy-le-Roi, FR", + "ttl": "60", + "units": { + "distance": "km", + "pressure": "mb", + "speed": "km/h", + "temperature": "C" + }, + "wind": { + "chill": "18", + "direction": "270", + "speed": "25.75" + } + } + } + } +} + +``` + +#### *Weather.get_weather_forecast(place, unit=None)* +>Return weather forecast + +```python +data = weather.get_weather_description('dolisie') +``` + +```json +{ + "query": { + "count": 1, + "created": "2015-07-08T08:35:27Z", + "lang": "en-US", + "results": { + "channel": { + "item": { + "condition": { + "text": "Cloudy" + } + } + } + } + } +} + +``` + +#### *Weather.get_current_atmosphere(place)* +>Return weather atmosphere + +```python +data = weather.get_current_condition('Nantes') +``` + +```json +{ + "count": 4, + "created": "2015-07-08T08:38:17Z", + "lang": "en-US", + "results": { + "channel": [ + { + "item": { + "condition": { + "code": "28", + "date": "Wed, 08 Jul 2015 10:00 am CEST", + "temp": "18", + "text": "Mostly Cloudy" + } + } + }, + { + "item": { + "condition": { + "code": "3200", + "date": "Wed, 08 Jul 2015 4:00 am EDT", + "temp": "19", + "text": "Unknown" + } + } + }, + { + "item": { + "condition": { + "code": "27", + "date": "Wed, 08 Jul 2015 5:01 am BRT", + "temp": "16", + "text": "Mostly Cloudy" + } + } + }, + { + "item": { + "condition": { + "code": "28", + "date": "Wed, 08 Jul 2015 7:58 am WEST", + "temp": "18", + "text": "Mostly Cloudy" + } + } + } + ] + } + } +} + +``` + +#### *Weather.get_current_atmosphere(place)* +>Return sunrise and sunset time + +```python +data = weather.get_current_atmosphere('Scotland') +``` + +```json +{ + "query": { + "count": 10, + "created": "2015-07-08T08:43:26Z", + "lang": "en-US", + "results": { + "channel": [ + { + "atmosphere": { + "humidity": "95", + "pressure": "1008.7", + "rising": "1", + "visibility": "" + } + }, + { + "atmosphere": { + "humidity": "62", + "pressure": "1013.3", + "rising": "0", + "visibility": "16.09" + } + }, + { + "atmosphere": { + "humidity": "80", + "pressure": "1017.7", + "rising": "2", + "visibility": "9.66" + } + }, + { + "atmosphere": { + "humidity": "93", + "pressure": "1012.9", + "rising": "2", + "visibility": "8.05" + } + }, + { + "atmosphere": { + "humidity": "82", + "pressure": "1016.8", + "rising": "1", + "visibility": "" + } + }, + { + "atmosphere": { + "humidity": "99", + "pressure": "1015.92", + "rising": "0", + "visibility": "16.09" + } + }, + { + "atmosphere": { + "humidity": "89", + "pressure": "982.05", + "rising": "0", + "visibility": "16.09" + } + }, + { + "atmosphere": { + "humidity": "88", + "pressure": "1015.92", + "rising": "0", + "visibility": "16.09" + } + }, + { + "atmosphere": { + "humidity": "100", + "pressure": "1015.92", + "rising": "1", + "visibility": "8.05" + } + }, + { + "atmosphere": { + "humidity": "81", + "pressure": "1015.5", + "rising": "0", + "visibility": "16.09" + } + } + ] + } + } +} + +``` + +#### *Weather.get_current_wind(place)* +>Return weather wind + +```python +data = weather.get_current_wind('Barcelona') +``` + +```json +{ + "query": { + "count": 7, + "created": "2015-07-08T08:44:49Z", + "lang": "en-US", + "results": { + "channel": [ + { + "wind": { + "chill": "27", + "direction": "110", + "speed": "14.48" + } + }, + { + "wind": { + "chill": "15", + "direction": "300", + "speed": "24.14" + } + }, + { + "wind": { + "chill": "23", + "direction": "", + "speed": "" + } + }, + { + "wind": { + "chill": "22", + "direction": "190", + "speed": "9.66" + } + }, + { + "wind": { + "chill": "31", + "direction": "220", + "speed": "17.7" + } + }, + { + "wind": { + "chill": "17", + "direction": "360", + "speed": "12.87" + } + }, + { + "wind": { + "chill": "26", + "direction": "80", + "speed": "28.97" + } + } + ] + } + } +} + +``` + +#### *Weather.get_astronomy(place)* +>Return sunrise and sunset time + +```python +data = weather.get_astronomy('Congo') +``` + +```json +{ + "query": { + "count": 10, + "created": "2015-07-08T08:45:44Z", + "lang": "en-US", + "results": { + "channel": [ + { + "astronomy": { + "sunrise": "6:10 am", + "sunset": "6:11 pm" + } + }, + { + "astronomy": { + "sunrise": "7:07 am", + "sunset": "4:58 pm" + } + }, + { + "astronomy": { + "sunrise": "6:03 am", + "sunset": "6:41 pm" + } + }, + { + "astronomy": { + "sunrise": "5:38 am", + "sunset": "8:32 pm" + } + }, + { + "astronomy": { + "sunrise": "5:55 am", + "sunset": "8:27 pm" + } + }, + { + "astronomy": { + "sunrise": "5:55 am", + "sunset": "5:30 pm" + } + }, + { + "astronomy": { + "sunrise": "5:38 am", + "sunset": "5:20 pm" + } + }, + { + "astronomy": { + "sunrise": "6:05 am", + "sunset": "8:57 pm" + } + }, + { + "astronomy": { + "sunrise": "5:36 am", + "sunset": "7:57 pm" + } + }, + { + "astronomy": { + "sunrise": "5:55 am", + "sunset": "8:51 pm" + } + } + ] + } + } +} + +``` + + diff --git a/gource/README.md b/gource/README.md new file mode 100644 index 0000000..6758341 --- /dev/null +++ b/gource/README.md @@ -0,0 +1,18 @@ + +### README + +### PREREQUISITE +In order to visualize myql, please install gource with your +favorite package manager + +### INSTRUCTIONS +This is a gource logfile. +People will be able to visualize Myql evolution over the months. +To see gource flow, just type : + +$ gource myql.log + +### CONTACT + +godbod +[gkounkou@gmail.com](gkounkou@gmail.com) diff --git a/gource/myql.log b/gource/myql.log new file mode 100644 index 0000000..6aadc34 --- /dev/null +++ b/gource/myql.log @@ -0,0 +1,3059 @@ +user:josuebrunel +1407869378 +:000000 100644 0000000... 51cbe85... A .gitignore +:000000 100644 0000000... d7f1051... A LICENSE +:000000 100644 0000000... a24409b... A README.md + +user:josuebrunel +1407869539 +:000000 100644 0000000... e69de29... A lokingyql/__init__.py + +user:josuebrunel +1407969061 +:000000 100644 0000000... 8f110ba... A requirements.txt + +user:josuebrunel +1407974646 +:100644 100644 e69de29... 5c9e8e4... M lokingyql/__init__.py +:000000 100644 0000000... 21efb34... A lokingyql/lokingyql.py + +user:josuebrunel +1408048127 +:100644 100644 51cbe85... 27a88a2... M .gitignore +:100644 100644 21efb34... 04223dd... M lokingyql/lokingyql.py + +user:josuebrunel +1408049999 +:100644 100644 04223dd... c1686a8... M lokingyql/lokingyql.py + +user:josuebrunel +1408054470 +:000000 100644 0000000... 6b262f2... A tests.py + +user:josuebrunel +1408057480 +:100644 100644 c1686a8... bbad973... M lokingyql/lokingyql.py +:100644 100644 6b262f2... 3e4fdca... M tests.py + +user:josuebrunel +1408065572 +:100644 100644 bbad973... 6d1449e... M lokingyql/lokingyql.py + +user:josuebrunel +1408191354 +:100644 100644 27a88a2... 0b2ac24... M .gitignore +:100644 100644 6d1449e... b9efb49... M lokingyql/lokingyql.py + +user:josuebrunel +1408192672 +:100644 100644 b9efb49... 31a38a5... M lokingyql/lokingyql.py + +user:josuebrunel +1408196033 +:000000 100644 0000000... bfdc633... A lokingyql/errors.py + +user:josuebrunel +1408196403 +:100644 100644 5c9e8e4... cb1fb95... M lokingyql/__init__.py + +user:josuebrunel +1408200473 +:100644 100644 31a38a5... 039b00c... M lokingyql/lokingyql.py + +user:josuebrunel +1408212498 +:100644 100644 039b00c... a12ced3... M lokingyql/lokingyql.py + +user:josuebrunel +1408212734 +:100644 100644 a12ced3... 93a0544... M lokingyql/lokingyql.py + +user:josuebrunel +1408214315 +:100644 100644 93a0544... 8eff44b... M lokingyql/lokingyql.py + +user:josuebrunel +1408216114 +:100644 100644 a24409b... 8575677... M README.md + +user:josuebrunel +1408216497 +:100644 100644 8575677... ce975cc... M README.md + +user:josuebrunel +1408217587 +:100644 100644 ce975cc... 9abab6e... M README.md +:100644 100644 8eff44b... 596551f... M lokingyql/lokingyql.py + +user:josuebrunel +1408220154 +:100644 100644 8f110ba... 7f0d28c... M requirements.txt + +user:josuebrunel +1408272218 +:100644 100644 9abab6e... eb90aa7... M README.md +:100644 100644 bfdc633... 76f2483... M lokingyql/errors.py +:100644 100644 596551f... 04552b5... M lokingyql/lokingyql.py + +user:josuebrunel +1408272487 +:100644 100644 eb90aa7... 817d214... M README.md +:100644 100644 04552b5... 3ef87ea... M lokingyql/lokingyql.py + +user:josuebrunel +1408272871 +:100644 100644 817d214... 0830609... M README.md +:100644 100644 3ef87ea... 8927338... M lokingyql/lokingyql.py + +user:josuebrunel +1408272957 +:100644 100644 0830609... 637b549... M README.md + +user:josuebrunel +1408274656 +:100644 100644 637b549... b629261... M README.md +:100644 100644 8927338... 2a42d37... M lokingyql/lokingyql.py + +user:josuebrunel +1408277924 +:100644 100644 0b2ac24... 989cbc5... M .gitignore +:000000 100644 0000000... 7500556... A .travis.yml + +user:josuebrunel +1408280563 +:100644 100644 b629261... f27ace0... M README.md +:000000 100644 0000000... 6b2ffdf... A setup.py +:100644 000000 3e4fdca... 0000000... D tests.py +:000000 100644 0000000... 3e4fdca... A tests/tests.py + +user:josuebrunel +1408284510 +:100644 100644 7500556... c8bbf86... M .travis.yml + +user:josuebrunel +1408284896 +:100644 100644 6b2ffdf... 44ef379... M setup.py + +user:josuebrunel +1408304045 +:100644 100644 44ef379... 0a57d8b... M setup.py + +user:josuebrunel +1408304120 +:100644 100644 c8bbf86... 442b890... M .travis.yml + +user:josuebrunel +1408304249 +:100644 100644 442b890... e4cc260... M .travis.yml + +user:josuebrunel +1408304596 +:100644 100644 7f0d28c... 3526ba8... M requirements.txt + +user:josuebrunel +1408393016 +:000000 100644 0000000... b29b549... A lokingyql/auth.py +:100644 100644 2a42d37... 60c13ad... M lokingyql/lokingyql.py +:100644 100644 3526ba8... 29a1d4f... M requirements.txt + +user:josuebrunel +1408421716 +:100644 100644 f27ace0... b877785... M README.md + +user:josuebrunel +1408475986 +:100644 100644 b29b549... bfd3ae4... M lokingyql/auth.py +:000000 100644 0000000... 977bbb5... A lokingyql/config.py +:100644 100644 60c13ad... 5d18c9f... M lokingyql/lokingyql.py + +user:josuebrunel +1408486603 +:100644 100644 cb1fb95... c9574e6... M lokingyql/__init__.py +:100644 100644 5d18c9f... ac4575f... M lokingyql/lokingyql.py + +user:josuebrunel +1408487934 +:100644 100644 b877785... 4d36ff1... M README.md + +user:josuebrunel +1408879936 +:100644 100644 4d36ff1... 6a718f6... M README.md +:100644 100644 ac4575f... 903d68e... M lokingyql/lokingyql.py + +user:josuebrunel +1408895745 +:100644 000000 bfd3ae4... 0000000... D lokingyql/auth.py +:100644 000000 977bbb5... 0000000... D lokingyql/config.py + +user:josuebrunel +1408907213 +:100644 100644 6a718f6... 79835ec... M README.md +:100644 100644 903d68e... d42d6f7... M lokingyql/lokingyql.py + +user:josuebrunel +1409115515 +:100644 100644 79835ec... e79ca50... M README.md +:100644 100644 d42d6f7... 7e14901... M lokingyql/lokingyql.py + +user:josuebrunel +1409116615 +:100644 100644 e79ca50... e760beb... M README.md +:100644 100644 7e14901... 924753e... M lokingyql/lokingyql.py + +user:josuebrunel +1409116700 +:100644 100644 e760beb... 211cde7... M README.md + +user:josuebrunel +1409124518 +:100644 100644 211cde7... 161b028... M README.md + +user:josuebrunel +1409395998 +:000000 100644 0000000... 3e8bfb7... A lokingyql/yahooauth.py + +user:josuebrunel +1409405260 +:000000 100644 0000000... dd5565d... A lokingyql/requirements.txt + +user:josuebrunel +1409407998 +:100644 100644 3e8bfb7... 48c8f46... M lokingyql/yahooauth.py + +user:josuebrunel +1409410363 +:100644 100644 48c8f46... 5fc2d02... M lokingyql/yahooauth.py + +user:josuebrunel +1409413066 +:100644 100644 5fc2d02... cb472c4... M lokingyql/yahooauth.py + +user:josuebrunel +1409413658 +:100644 100644 cb472c4... 13f465e... M lokingyql/yahooauth.py + +user:josuebrunel +1409413846 +:100644 100644 13f465e... 59d1720... M lokingyql/yahooauth.py + +user:josuebrunel +1409414073 +:100644 100644 59d1720... 5db22eb... M lokingyql/yahooauth.py + +user:josuebrunel +1409415058 +:100644 100644 161b028... 0b51c9b... M README.md + +user:josuebrunel +1409415161 +:100644 100644 0b51c9b... 30174c8... M README.md + +user:josuebrunel +1409425765 +:000000 100644 0000000... 97cd841... A lokingyql/config.py +:000000 100644 0000000... e69de29... A lokingyql/contrib/__init__.py +:100644 100644 5db22eb... c18c273... M lokingyql/yahooauth.py + +user:josuebrunel +1409427089 +:100644 100644 c18c273... 7e945c5... M lokingyql/yahooauth.py +:100644 100644 29a1d4f... dd5565d... M requirements.txt + +user:josuebrunel +1409600636 +:100644 100644 7e945c5... db77291... M lokingyql/yahooauth.py + +user:josuebrunel +1409600849 +:100644 000000 dd5565d... 0000000... D lokingyql/requirements.txt + +user:josuebrunel +1409605492 +:100644 100644 989cbc5... 25dfc84... M .gitignore +:100644 100644 c9574e6... 4261349... M lokingyql/__init__.py +:000000 100644 0000000... 1eb8cb8... A lokingyql/code.png +:000000 100644 0000000... 7f8aba5... A lokingyql/grant.png +:000000 100644 0000000... 3d94f5c... A lokingyql/readme.md +:000000 100644 0000000... 3cc9141... A tests/README.md +:000000 100644 0000000... 2ee3b3e... A tests/__init__.py +:100644 100644 3e4fdca... 5ccbf96... M tests/tests.py + +user:josuebrunel +1409606798 +:100644 100644 db77291... 6517cbb... M lokingyql/yahooauth.py + +user:josuebrunel +1409783841 +:100644 100644 e4cc260... b259d01... M .travis.yml + +user:josuebrunel +1409895709 +:100644 100644 b259d01... d57f3c4... M .travis.yml +:100644 100644 76f2483... 8ca3e86... M lokingyql/errors.py +:100644 100644 924753e... 8103dca... M lokingyql/lokingyql.py + +user:josuebrunel +1409896246 +:100644 100644 8103dca... 61be15b... M lokingyql/lokingyql.py + +user:josuebrunel +1409896995 +:100644 100644 8ca3e86... 50b537a... M lokingyql/errors.py +:100644 100644 61be15b... ff75bd1... M lokingyql/lokingyql.py + +user:josuebrunel +1409939441 +:100644 100644 d57f3c4... 28b6050... M .travis.yml + +user:josuebrunel +1409944354 +:100644 100644 28b6050... c15d94b... M .travis.yml + +user:josuebrunel +1409978280 +:100644 100644 ff75bd1... 05bc2a4... M lokingyql/lokingyql.py +:100644 100644 3cc9141... 0f81fa2... M tests/README.md +:000000 100644 0000000... 5389972... A tests/test_config.py +:100644 100644 5ccbf96... fd2ee45... M tests/tests.py + +user:josuebrunel +1409978556 +:100644 100644 fd2ee45... 39f59f3... M tests/tests.py + +user:josuebrunel +1409979629 +:100644 100644 39f59f3... d1f8b00... M tests/tests.py + +user:aliounedia +1410010474 +user:josuebrunel +1410375499 +:100644 100644 05bc2a4... c0b5f9c... M lokingyql/lokingyql.py +:100644 100644 6517cbb... dfe0c74... M lokingyql/yahooauth.py +:100644 100644 d1f8b00... 9067d2a... M tests/tests.py + +user:josuebrunel +1423660206 +:100644 100644 4261349... 7e9a6e7... M lokingyql/__init__.py +:100644 000000 1eb8cb8... 0000000... D lokingyql/code.png +:100644 000000 97cd841... 0000000... D lokingyql/config.py +:100644 100644 e69de29... 8056a4b... M lokingyql/contrib/__init__.py +:000000 100644 0000000... 12c6787... A lokingyql/contrib/yahooauth.py +:100644 000000 7f8aba5... 0000000... D lokingyql/grant.png +:100644 100644 c0b5f9c... cedc638... M lokingyql/lokingyql.py +:100644 000000 3d94f5c... 0000000... D lokingyql/readme.md +:100644 000000 dfe0c74... 0000000... D lokingyql/yahooauth.py +:000000 100644 0000000... f152fd1... A readme.md +:000000 100644 0000000... 1eb8cb8... A static/img/code.png +:000000 100644 0000000... 7f8aba5... A static/img/grant.png + +user:josuebrunel +1423663534 +:100644 000000 c15d94b... 0000000... D .travis.yml +:000000 100644 0000000... 9d78de9... A lokingyql/contrib/opentable.py + +user:josuebrunel +1423758959 +:100644 000000 9d78de9... 0000000... D lokingyql/contrib/opentable.py +:000000 100644 0000000... 95a4183... A lokingyql/contrib/opentable/__init__.py +:000000 100644 0000000... 9d78de9... A lokingyql/contrib/opentable/opentable.py + +user:josuebrunel +1423760850 +:000000 100644 0000000... e69de29... A lokingyql/contrib/opentable/data/template.xml +:000000 100644 0000000... 843a196... A lokingyql/contrib/opentable/table.py + +user:josuebrunel +1423760868 +:000000 100644 0000000... e69de29... A lokingyql/db/models.py + +user:josuebrunel +1423760883 +:000000 100644 0000000... e69de29... A lokingyql/tools/logger.py + +user:josuebrunel +1423830947 +:100644 100644 843a196... 33a0181... M lokingyql/contrib/opentable/table.py + +user:josuebrunel +1423832261 +:100644 000000 9d78de9... 0000000... D lokingyql/contrib/opentable/opentable.py +:100644 000000 33a0181... 0000000... D lokingyql/contrib/opentable/table.py +:000000 100644 0000000... b2ca825... A lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1423832711 +:100644 100644 b2ca825... df3956f... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1423834036 +:100644 100644 df3956f... 3610559... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1423835605 +:100644 100644 95a4183... 8073d26... M lokingyql/contrib/opentable/__init__.py +:100644 100644 3610559... ff1849a... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1423836019 +:000000 100644 0000000... e69de29... A lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1423836347 +:100644 100644 ff1849a... e4aefca... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1423836383 +:100644 100644 e69de29... bddba6f... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1423840318 +:100644 100644 bddba6f... 08e9e20... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1423844219 +:100644 100644 08e9e20... ffb5ea8... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1423844256 +:000000 100644 0000000... cb8d01e... A lokingyql/contrib/opentable/test.py + +user:josuebrunel +1423862559 +:100644 000000 cb8d01e... 0000000... D lokingyql/contrib/opentable/test.py + +user:josuebrunel +1423862883 +:100644 100644 ffb5ea8... 285af53... M lokingyql/contrib/opentable/binder.py +:000000 100644 0000000... 2bcf55c... A lokingyql/contrib/opentable/test.py +:000000 100644 0000000... 04e8d34... A lokingyql/myconfig.py + +user:josuebrunel +1424088490 +:100644 100644 e4aefca... 32f4279... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1424090308 +:100644 100644 285af53... 104fca7... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1424091059 +:100644 100644 104fca7... 3aef6cb... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1424163240 +:100644 100644 3aef6cb... 0fa2859... M lokingyql/contrib/opentable/binder.py +:100644 100644 2bcf55c... 0b446fc... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1424164184 +:100644 100644 0fa2859... 47e7441... M lokingyql/contrib/opentable/binder.py +:000000 100644 0000000... b10e79f... A lokingyql/contrib/opentable/jscode.js +:100644 100644 0b446fc... 0bfbf0e... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425052255 +:100644 100644 0bfbf0e... 8694a84... M lokingyql/contrib/opentable/test.py +:100644 100644 32f4279... baf4543... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425053681 +:100644 100644 47e7441... 8b45390... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425055961 +:100644 100644 8b45390... 7e259b8... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425055996 +:100644 100644 baf4543... 1e9de4f... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425056021 +:100644 100644 8694a84... 0228fc5... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425056193 +:100644 100644 1e9de4f... f4a1149... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425056207 +:100644 100644 0228fc5... d59871f... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425230056 +:100644 100644 f4a1149... 264088e... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425230076 +:100644 100644 d59871f... 687fec9... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425231061 +:100644 100644 264088e... 7ffb3e5... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425231076 +:100644 100644 687fec9... b4bc190... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425231640 +:100644 100644 7ffb3e5... bca4438... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425231785 +:100644 100644 b4bc190... e96eba9... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425298687 +:100644 100644 e96eba9... 13bd065... M lokingyql/contrib/opentable/test.py +:100644 000000 04e8d34... 0000000... D lokingyql/myconfig.py + +user:josuebrunel +1425363569 +:100644 100644 50b537a... 3c42acc... M lokingyql/errors.py + +user:josuebrunel +1425363611 +:100644 100644 25dfc84... e49de98... M .gitignore + +user:josuebrunel +1425363682 +:100644 100644 cedc638... 03c1298... M lokingyql/lokingyql.py + +user:josuebrunel +1425363776 +:100644 100644 9067d2a... 120233f... M tests/tests.py + +user:josuebrunel +1425363810 +:100644 100644 13bd065... 25967fe... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425385543 +:000000 100755 0000000... 8461da6... A run_tests.sh + +user:josuebrunel +1425385574 +:000000 100644 0000000... 6959faf... A lokingyql/contrib/yahooauth/__init__.py +:000000 100644 0000000... 12c6787... A lokingyql/contrib/yahooauth/yahooauth.py + +user:josuebrunel +1425385613 +:100644 100644 2ee3b3e... e92dd39... M tests/__init__.py +:100644 100644 120233f... 0fc7b92... M tests/tests.py + +user:josuebrunel +1425385645 +:100644 100644 8056a4b... 18a604b... M lokingyql/contrib/__init__.py +:100644 000000 e69de29... 0000000... D lokingyql/contrib/opentable/data/template.xml +:100644 000000 12c6787... 0000000... D lokingyql/contrib/yahooauth.py + +user:josuebrunel +1425387857 +:100755 100755 8461da6... bde282e... M run_tests.sh + +user:josuebrunel +1425387893 +:100644 100644 03c1298... 63d8400... M lokingyql/lokingyql.py + +user:josuebrunel +1425471779 +:100644 100644 30174c8... a7ac0ef... M README.md + +user:josuebrunel +1425550593 +:100644 100644 7e259b8... 3e8fc55... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425551575 +:100644 100644 25967fe... 9b88a0b... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425561617 +:100644 100644 9b88a0b... 2bf2b23... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425562208 +:000000 100755 0000000... 63d34e3... A lokingyql/contrib/opentable/run_test.sh + +user:josuebrunel +1425562257 +:100644 100644 2bf2b23... 9d08b97... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425562452 +:100644 100644 bca4438... 0bf73c4... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425563290 +:100755 100755 63d34e3... 1e7e2d1... M lokingyql/contrib/opentable/run_test.sh + +user:josuebrunel +1425563465 +:100755 100755 1e7e2d1... a48acda... M lokingyql/contrib/opentable/run_test.sh + +user:josuebrunel +1425563526 +:100644 100644 9d08b97... 195ce1f... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425563585 +:100644 100644 0fc7b92... bd935ae... M tests/tests.py + +user:josuebrunel +1425565065 +:000000 100644 0000000... f152fd1... A lokingyql/contrib/yahooauth/readme.md +:100644 000000 f152fd1... 0000000... D readme.md + +user:josuebrunel +1425565316 +:100644 100644 f152fd1... 6d2121b... M lokingyql/contrib/yahooauth/readme.md + +user:josuebrunel +1425629709 +:100644 100644 195ce1f... bb11db2... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425630112 +:100644 100644 bb11db2... 732ee59... M lokingyql/contrib/opentable/test.py + +user:josuebrunel +1425984133 +:100644 100755 8073d26... 8073d26... M lokingyql/contrib/opentable/__init__.py +:100644 100755 3e8fc55... 3e8fc55... M lokingyql/contrib/opentable/binder.py +:100644 100755 b10e79f... b10e79f... M lokingyql/contrib/opentable/jscode.js +:100644 000000 732ee59... 0000000... D lokingyql/contrib/opentable/test.py +:000000 100755 0000000... 732ee59... A lokingyql/contrib/opentable/tests.py +:100644 100755 0bf73c4... 0bf73c4... M lokingyql/contrib/opentable/yqltable.py +:100644 000000 e69de29... 0000000... D lokingyql/tools/logger.py +:000000 100644 0000000... e69de29... A lokingyql/utils/logger.py + +user:josuebrunel +1425985065 +:100644 100755 e49de98... e49de98... M .gitignore +:100644 100755 d7f1051... d7f1051... M LICENSE +:100644 100755 a7ac0ef... a7ac0ef... M README.md +:100644 100755 7e9a6e7... 7e9a6e7... M lokingyql/__init__.py +:100644 100755 18a604b... 18a604b... M lokingyql/contrib/__init__.py +:100644 100755 6959faf... 6959faf... M lokingyql/contrib/yahooauth/__init__.py +:100644 100755 6d2121b... 6d2121b... M lokingyql/contrib/yahooauth/readme.md +:100644 100755 12c6787... 12c6787... M lokingyql/contrib/yahooauth/yahooauth.py +:100644 100755 e69de29... e69de29... M lokingyql/db/models.py +:100644 100755 3c42acc... 3c42acc... M lokingyql/errors.py +:100644 100755 63d8400... 63d8400... M lokingyql/lokingyql.py +:100644 100755 e69de29... e69de29... M lokingyql/utils/logger.py +:100644 100755 dd5565d... dd5565d... M requirements.txt +:100644 100755 0a57d8b... 0a57d8b... M setup.py +:100644 100755 1eb8cb8... 1eb8cb8... M static/img/code.png +:100644 100755 7f8aba5... 7f8aba5... M static/img/grant.png +:100644 100755 0f81fa2... 0f81fa2... M tests/README.md +:100644 100755 e92dd39... e92dd39... M tests/__init__.py +:100644 100755 5389972... 5389972... M tests/test_config.py +:100644 100755 bd935ae... bd935ae... M tests/tests.py + +user:josuebrunel +1425985711 +:100755 100755 732ee59... 5aa88d0... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1425988335 +:100755 100755 a48acda... 1e87d60... M lokingyql/contrib/opentable/run_test.sh + +user:josuebrunel +1425991531 +:100755 100755 3e8fc55... 101aa43... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425991586 +:100755 100755 5aa88d0... 2fc8f53... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1425992402 +:100755 100755 101aa43... 3bf3d31... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425993038 +:100755 100755 b10e79f... f3b503b... M lokingyql/contrib/opentable/jscode.js + +user:josuebrunel +1425993107 +:100755 100755 3bf3d31... 79917bc... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425995587 +:100755 100755 2fc8f53... 3fe86a7... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1425996426 +:100755 100755 0bf73c4... 1f2e25f... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1425996854 +:100755 100755 79917bc... 7285bf3... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1425998102 +:100755 100755 3fe86a7... f4de7b1... M lokingyql/contrib/opentable/tests.py +:000000 100755 0000000... f3b503b... A lokingyql/contrib/opentable/tests_data/jscode.js + +user:josuebrunel +1425998122 +:100755 000000 f3b503b... 0000000... D lokingyql/contrib/opentable/jscode.js + +user:josuebrunel +1425998259 +:000000 100644 0000000... e41dfde... A lokingyql/contrib/opentable/tests_data/after.xml +:000000 100644 0000000... 535828b... A lokingyql/contrib/opentable/tests_data/before.xml +:000000 100644 0000000... ca17498... A lokingyql/contrib/opentable/tests_data/mytable.xml +:000000 100644 0000000... 61f4809... A lokingyql/contrib/opentable/tests_data/titi.xml +:000000 100644 0000000... 61f4809... A lokingyql/contrib/opentable/tests_data/toto.xml + +user:josuebrunel +1426087987 +:100644 000000 e41dfde... 0000000... D lokingyql/contrib/opentable/tests_data/after.xml +:100644 000000 535828b... 0000000... D lokingyql/contrib/opentable/tests_data/before.xml +:100644 000000 ca17498... 0000000... D lokingyql/contrib/opentable/tests_data/mytable.xml +:100644 000000 61f4809... 0000000... D lokingyql/contrib/opentable/tests_data/titi.xml +:100644 000000 61f4809... 0000000... D lokingyql/contrib/opentable/tests_data/toto.xml + +user:josuebrunel +1426089108 +:100755 100755 1f2e25f... d4eeaa2... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1426163755 +:100755 100755 f4de7b1... 8781a3e... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426163789 +:100755 100755 7285bf3... 8d792df... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426167367 +:100755 100755 8781a3e... 073bc78... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426167555 +:100755 100755 073bc78... 8dbfd4d... M lokingyql/contrib/opentable/tests.py +:100755 100755 d4eeaa2... ef02223... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1426167742 +:100755 100755 8dbfd4d... 57f1cd3... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426168383 +:100755 100755 ef02223... f406163... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1426169573 +:100755 100755 57f1cd3... df9e487... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426185589 +:100755 100755 8d792df... 574d908... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426229670 +:100755 100755 574d908... 7728bc8... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426229714 +:100755 100755 df9e487... 9644236... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426234068 +:100755 100755 7728bc8... 9e226d4... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426234837 +:100755 100755 9644236... 7c73d23... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426234878 +:100755 100755 9e226d4... e52fccf... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426236121 +:100755 100755 e52fccf... b28f533... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426236152 +:100755 100755 8073d26... a887d03... M lokingyql/contrib/opentable/__init__.py + +user:josuebrunel +1426236495 +:100755 100755 7c73d23... b92fa6f... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426236689 +:100755 100755 b28f533... e282920... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426236774 +:100755 100755 e282920... 26ae052... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426267649 +:100755 100755 26ae052... 5fc300d... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426267681 +:100755 100755 b92fa6f... 16661e0... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426267838 +:100755 100755 16661e0... d4e9cf9... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426268211 +:100755 100755 5fc300d... a156bfc... M lokingyql/contrib/opentable/binder.py +:100755 100755 d4e9cf9... 451bdc1... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426268374 +:100755 100755 451bdc1... 88f02e0... M lokingyql/contrib/opentable/tests.py + +user:josuebrunel +1426269836 +:100755 100755 a156bfc... 449839c... M lokingyql/contrib/opentable/binder.py + +user:josuebrunel +1426577412 +:100755 100755 f406163... 78490ef... M lokingyql/contrib/opentable/yqltable.py + +user:josuebrunel +1426579698 +:100755 100755 63d8400... 73e7950... M lokingyql/lokingyql.py + +user:josuebrunel +1426579903 +:100755 100755 73e7950... 85214be... M lokingyql/lokingyql.py + +user:josuebrunel +1426607637 +:100755 100755 a887d03... 99e276c... M lokingyql/contrib/opentable/__init__.py +:100755 100755 85214be... 85a38b9... M lokingyql/lokingyql.py + +user:josuebrunel +1426608279 +:100755 000000 e69de29... 0000000... D lokingyql/db/models.py +:100755 000000 e69de29... 0000000... D lokingyql/utils/logger.py + +user:josuebrunel +1426609422 +:100755 100755 7e9a6e7... 077cb64... M lokingyql/__init__.py +:100755 100755 18a604b... b27bbfe... M lokingyql/contrib/__init__.py +:100755 000000 99e276c... 0000000... D lokingyql/contrib/opentable/__init__.py +:100755 000000 449839c... 0000000... D lokingyql/contrib/opentable/binder.py +:100755 000000 1e87d60... 0000000... D lokingyql/contrib/opentable/run_test.sh +:100755 000000 88f02e0... 0000000... D lokingyql/contrib/opentable/tests.py +:100755 000000 f3b503b... 0000000... D lokingyql/contrib/opentable/tests_data/jscode.js +:100755 000000 78490ef... 0000000... D lokingyql/contrib/opentable/yqltable.py +:000000 100755 0000000... c6d1c4f... A lokingyql/contrib/table/__init__.py +:000000 100755 0000000... 449839c... A lokingyql/contrib/table/binder.py +:000000 100755 0000000... 33883f0... A lokingyql/contrib/table/run_test.sh +:000000 100755 0000000... 14247d6... A lokingyql/contrib/table/table.py +:000000 100755 0000000... 3057cb0... A lokingyql/contrib/table/tests.py +:000000 100755 0000000... f3b503b... A lokingyql/contrib/table/tests_data/jscode.js +:100755 100755 bd935ae... 1497e2b... M tests/tests.py + +user:josuebrunel +1427920906 +:100755 100755 0a57d8b... 18d6747... M setup.py + +user:josuebrunel +1427966816 +:100755 100755 18d6747... 350b4f3... M setup.py + +user:josuebrunel +1427973582 +:100755 100755 c6d1c4f... ca3c7c4... M lokingyql/contrib/table/__init__.py + +user:josuebrunel +1428177858 +:100755 100755 449839c... cc24e72... M lokingyql/contrib/table/binder.py +:100755 100755 3057cb0... c62038b... M lokingyql/contrib/table/tests.py + +user:josuebrunel +1428177890 +:100755 100755 cc24e72... b11df58... M lokingyql/contrib/table/binder.py + +user:josuebrunel +1428178147 +:100755 100755 b11df58... 89d35cb... M lokingyql/contrib/table/binder.py + +user:josuebrunel +1428190327 +:100755 000000 33883f0... 0000000... D lokingyql/contrib/table/run_test.sh +:000000 100755 0000000... 33883f0... A lokingyql/contrib/table/run_tests.sh + +user:josuebrunel +1428190366 +:100755 100755 c62038b... 34a1264... M lokingyql/contrib/table/tests.py + +user:josuebrunel +1428230142 +:100755 100755 89d35cb... a024c30... M lokingyql/contrib/table/binder.py + +user:josuebrunel +1428241204 +:100755 100755 34a1264... 40fcaea... M lokingyql/contrib/table/tests.py + +user:josuebrunel +1428241843 +:100755 100755 40fcaea... e06f712... M lokingyql/contrib/table/tests.py +:100755 100755 bde282e... 38c28c8... M run_tests.sh + +user:josuebrunel +1428288725 +:100755 100755 a7ac0ef... 4207c0e... M README.md +:100755 000000 077cb64... 0000000... D lokingyql/__init__.py +:100755 000000 b27bbfe... 0000000... D lokingyql/contrib/__init__.py +:100755 000000 ca3c7c4... 0000000... D lokingyql/contrib/table/__init__.py +:100755 000000 a024c30... 0000000... D lokingyql/contrib/table/binder.py +:100755 000000 33883f0... 0000000... D lokingyql/contrib/table/run_tests.sh +:100755 000000 14247d6... 0000000... D lokingyql/contrib/table/table.py +:100755 000000 e06f712... 0000000... D lokingyql/contrib/table/tests.py +:100755 000000 f3b503b... 0000000... D lokingyql/contrib/table/tests_data/jscode.js +:100755 000000 6959faf... 0000000... D lokingyql/contrib/yahooauth/__init__.py +:100755 000000 6d2121b... 0000000... D lokingyql/contrib/yahooauth/readme.md +:100755 000000 12c6787... 0000000... D lokingyql/contrib/yahooauth/yahooauth.py +:100755 000000 3c42acc... 0000000... D lokingyql/errors.py +:100755 000000 85a38b9... 0000000... D lokingyql/lokingyql.py +:000000 100755 0000000... a1be23e... A myql/__init__.py +:000000 100755 0000000... b27bbfe... A myql/contrib/__init__.py +:000000 100755 0000000... ca3c7c4... A myql/contrib/table/__init__.py +:000000 100755 0000000... a024c30... A myql/contrib/table/binder.py +:000000 100755 0000000... 33883f0... A myql/contrib/table/run_tests.sh +:000000 100755 0000000... 14247d6... A myql/contrib/table/table.py +:000000 100755 0000000... e06f712... A myql/contrib/table/tests.py +:000000 100755 0000000... f3b503b... A myql/contrib/table/tests_data/jscode.js +:000000 100755 0000000... 6959faf... A myql/contrib/yahooauth/__init__.py +:000000 100755 0000000... 6d2121b... A myql/contrib/yahooauth/readme.md +:000000 100755 0000000... 12c6787... A myql/contrib/yahooauth/yahooauth.py +:000000 100755 0000000... 3c42acc... A myql/errors.py +:000000 100755 0000000... ff41911... A myql/myql.py +:100755 100755 350b4f3... e307827... M setup.py +:100755 100755 1497e2b... 4723e63... M tests/tests.py + +user:josuebrunel +1428288879 +:100755 100755 4207c0e... b715812... M README.md + +user:josuebrunel +1428292619 +:100755 100755 e06f712... 24373a8... M myql/contrib/table/tests.py + +user:josuebrunel +1428292671 +:100755 100755 a024c30... f29afbc... M myql/contrib/table/binder.py + +user:josuebrunel +1428296495 +:100755 100755 f29afbc... 04656f3... M myql/contrib/table/binder.py + +user:josuebrunel +1428296716 +:100755 100755 14247d6... a98d46b... M myql/contrib/table/table.py + +user:josuebrunel +1428296777 +:100755 100755 04656f3... 63aca03... M myql/contrib/table/binder.py + +user:josuebrunel +1428296816 +:100755 100755 a98d46b... 2afd5b6... M myql/contrib/table/table.py + +user:josuebrunel +1428312650 +:100755 100755 24373a8... 199eba0... M myql/contrib/table/tests.py + +user:josuebrunel +1428312725 +:100755 100755 63aca03... 0734d13... M myql/contrib/table/binder.py + +user:josuebrunel +1428313674 +:100755 100755 0734d13... ab7305d... M myql/contrib/table/binder.py +:100755 100755 2afd5b6... a786fa5... M myql/contrib/table/table.py + +user:josuebrunel +1428401338 +:100755 100755 e307827... a3931c5... M setup.py + +user:josuebrunel +1428404897 +:100755 100755 ab7305d... b5a8898... M myql/contrib/table/binder.py + +user:josuebrunel +1428404897 +:100755 100755 ab7305d... b5a8898... M myql/contrib/table/binder.py + +user:josuebrunel +1428404997 +user:josuebrunel +1428408756 +:100755 100755 b5a8898... b4ccc2b... M myql/contrib/table/binder.py + +user:josuebrunel +1428499400 +:100755 000000 33883f0... 0000000... D myql/contrib/table/run_tests.sh +:100755 100755 a786fa5... e4c3846... M myql/contrib/table/table.py +:100755 000000 199eba0... 0000000... D myql/contrib/table/tests.py +:100755 000000 f3b503b... 0000000... D myql/contrib/table/tests_data/jscode.js +:100755 100755 38c28c8... 33883f0... M run_tests.sh +:100755 100755 e92dd39... 031965b... M tests/__init__.py +:100755 100755 4723e63... 99a9aa2... M tests/tests.py + +user:josuebrunel +1428499712 +:000000 100755 0000000... f3b503b... A tests_data/jscode.js + +user:josuebrunel +1428500186 +:000000 100644 0000000... 15176ce... A .travis.yml + +user:josuebrunel +1428500703 +:100755 100755 b715812... aabceac... M README.md + +user:josuebrunel +1428504137 +user:josuebrunel +1428566500 +:100755 100755 e4c3846... 6b34b96... M myql/contrib/table/table.py + +user:josuebrunel +1428567530 +:100755 100755 6b34b96... e58218f... M myql/contrib/table/table.py +:100755 100755 99a9aa2... 8678a8a... M tests/tests.py + +user:josuebrunel +1428596109 +:100755 100755 e58218f... f0e5204... M myql/contrib/table/table.py + +user:josuebrunel +1428679009 +:100755 100755 f0e5204... 22c4986... M myql/contrib/table/table.py + +user:josuebrunel +1428719248 +:100755 100755 22c4986... 6f8d4f1... M myql/contrib/table/table.py + +user:josuebrunel +1428743361 +:100755 100755 b4ccc2b... 5bd0b86... M myql/contrib/table/binder.py +:100755 100755 6f8d4f1... 9a29a2f... M myql/contrib/table/table.py + +user:josuebrunel +1428743731 +:000000 100644 0000000... 5592db8... A myql/contrib/table/base.py + +user:josuebrunel +1428745632 +:100755 100755 5bd0b86... 536a5db... M myql/contrib/table/binder.py + +user:josuebrunel +1428747637 +:100644 100644 5592db8... 25c048e... M myql/contrib/table/base.py + +user:josuebrunel +1428751208 +:100755 100755 536a5db... 07a766e... M myql/contrib/table/binder.py + +user:josuebrunel +1428752774 +:100644 100644 25c048e... bde4f2a... M myql/contrib/table/base.py +:100755 100755 9a29a2f... d67a026... M myql/contrib/table/table.py + +user:josuebrunel +1428872574 +:000000 100644 0000000... f9bd145... A MANIFEST.in + +user:josuebrunel +1429000209 +:100644 100644 bde4f2a... 952e0ed... M myql/contrib/table/base.py + +user:josuebrunel +1429005388 +:100755 100755 ca3c7c4... 93f0c64... M myql/contrib/table/__init__.py + +user:josuebrunel +1429006309 +:100755 100755 8678a8a... 8ca697e... M tests/tests.py + +user:josuebrunel +1429006686 +:100644 100644 952e0ed... c1fd2fd... M myql/contrib/table/base.py + +user:josuebrunel +1429009356 +:100755 100755 07a766e... ed41479... M myql/contrib/table/binder.py + +user:josuebrunel +1429009641 +:100644 100644 c1fd2fd... bca2931... M myql/contrib/table/base.py + +user:josuebrunel +1429009656 +:100644 100644 bca2931... 91dc2d4... M myql/contrib/table/base.py + +user:josuebrunel +1429010151 +:100755 100755 ed41479... 5df48de... M myql/contrib/table/binder.py + +user:josuebrunel +1429010284 +:100755 100755 5df48de... 2654d93... M myql/contrib/table/binder.py + +user:josuebrunel +1429010313 +:100755 100755 2654d93... 9e952bc... M myql/contrib/table/binder.py + +user:josuebrunel +1429010361 +:100755 100755 8ca697e... d49a8be... M tests/tests.py + +user:josuebrunel +1429011619 +:100755 100755 9e952bc... b55f9d7... M myql/contrib/table/binder.py + +user:josuebrunel +1429011682 +:100755 100755 b55f9d7... 323d5b4... M myql/contrib/table/binder.py + +user:josuebrunel +1429015358 +:100755 100755 d49a8be... 4fa0667... M tests/tests.py + +user:josuebrunel +1429026573 +:100644 100644 91dc2d4... 77580eb... M myql/contrib/table/base.py + +user:josuebrunel +1429029138 +:100644 100644 77580eb... 2346816... M myql/contrib/table/base.py + +user:josuebrunel +1429029632 +:100755 100755 4fa0667... b9dd7a3... M tests/tests.py + +user:josuebrunel +1429029657 +:100755 100755 323d5b4... 3002c42... M myql/contrib/table/binder.py + +user:josuebrunel +1429029893 +:100755 100755 b9dd7a3... 1f05957... M tests/tests.py + +user:josuebrunel +1429033198 +:100644 100644 2346816... 2d5400f... M myql/contrib/table/base.py +:100755 100755 3002c42... f5b0463... M myql/contrib/table/binder.py +:100755 100755 1f05957... b389767... M tests/tests.py + +user:josuebrunel +1429082787 +:100644 100644 2d5400f... 63193ad... M myql/contrib/table/base.py + +user:josuebrunel +1429083327 +:100755 100755 f5b0463... d100c29... M myql/contrib/table/binder.py + +user:josuebrunel +1429092269 +:100644 100644 63193ad... 2c1cf94... M myql/contrib/table/base.py + +user:josuebrunel +1429095764 +:100644 100644 2c1cf94... 4ae4326... M myql/contrib/table/base.py +:100755 100755 d100c29... 60b36c2... M myql/contrib/table/binder.py + +user:josuebrunel +1429098078 +:100644 100644 4ae4326... 6f59d44... M myql/contrib/table/base.py + +user:josuebrunel +1429104507 +:100644 100644 6f59d44... e9425a1... M myql/contrib/table/base.py +:100755 100755 60b36c2... d88b3df... M myql/contrib/table/binder.py +:100755 100755 b389767... b1098e2... M tests/tests.py + +user:josuebrunel +1429167590 +:100755 100755 b1098e2... 104641c... M tests/tests.py + +user:josuebrunel +1429167975 +:100755 100755 d88b3df... 9b2a631... M myql/contrib/table/binder.py + +user:josuebrunel +1429168083 +:100755 100755 104641c... 21c2232... M tests/tests.py + +user:josuebrunel +1429168454 +:100755 100755 d67a026... aa866b8... M myql/contrib/table/table.py + +user:josuebrunel +1429168505 +:000000 100644 0000000... eaeb193... A myql/contrib/table/example.py + +user:josuebrunel +1429184705 +:100755 100755 9b2a631... 8fcc506... M myql/contrib/table/binder.py + +user:josuebrunel +1429244044 +:100755 100755 8fcc506... 0053e83... M myql/contrib/table/binder.py + +user:josuebrunel +1429244062 +:100755 100755 aa866b8... 6f97510... M myql/contrib/table/table.py + +user:josuebrunel +1429472779 +:000000 100644 0000000... 1895e6e... A myql/contrib/yahooauth/auth.py + +user:josuebrunel +1429472901 +:100755 100755 b27bbfe... 4a3d61d... M myql/contrib/__init__.py +:100755 100755 12c6787... fd4e18a... M myql/contrib/yahooauth/yahooauth.py +:100755 100755 dd5565d... 235213f... M requirements.txt + +user:josuebrunel +1429473512 +:100644 100644 1895e6e... a08e98c... M myql/contrib/yahooauth/auth.py + +user:josuebrunel +1429531283 +:100755 100755 4a3d61d... 167809b... M myql/contrib/__init__.py +:000000 100755 0000000... 6959faf... A myql/contrib/auth/__init__.py +:000000 100644 0000000... a08e98c... A myql/contrib/auth/auth.py +:000000 100755 0000000... 6d2121b... A myql/contrib/auth/readme.md +:000000 100755 0000000... fd4e18a... A myql/contrib/auth/yahooauth.py +:100755 000000 6959faf... 0000000... D myql/contrib/yahooauth/__init__.py +:100644 000000 a08e98c... 0000000... D myql/contrib/yahooauth/auth.py +:100755 000000 6d2121b... 0000000... D myql/contrib/yahooauth/readme.md +:100755 000000 fd4e18a... 0000000... D myql/contrib/yahooauth/yahooauth.py + +user:josuebrunel +1429535795 +:100644 100644 a08e98c... 318eedc... M myql/contrib/auth/auth.py + +user:josuebrunel +1429538668 +:100644 100644 318eedc... 3f1751a... M myql/contrib/auth/auth.py + +user:josuebrunel +1429538930 +:100644 100644 3f1751a... 8f2aa79... M myql/contrib/auth/auth.py + +user:josuebrunel +1429539451 +:100755 100755 6959faf... 0e8038c... M myql/contrib/auth/__init__.py +:100755 000000 fd4e18a... 0000000... D myql/contrib/auth/yahooauth.py + +user:josuebrunel +1429540141 +:100755 100755 031965b... ecadf74... M tests/__init__.py +:100755 100755 21c2232... 1b96dee... M tests/tests.py + +user:josuebrunel +1429540241 +:100755 100755 ff41911... 6cc7b1e... M myql/myql.py + +user:josuebrunel +1429540753 +:100755 100755 0e8038c... 05d034a... M myql/contrib/auth/__init__.py + +user:josuebrunel +1429542492 +:100644 100644 8f2aa79... c8fdafd... M myql/contrib/auth/auth.py + +user:josuebrunel +1429544068 +:100644 100644 c8fdafd... 00cf96a... M myql/contrib/auth/auth.py + +user:josuebrunel +1429623563 +:100644 100644 00cf96a... 51f136a... M myql/contrib/auth/auth.py + +user:josuebrunel +1429623899 +:100755 100755 6cc7b1e... 456242f... M myql/myql.py + +user:josuebrunel +1429625520 +:100755 100755 456242f... 3aded31... M myql/myql.py + +user:josuebrunel +1429625578 +:100644 100644 51f136a... c03800c... M myql/contrib/auth/auth.py + +user:josuebrunel +1429630161 +:100644 100644 c03800c... dd7d49b... M myql/contrib/auth/auth.py + +user:josuebrunel +1429630196 +:100755 100755 1b96dee... 1988ae4... M tests/tests.py + +user:josuebrunel +1429717591 +:100644 100644 dd7d49b... c36ebd1... M myql/contrib/auth/auth.py +:100755 100755 1988ae4... a231219... M tests/tests.py + +user:josuebrunel +1429782438 +:100644 100644 c36ebd1... d4815d3... M myql/contrib/auth/auth.py + +user:josuebrunel +1429783051 +:100644 100644 d4815d3... 61288f7... M myql/contrib/auth/auth.py + +user:josuebrunel +1429783748 +:100755 100755 6d2121b... 0e8ad1f... M myql/contrib/auth/readme.md + +user:josuebrunel +1429784769 +:100644 100644 61288f7... 744333f... M myql/contrib/auth/auth.py + +user:josuebrunel +1429790409 +:100644 100644 744333f... 88cc47f... M myql/contrib/auth/auth.py + +user:josuebrunel +1429791093 +:100644 100644 88cc47f... c007db6... M myql/contrib/auth/auth.py +:100755 100755 3aded31... 74f2a52... M myql/myql.py +:100755 000000 5389972... 0000000... D tests/test_config.py +:100755 100755 a231219... ba28ac0... M tests/tests.py + +user:josuebrunel +1429797382 +:100644 100644 c007db6... c8b8f96... M myql/contrib/auth/auth.py +:100755 100755 ba28ac0... 05071e6... M tests/tests.py + +user:josuebrunel +1429802128 +:100755 100755 74f2a52... c4cd250... M myql/myql.py + +user:josuebrunel +1429850210 +:100755 100755 c4cd250... 3b720ac... M myql/myql.py + +user:josuebrunel +1429948166 +:100644 100644 c8b8f96... c205f25... M myql/contrib/auth/auth.py + +user:josuebrunel +1429949202 +:000000 100644 0000000... da37213... A myql/contrib/auth/docs/docs/index.md +:000000 100644 0000000... c97182f... A myql/contrib/auth/docs/mkdocs.yml + +user:josuebrunel +1429953136 +:100755 100755 e49de98... 27b3734... M .gitignore +:000000 100644 0000000... da37213... A docs/docs/index.md +:000000 100644 0000000... c97182f... A docs/mkdocs.yml +:100644 000000 da37213... 0000000... D myql/contrib/auth/docs/docs/index.md +:100644 000000 c97182f... 0000000... D myql/contrib/auth/docs/mkdocs.yml + +user:josuebrunel +1429953250 +:100755 100755 27b3734... a2063ee... M .gitignore +:100755 100755 aabceac... 50bf978... M README.md +:000000 100644 0000000... c22556a... A docs/docs/contrib.md +:100644 100644 da37213... 4d10f37... M docs/docs/index.md +:000000 100644 0000000... ae8381b... A docs/docs/table.md +:100644 100644 c97182f... 3bd74ac... M docs/mkdocs.yml + +user:josuebrunel +1429954879 +:000000 100644 0000000... c22556a... A docs/contrib.md +:100644 000000 c22556a... 0000000... D docs/docs/contrib.md +:100644 000000 4d10f37... 0000000... D docs/docs/index.md +:100644 000000 ae8381b... 0000000... D docs/docs/table.md +:000000 100644 0000000... 4d10f37... A docs/index.md +:100644 000000 3bd74ac... 0000000... D docs/mkdocs.yml +:000000 100644 0000000... ae8381b... A docs/table.md +:000000 100644 0000000... 3bd74ac... A mkdocs.yml + +user:josuebrunel +1429981940 +:100755 100755 50bf978... 20710a3... M README.md + +user:josuebrunel +1430063293 +:100644 100644 c205f25... 52e9b47... M myql/contrib/auth/auth.py + +user:josuebrunel +1430135057 +:100755 100755 20710a3... 38ac84e... M README.md + +user:josuebrunel +1430217518 +:100644 100644 3bd74ac... 43f7214... M mkdocs.yml + +user:josuebrunel +1430223791 +:100644 100644 ae8381b... 192208b... M docs/table.md +:100644 100644 3bd74ac... 43f7214... M mkdocs.yml +:000000 100644 0000000... 8b13789... A myql/contrib/table/exceptions.py + +user:josuebrunel +1430224943 +:100755 100755 38ac84e... 3902f80... M README.md + +user:josuebrunel +1430228124 +:100644 100644 192208b... 945496e... M docs/table.md +:100644 100644 43f7214... 66cd5d6... M mkdocs.yml + +user:josuebrunel +1430228935 +:100644 100644 945496e... e63cd28... M docs/table.md + +user:josuebrunel +1430229660 +:100644 100644 e63cd28... f5fcd66... M docs/table.md + +user:josuebrunel +1430231565 +:100644 100644 4d10f37... 4c7f589... M docs/index.md +:100644 100644 f5fcd66... 4ae7641... M docs/table.md +:100644 100644 eaeb193... 2fbaa9a... M myql/contrib/table/example.py + +user:josuebrunel +1430231946 +user:josuebrunel +1430247628 +:100644 100644 4ae7641... 43cd65f... M docs/table.md + +user:josuebrunel +1430247641 +user:josuebrunel +1430508395 +:100755 100755 235213f... a7543ef... M requirements.txt + +user:josuebrunel +1430594633 +:000000 100644 0000000... d9e840a... A myql/contrib/auth/yoauth.py + +user:josuebrunel +1430598916 +:100755 100755 05d034a... b653833... M myql/contrib/auth/__init__.py +:100644 100644 52e9b47... af33348... M myql/contrib/auth/auth.py +:100644 100644 d9e840a... 2e361b2... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430600526 +:000000 100644 0000000... 9291723... A myql/contrib/auth/credentials.json +:100644 100644 2e361b2... 4772818... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430600744 +:100755 000000 0e8ad1f... 0000000... D myql/contrib/auth/readme.md +:100755 100755 3b720ac... 51c3192... M myql/myql.py +:100755 100755 05071e6... 5c8a90c... M tests/tests.py + +user:josuebrunel +1430601799 +:100644 100644 4772818... 139e328... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430601909 +:100755 100755 51c3192... 960ca7c... M myql/myql.py + +user:josuebrunel +1430602617 +:100644 100644 139e328... b44ff9d... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430603134 +:100644 000000 9291723... 0000000... D myql/contrib/auth/credentials.json + +user:josuebrunel +1430603335 +:100644 100644 b44ff9d... bde544a... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430603680 +:100644 100644 bde544a... 638933c... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1430607740 +:100755 100755 3902f80... 85eca8f... M README.md +:100644 100644 4c7f589... c60253e... M docs/index.md +:000000 100644 0000000... 3f3e39c... A docs/myql.md +:000000 100644 0000000... 54e0162... A docs/oauth.md +:100644 100644 43cd65f... b62443d... M docs/table.md +:100644 100644 43f7214... 88fb5b9... M mkdocs.yml + +user:josuebrunel +1430625605 +:100755 100755 a2063ee... 49b33e8... M .gitignore + +user:josuebrunel +1430630448 +:100644 100644 88fb5b9... 2c5b4f5... M mkdocs.yml + +user:josuebrunel +1430651281 +:100755 100755 85eca8f... 0c5753d... M README.md +:100644 100644 c60253e... eb8c93b... M docs/index.md +:100644 100644 3f3e39c... 3c82400... M docs/myql.md +:100644 100644 54e0162... 7d32c5c... M docs/oauth.md +:100644 100644 2c5b4f5... e073cae... M mkdocs.yml + +user:josuebrunel +1430652653 +:100644 100644 7d32c5c... e5f1afe... M docs/oauth.md + +user:josuebrunel +1430652679 +:000000 100644 0000000... aac93ff... A setup.cfg +:100755 100755 a3931c5... 58eadad... M setup.py + +user:josuebrunel +1430653878 +:100755 100755 58eadad... f104898... M setup.py + +user:josuebrunel +1430654610 +:100644 100644 aac93ff... b88034e... M setup.cfg + +user:josuebrunel +1430655076 +:100755 100755 a7543ef... 235213f... M requirements.txt + +user:josuebrunel +1430655328 +:100755 100755 235213f... 436a279... M requirements.txt + +user:josuebrunel +1430656089 +:100755 100755 f104898... ab4d248... M setup.py + +user:josuebrunel +1430657928 +:000000 100755 0000000... b2d4be2... A publish_package.sh +:100755 100755 436a279... 83a959f... M requirements.txt + +user:josuebrunel +1430658436 +:100755 100755 b2d4be2... daeeaeb... M publish_package.sh + +user:josuebrunel +1430665426 +:100755 100755 0c5753d... e3f6ddb... M README.md + +user:josuebrunel +1430665499 +:100755 100755 ab4d248... e83ffb6... M setup.py + +user:The Gitter Badger +1430812038 +:100755 100755 e3f6ddb... d668328... M README.md + +user:Josue Kouka +1430814884 +user:josuebrunel +1430814950 +:100755 100755 d668328... 4904850... M README.md + +user:josuebrunel +1430839229 +:100755 100755 4904850... e162e6f... M README.md + +user:josuebrunel +1430893214 +:100755 100755 5c8a90c... a313178... M tests/tests.py + +user:josuebrunel +1430898939 +:100755 100755 a313178... 52b7b20... M tests/tests.py + +user:josuebrunel +1430899293 +:100755 100755 52b7b20... 2cda54d... M tests/tests.py + +user:josuebrunel +1431085696 +:100755 100755 960ca7c... b482ab7... M myql/myql.py + +user:josuebrunel +1431086510 +:000000 100644 0000000... 20c59e8... A README.rst + +user:josuebrunel +1431146890 +:100755 100755 83a959f... 710e1aa... M requirements.txt + +user:josuebrunel +1431151649 +:100755 100755 710e1aa... 3bea596... M requirements.txt + +user:josuebrunel +1431181242 +:100755 100755 33883f0... 1d47142... M run_tests.sh + +user:josuebrunel +1431181623 +:100755 100755 e162e6f... 71cc298... M README.md +:100644 100644 20c59e8... 34d4e03... M README.rst +:100755 100755 e83ffb6... e18420b... M setup.py + +user:josuebrunel +1431181990 +:100755 100755 71cc298... e29d8ff... M README.md +:100644 100644 34d4e03... 916a43f... M README.rst + +user:josuebrunel +1431182181 +:100755 100755 e18420b... 6f9747a... M setup.py + +user:josuebrunel +1431182331 +:100644 100644 f9bd145... 8e5e8a9... M MANIFEST.in + +user:josuebrunel +1431183655 +:100755 100755 6f9747a... 0bd9a59... M setup.py + +user:josuebrunel +1431185876 +:100755 100755 0bd9a59... 0c1f7e9... M setup.py + +user:josuebrunel +1431235333 +:100755 100755 e29d8ff... f1feb30... M README.md + +user:josuebrunel +1431283211 +:000000 100755 0000000... a13921b... A convert_to_rst.sh +:100755 100755 0c1f7e9... c2026b5... M setup.py + +user:josuebrunel +1431295881 +:100755 100755 b482ab7... 764f562... M myql/myql.py +:100755 100755 2cda54d... adb4baa... M tests/tests.py + +user:josuebrunel +1431295906 +:100755 100755 1d47142... 97f7322... M run_tests.sh + +user:josuebrunel +1431296009 +user:josuebrunel +1431296077 +user:josuebrunel +1431296698 +:100755 100755 adb4baa... 672cbfc... M tests/tests.py + +user:josuebrunel +1431296722 +user:josuebrunel +1431296973 +:100755 100755 672cbfc... 74e015f... M tests/tests.py + +user:josuebrunel +1431385088 +:100755 100755 672cbfc... c2b079a... M tests/tests.py + +user:josuebrunel +1431385413 +:000000 100644 0000000... b2b86eb... A myql/contrib/stockscraper/__init__.py +:000000 100644 0000000... 9e341e6... A myql/contrib/stockscraper/stockretriever.py +:100755 100755 c2b079a... edd3942... M tests/tests.py + +user:josuebrunel +1431386264 +:100755 100755 97f7322... 6ff6607... M run_tests.sh + +user:josuebrunel +1431387030 +:100755 100755 edd3942... b2aa091... M tests/tests.py + +user:josuebrunel +1431387049 +:100644 100644 9e341e6... bf861cd... M myql/contrib/stockscraper/stockretriever.py + +user:josuebrunel +1431387643 +:100644 100644 bf861cd... ce12c00... M myql/contrib/stockscraper/stockretriever.py +:100755 100755 b2aa091... a6b3bb7... M tests/tests.py + +user:josuebrunel +1431388001 +:100755 100755 6ff6607... 295a6db... M run_tests.sh + +user:josuebrunel +1431388513 +:100755 100755 a6b3bb7... d91b615... M tests/tests.py + +user:josuebrunel +1431388966 +:100755 100755 295a6db... 2180e3b... M run_tests.sh +:100755 100755 d91b615... 06d53ee... M tests/tests.py + +user:josuebrunel +1431409297 +:100755 100755 06d53ee... 2011423... M tests/tests.py + +user:josuebrunel +1431412855 +:100644 100644 ce12c00... b23f5b9... M myql/contrib/stockscraper/stockretriever.py +:100755 100755 764f562... 5ffde1d... M myql/myql.py + +user:josuebrunel +1431418190 +:100755 100755 ecadf74... bd6d96e... M tests/__init__.py + +user:josuebrunel +1431419957 +:100755 100755 e29d8ff... b0a3753... M README.md + +user:josuebrunel +1431421454 +:100755 100755 2011423... 3a5e1d5... M tests/tests.py + +user:josuebrunel +1431421478 +:100644 100644 b23f5b9... 3174e01... M myql/contrib/stockscraper/stockretriever.py + +user:josuebrunel +1431422329 +:100644 100644 3174e01... d82efb1... M myql/contrib/stockscraper/stockretriever.py +:100755 100755 3a5e1d5... 8bbba91... M tests/tests.py + +user:josuebrunel +1431422687 +:100755 100755 2180e3b... 5619da3... M run_tests.sh + +user:josuebrunel +1431423649 +:100755 100755 8bbba91... 55d2218... M tests/tests.py + +user:josuebrunel +1431423939 +user:josuebrunel +1431424490 +:100755 100755 b0a3753... a69eb1a... M README.md + +user:josuebrunel +1431425098 +:100755 100755 55d2218... 3c05580... M tests/tests.py + +user:Josue Kouka +1431427070 +:100755 100755 9b3f873... 8fce556... M README.md + +user:josuebrunel +1431436812 +:100755 100755 3c05580... 25aa2e4... M tests/tests.py + +user:josuebrunel +1431436855 +:100755 100755 5ffde1d... 026787f... M myql/myql.py + +user:josuebrunel +1431437198 +:100755 100755 25aa2e4... b99376c... M tests/tests.py + +user:josuebrunel +1431439106 +:100755 100755 b99376c... c8357c3... M tests/tests.py + +user:josuebrunel +1431439128 +:100755 100755 026787f... b28979b... M myql/myql.py + +user:josuebrunel +1431440313 +:100755 100755 c8357c3... 130942b... M tests/tests.py + +user:josuebrunel +1431441020 +:100755 100755 130942b... 92afc55... M tests/tests.py + +user:josuebrunel +1431441278 +:100755 100755 92afc55... 82da9c2... M tests/tests.py + +user:josuebrunel +1431441716 +:100755 100755 b28979b... d1978d1... M myql/myql.py + +user:josuebrunel +1431442978 +:100755 100755 d1978d1... 19a3249... M myql/myql.py + +user:josuebrunel +1431443099 +:100755 100755 19a3249... 779a9db... M myql/myql.py + +user:josuebrunel +1431443779 +:100755 100755 a69eb1a... 1ed6f26... M README.md + +user:Josue Kouka +1431443960 +user:Josue Kouka +1431511005 +user:Josue Kouka +1431521880 +user:josuebrunel +1431611465 +:100755 100755 4e48c15... 1fc5977... M README.md + +user:josuebrunel +1431612751 +:100755 100755 1fc5977... efcf442... M README.md +:100644 100644 eb8c93b... c38b56d... M docs/index.md +:100644 100644 3c82400... bcf01ed... M docs/myql.md + +user:josuebrunel +1431613803 +:100755 100755 0f81fa2... 0741915... M tests/README.md + +user:josuebrunel +1431613825 +:100644 100644 c22556a... 6dd3676... M docs/contrib.md + +user:Josue Kouka +1431633613 +user:josuebrunel +1431680977 +:100755 100755 b653833... 1a7e3eb... M myql/contrib/auth/__init__.py +:100644 000000 af33348... 0000000... D myql/contrib/auth/auth.py + +user:josuebrunel +1431692115 +:100755 100755 efcf442... 45242b0... M README.md +:100644 100644 638933c... e4c8cd4... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1431692723 +:100755 100755 d7f1051... c304a72... M LICENSE +:100755 100755 c2026b5... 9570705... M setup.py + +user:josuebrunel +1431694826 +:100644 100644 e4c8cd4... 7134eed... M myql/contrib/auth/yoauth.py + +user:Josue Kouka +1431694955 +user:josuebrunel +1431838340 +:100755 100755 82da9c2... dba0075... M tests/tests.py + +user:josuebrunel +1431838408 +:100755 100755 779a9db... 4114bdc... M myql/myql.py + +user:josuebrunel +1431839108 +:100755 100755 4114bdc... 7ee47e7... M myql/myql.py + +user:Josue Kouka +1431894903 +user:josuebrunel +1431948333 +:100755 100755 45242b0... 12c7e6a... M README.md + +user:josuebrunel +1431948704 +:100755 100755 12c7e6a... 748aa76... M README.md +:100644 100644 916a43f... e08f0aa... M README.rst +:100644 100644 c38b56d... 88acbd3... M docs/index.md +:100644 100644 bcf01ed... a3c2d1c... M docs/myql.md + +user:josuebrunel +1431949183 +:100755 100755 7ee47e7... 0688211... M myql/myql.py + +user:Josue Kouka +1431950665 +user:josuebrunel +1432022660 +:100755 100755 dba0075... 2a10b25... M tests/tests.py + +user:josuebrunel +1432022961 +:100644 100644 e9425a1... 4d1ea01... M myql/contrib/table/base.py +:100755 100755 6f97510... 2bfd2b8... M myql/contrib/table/table.py +:100755 100755 0688211... 9f651d0... M myql/myql.py + +user:josuebrunel +1432108940 +:100644 100644 a3c2d1c... 3b9593d... M docs/myql.md +:000000 100644 0000000... 39211bf... A docs/stockscraper.md +:100644 100644 e073cae... f985a4d... M mkdocs.yml + +user:josuebrunel +1432108969 +user:Josue Kouka +1432114034 +:100644 100644 e08f0aa... a499054... M README.rst + +user:josuebrunel +1432114802 +:100644 100644 a499054... 9cfb9cc... M README.rst + +user:josuebrunel +1432115049 +:100644 100644 9cfb9cc... dc9a05a... M README.rst + +user:josuebrunel +1432115265 +:100644 100644 dc9a05a... d575e6c... M README.rst +:100755 100755 a13921b... bf83bfd... M convert_to_rst.sh + +user:josuebrunel +1432122832 +:100755 100755 2a10b25... ee22f44... M tests/tests.py + +user:josuebrunel +1432125514 +:100755 100755 5619da3... 6255020... M run_tests.sh +:100755 100755 bd6d96e... b75f261... M tests/__init__.py +:100755 100755 ee22f44... a4ec00d... M tests/tests.py + +user:josuebrunel +1432125568 +:100755 100755 167809b... b0ad4f3... M myql/contrib/__init__.py +:100644 100644 b2b86eb... 98ec2e1... M myql/contrib/stockscraper/__init__.py +:100644 100644 d82efb1... dde969d... M myql/contrib/stockscraper/stockretriever.py +:000000 100644 0000000... f3b503b... A myql/contrib/table/func.js +:000000 100644 0000000... dac38a3... A myql/contrib/table/mytable.py +:000000 100644 0000000... e69de29... A myql/contrib/weather/__init__.py +:000000 100644 0000000... e69de29... A myql/contrib/weather/weather.py + +user:josuebrunel +1432125628 +:100644 000000 e69de29... 0000000... D myql/contrib/weather/__init__.py +:100644 000000 e69de29... 0000000... D myql/contrib/weather/weather.py + +user:josuebrunel +1432127558 +:100644 100644 39211bf... 2428e34... M docs/stockscraper.md + +user:josuebrunel +1432129094 +:100644 100644 2428e34... 0df7e06... M docs/stockscraper.md + +user:josuebrunel +1432130342 +:100644 100644 6dd3676... 9ed6273... M docs/contrib.md + +user:Josue Kouka +1432133085 +user:josuebrunel +1432134920 +:100755 100755 6255020... eaa076f... M run_tests.sh +:100755 100755 a4ec00d... a7f5ed2... M tests/tests.py + +user:Josue Kouka +1432155790 +user:josuebrunel +1432199120 +:100755 100755 eaa076f... 372c181... M run_tests.sh + +user:josuebrunel +1432199143 +user:josuebrunel +1432203509 +:100755 100755 9f651d0... f4d6576... M myql/myql.py + +user:josuebrunel +1432203602 +:100755 100755 a1be23e... 2591317... M myql/__init__.py +:000000 100644 0000000... a9083be... A myql/utils.py + +user:josuebrunel +1432203707 +:100755 100755 bf83bfd... 99b9c58... M convert_to_rst.sh +:100755 100755 a7f5ed2... 152c5e7... M tests/tests.py + +user:josuebrunel +1432208572 +:100755 100755 f4d6576... d18cb0f... M myql/myql.py + +user:josuebrunel +1432208983 +:100644 100644 d575e6c... 7153a15... M README.rst +:100755 100755 d18cb0f... 94b5f18... M myql/myql.py +:100755 100755 372c181... 1515e9a... M run_tests.sh + +user:Josue Kouka +1432210921 +user:Josue Kouka +1432211975 +user:josuebrunel +1432212668 +:100755 100755 748aa76... 0c00ed4... M README.md +:100644 100644 88acbd3... 54cbbf4... M docs/index.md +:100644 100644 f985a4d... 084b09d... M mkdocs.yml +:100755 100755 9570705... c3a3914... M setup.py + +user:Josue Kouka +1432213682 +user:Josue Kouka +1432217744 +:100755 100755 2591317... d3a4d14... M myql/__init__.py +:100755 100755 b0ad4f3... a38209b... M myql/contrib/__init__.py +:100755 100755 1a7e3eb... 67e22e7... M myql/contrib/auth/__init__.py +:100644 100644 98ec2e1... fa42c42... M myql/contrib/stockscraper/__init__.py +:100755 100755 93f0c64... 76d0c5a... M myql/contrib/table/__init__.py +:100755 100755 0053e83... daf1619... M myql/contrib/table/binder.py +:100755 100755 2bfd2b8... 4a48f43... M myql/contrib/table/table.py +:100755 100755 94b5f18... 46c773b... M myql/myql.py +:100755 100755 1515e9a... 12495a0... M run_tests.sh +:100755 100755 b75f261... 509bd84... M tests/__init__.py +:100755 100755 152c5e7... 264eac6... M tests/tests.py + +user:Josue Kouka +1432262010 +user:josuebrunel +1432274281 +:100644 100644 a9083be... 013a225... M myql/utils.py + +user:josuebrunel +1432318223 +:100644 100644 15176ce... 53590c5... M .travis.yml + +user:josuebrunel +1432319093 +:100755 100755 264eac6... ec7736c... M tests/tests.py + +user:josuebrunel +1432320059 +:100644 100644 013a225... 77a1639... M myql/utils.py + +user:josuebrunel +1432320706 +:100755 100755 d3a4d14... debf5a8... M myql/__init__.py +:100644 100644 dde969d... 6250363... M myql/contrib/stockscraper/stockretriever.py +:100755 100755 46c773b... a3c862d... M myql/myql.py + +user:josuebrunel +1432320961 +:100644 100644 7134eed... c8d83b2... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1432321678 +:100644 100644 53590c5... 4bd435c... M .travis.yml + +user:josuebrunel +1432321699 +:100755 100755 3bea596... d3565ac... M requirements.txt + +user:josuebrunel +1432321730 +:100755 100755 509bd84... af963fb... M tests/__init__.py +:100755 100755 ec7736c... 1f81324... M tests/tests.py + +user:josuebrunel +1432321801 +:100755 100755 c3a3914... ef18dd9... M setup.py + +user:Josue Kouka +1432324502 +user:Josue Kouka +1432324825 +user:josuebrunel +1432327920 +:100644 100644 54cbbf4... 8d4f0cd... M docs/index.md + +user:josuebrunel +1432352519 +:100755 100755 0c00ed4... 5b76956... M README.md + +user:josuebrunel +1432352601 +:100755 100755 0c00ed4... b024dd7... M README.md + +user:josuebrunel +1432352607 +user:josuebrunel +1432443441 +:100755 100755 ba1fa0a... be8243a... M README.md +:100755 100755 1f81324... d7c464c... M tests/tests.py + +user:josuebrunel +1432443483 +:100644 100644 6250363... 69f281e... M myql/contrib/stockscraper/stockretriever.py + +user:josuebrunel +1432443931 +:100644 100644 69f281e... f14059e... M myql/contrib/stockscraper/stockretriever.py +:100755 100755 d7c464c... 0a27721... M tests/tests.py + +user:josuebrunel +1432444472 +:100644 100644 0df7e06... 8d89783... M docs/stockscraper.md + +user:josuebrunel +1432444596 +:100644 100644 4bd435c... 2c8423b... M .travis.yml + +user:josuebrunel +1432445226 +:100755 100755 d3565ac... 9eaf9e0... M requirements.txt + +user:josuebrunel +1432445436 +:100755 100755 9eaf9e0... 573ac30... M requirements.txt + +user:Josue Kouka +1432445965 +user:josuebrunel +1432446798 +:100755 100755 ef18dd9... b944930... M setup.py + +user:josuebrunel +1432447387 +:100755 100755 a3c862d... c838051... M myql/myql.py +:100755 100755 b944930... 1fda2ef... M setup.py + +user:josuebrunel +1432447607 +:100755 100755 1fda2ef... 0280cc6... M setup.py + +user:josuebrunel +1432448457 +:100755 100755 be8243a... ae9d7d6... M README.md + +user:josuebrunel +1432455278 +:100755 100755 ae9d7d6... 2149e65... M README.md +:100644 100644 7153a15... 4f1ad75... M README.rst +:100755 100755 0280cc6... 364c47d... M setup.py + +user:Josue Kouka +1432460393 +user:josuebrunel +1432461110 +:100755 100755 2149e65... 5c8d941... M README.md +:100644 100644 4f1ad75... 3505082... M README.rst +:100755 100755 0a27721... 31489a1... M tests/tests.py + +user:josuebrunel +1432544782 +:100755 100755 c838051... 395c902... M myql/myql.py +:100755 100755 364c47d... 4fabd28... M setup.py + +user:josuebrunel +1432586661 +:100755 100755 395c902... 468bf44... M myql/myql.py + +user:Josue Kouka +1432587194 +user:josuebrunel +1432654432 +:100755 100755 ae9d7d6... 524df8d... M README.md + +user:josuebrunel +1432654652 +user:josuebrunel +1432654744 +:100755 100755 8ed516c... ef96fec... M README.md + +user:josuebrunel +1432664329 +:100755 100755 468bf44... 09ee0c4... M myql/myql.py + +user:josuebrunel +1432664792 +:100755 100755 09ee0c4... 6efdc6c... M myql/myql.py + +user:Josue Kouka +1432672981 +user:josuebrunel +1432891306 +:100644 100644 2c8423b... f0e1f12... M .travis.yml + +user:josuebrunel +1432891396 +:100755 100755 12495a0... 6a80a6f... M run_tests.sh + +user:josuebrunel +1432894039 +:100644 100644 f0e1f12... f2354b0... M .travis.yml + +user:josuebrunel +1432894146 +:100644 100644 f2354b0... 1e53777... M .travis.yml + +user:josuebrunel +1432899301 +:100644 100644 1e53777... 3d0e39b... M .travis.yml +:100755 100755 6a80a6f... ad0e997... M run_tests.sh + +user:josuebrunel +1432899934 +:100755 100755 ad0e997... 7ebe562... M run_tests.sh + +user:Josue Kouka +1432900686 +user:josuebrunel +1432949393 +:100755 100755 7ebe562... 82ebe3d... M run_tests.sh + +user:josuebrunel +1432949425 +:100755 100755 31489a1... 23004e9... M tests/tests.py + +user:josuebrunel +1432949841 +:100644 100644 f14059e... 5df54bc... M myql/contrib/stockscraper/stockretriever.py + +user:josuebrunel +1432950024 +:100644 100644 3d0e39b... 40878d1... M .travis.yml + +user:josuebrunel +1432951559 +:100755 100755 ef96fec... 5f8537f... M README.md +:100644 100644 3505082... b51099e... M README.rst + +user:josuebrunel +1432952001 +:100755 100755 5f8537f... 19c446e... M README.md +:100644 100644 8d4f0cd... 2c7f4ba... M docs/index.md + +user:Josue Kouka +1432952510 +user:Josue Kouka +1432952850 +user:josuebrunel +1433038335 +:100755 100755 19c446e... 99a77a8... M README.md + +user:josuebrunel +1433038342 +user:josuebrunel +1433038927 +:100755 100755 4fabd28... 0f04982... M setup.py + +user:josuebrunel +1433039069 +:100755 100755 0f04982... 3d0ecdd... M setup.py + +user:Josue Kouka +1433040555 +user:josuebrunel +1433040854 +:100755 100755 99a77a8... d02e46b... M README.md + +user:Josue Kouka +1433041985 +user:Josue Kouka +1433042426 +user:josuebrunel +1433309113 +:100755 100755 d02e46b... 660379b... M README.md + +user:josuebrunel +1433309241 +:100644 100644 2c7f4ba... f4f8bf9... M docs/index.md + +user:Josue Kouka +1433310015 +user:Josue Kouka +1433310061 +user:josuebrunel +1433315861 +:100755 100755 23004e9... 8fd71f9... M tests/tests.py + +user:josuebrunel +1433316189 +:100644 100644 c8d83b2... 7d9a011... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1433316329 +:100644 100644 7d9a011... 990ccbb... M myql/contrib/auth/yoauth.py + +user:josuebrunel +1433316530 +:100755 100755 6efdc6c... f380b8b... M myql/myql.py + +user:josuebrunel +1433316559 +:100755 100755 8fd71f9... 363abd0... M tests/tests.py + +user:josuebrunel +1433319068 +:100755 100755 f380b8b... e18e6b0... M myql/myql.py + +user:josuebrunel +1433319261 +:100755 100755 660379b... 74d4189... M README.md +:100755 100755 363abd0... baa4a66... M tests/tests.py + +user:josuebrunel +1433321608 +:100644 100644 5df54bc... 7f55edc... M myql/contrib/stockscraper/stockretriever.py + +user:josuebrunel +1433324678 +:100644 100644 7f55edc... fdf8895... M myql/contrib/stockscraper/stockretriever.py + +user:Josue Kouka +1433325849 +user:Josue Kouka +1433327246 +user:josuebrunel +1433333228 +:100755 100755 74d4189... c7c55a8... M README.md + +user:josuebrunel +1433333242 +user:josuebrunel +1433356487 +:000000 100644 0000000... 9f0954a... A dev_requirements.txt + +user:josuebrunel +1433550740 +:100644 100644 40878d1... 17d723e... M .travis.yml +:100755 100755 82ebe3d... 000906d... M run_tests.sh + +user:josuebrunel +1433554167 +:000000 100644 0000000... 062ed7f... A credentials.json.enc + +user:josuebrunel +1433554198 +:100644 100644 17d723e... 8d090c3... M .travis.yml +:100755 100755 000906d... 65fd2f4... M run_tests.sh + +user:josuebrunel +1433554223 +:100755 100755 c7c55a8... 6847e48... M README.md + +user:josuebrunel +1433602316 +:100755 100755 6847e48... 2209fce... M README.md +:100644 100644 b51099e... fd727b2... M README.rst + +user:josuebrunel +1433602482 +:100755 100755 3d0ecdd... 9fed9af... M setup.py + +user:josuebrunel +1433602615 +:100644 100644 9f0954a... a4e6cc2... M dev_requirements.txt +:100755 100755 573ac30... df48804... M requirements.txt + +user:josuebrunel +1433606855 +:100644 100644 a4e6cc2... f1a29c2... M dev_requirements.txt +:100755 100755 df48804... 8331870... M requirements.txt + +user:josuebrunel +1433607130 +:100755 100755 baa4a66... 50305fc... M tests/tests.py + +user:josuebrunel +1433607615 +:100755 100755 2209fce... 51211a1... M README.md +:100755 100755 e18e6b0... 4185f7e... M myql/myql.py + +user:Josue Kouka +1433609293 +user:josuebrunel +1433672311 +:100755 100755 51211a1... 1b341a9... M README.md + +user:josuebrunel +1433672378 +:100644 100644 f1a29c2... 7937541... M dev_requirements.txt +:100755 100755 8331870... 2e7fe64... M requirements.txt + +user:josuebrunel +1433682527 +:100755 100755 4185f7e... f6e60e0... M myql/myql.py + +user:josuebrunel +1433683229 +:100644 100644 77a1639... a5b82c7... M myql/utils.py + +user:josuebrunel +1433683252 +:100755 100755 1b341a9... b9bac95... M README.md +:100644 100644 f4f8bf9... c0c9c95... M docs/index.md +:100644 100644 e5f1afe... ad2a5c9... M docs/oauth.md +:100644 100644 b62443d... 7f0fa9c... M docs/table.md +:100644 100644 084b09d... e84cdc5... M mkdocs.yml + +user:josuebrunel +1433683409 +:100755 100755 a38209b... 532bae6... M myql/contrib/__init__.py +:100755 000000 67e22e7... 0000000... D myql/contrib/auth/__init__.py +:100644 000000 990ccbb... 0000000... D myql/contrib/auth/yoauth.py + +user:josuebrunel +1433683827 +:100755 100755 b9bac95... 803774c... M README.md + +user:josuebrunel +1433684437 +:100755 100755 803774c... e91987e... M README.md + +user:Josue Kouka +1433686019 +user:Josue Kouka +1433748468 +user:josuebrunel +1433759970 +:100755 100755 e91987e... 6bf2df2... M README.md +:100644 100644 c0c9c95... 1a7af9c... M docs/index.md + +user:Josue Kouka +1433761108 +user:josuebrunel +1433791397 +:000000 100644 0000000... 33b21e0... A .coveragerc +:100644 100644 8d090c3... 5ff00c7... M .travis.yml +:100755 100755 6bf2df2... f15a20a... M README.md +:100755 100755 9fed9af... 5e38a8b... M setup.py + +user:josuebrunel +1433792122 +:100644 100644 5ff00c7... 0680d61... M .travis.yml + +user:josuebrunel +1433792647 +:100755 100755 f15a20a... f1fc012... M README.md + +user:Josue Kouka +1433793278 +user:josuebrunel +1433793654 +:100644 000000 2fbaa9a... 0000000... D myql/contrib/table/example.py +:100644 000000 dac38a3... 0000000... D myql/contrib/table/mytable.py + +user:josuebrunel +1433818101 +:100644 100644 7937541... f087e44... M dev_requirements.txt +:100644 100644 a5b82c7... 6df9a45... M myql/utils.py + +user:josuebrunel +1433818595 +:100755 100755 50305fc... 70f18be... M tests/tests.py + +user:josuebrunel +1433819133 +:100755 100755 70f18be... 3d16d19... M tests/tests.py + +user:josuebrunel +1433819376 +:100755 100755 3c42acc... fd32288... M myql/errors.py + +user:josuebrunel +1433819681 +:100644 100644 0680d61... 2c91b44... M .travis.yml + +user:Josue Kouka +1433820568 +user:josuebrunel +1433825423 +:100755 100755 f1fc012... 9d966dd... M README.md +:100755 100755 5e38a8b... 362dbc8... M setup.py + +user:Josue Kouka +1433825823 +user:josuebrunel +1433914953 +:100755 100755 9d966dd... 44f3bc6... M README.md +:100644 100644 8d89783... 488d12e... M docs/stockscraper.md + +user:josuebrunel +1433915014 +:100755 100755 44f3bc6... 08abf6d... M README.md + +user:Josue Kouka +1433915768 +user:josuebrunel +1434080333 +:100644 100644 f087e44... b89d456... M dev_requirements.txt + +user:josuebrunel +1434080467 +:100644 100644 b89d456... a557ba1... M dev_requirements.txt + +user:josuebrunel +1434081020 +:100755 100755 532bae6... cb782df... M myql/contrib/__init__.py +:000000 100644 0000000... 763f32b... A myql/contrib/finance/__init__.py +:000000 100644 0000000... f774907... A myql/contrib/finance/stockscraper/__init__.py +:000000 100644 0000000... fdf8895... A myql/contrib/finance/stockscraper/stockretriever.py +:100644 000000 fa42c42... 0000000... D myql/contrib/stockscraper/__init__.py +:100644 000000 fdf8895... 0000000... D myql/contrib/stockscraper/stockretriever.py +:100755 100755 3d16d19... d75a0a0... M tests/tests.py + +user:josuebrunel +1434148448 +:100644 100644 fdf8895... 2608f8d... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 d75a0a0... 14fd5b4... M tests/tests.py + +user:josuebrunel +1434150895 +:100644 100644 2608f8d... 22106e9... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 14fd5b4... 6d77ace... M tests/tests.py + +user:Josue Kouka +1434151616 +user:josuebrunel +1434288181 +:100644 100644 33b21e0... 88ee395... M .coveragerc + +user:josuebrunel +1434288384 +:100644 100644 22106e9... 0dab9bf... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 f6e60e0... e95ca2d... M myql/myql.py + +user:Josue Kouka +1434290559 +user:josuebrunel +1434290939 +:100644 100644 0dab9bf... 6e0619c... M myql/contrib/finance/stockscraper/stockretriever.py + +user:josuebrunel +1434291071 +:100755 100755 08abf6d... 4c8443c... M README.md + +user:josuebrunel +1434291444 +:100755 100755 e95ca2d... da60957... M myql/myql.py + +user:josuebrunel +1434291968 +:100644 100644 4d1ea01... 4bcb8e5... M myql/contrib/table/base.py +:100755 100755 da60957... ef652e6... M myql/myql.py + +user:josuebrunel +1434427905 +:100755 100755 af963fb... 281ee45... M tests/__init__.py +:100755 100755 6d77ace... 9a878e8... M tests/tests.py + +user:josuebrunel +1434427936 +:100755 100755 cb782df... 7a36d06... M myql/contrib/__init__.py +:000000 100644 0000000... afdd8f4... A myql/contrib/weather/__init__.py +:000000 100644 0000000... 848dc70... A myql/contrib/weather/weather.py + +user:josuebrunel +1434429294 +:100755 100755 9a878e8... f38484c... M tests/tests.py + +user:josuebrunel +1434429319 +:100644 100644 848dc70... 249c513... M myql/contrib/weather/weather.py + +user:josuebrunel +1434430011 +:100644 100644 249c513... ae66e1d... M myql/contrib/weather/weather.py +:100755 100755 f38484c... ddbf895... M tests/tests.py + +user:josuebrunel +1434432564 +:100644 100644 ae66e1d... 41774ff... M myql/contrib/weather/weather.py +:100755 100755 ddbf895... 233d325... M tests/tests.py + +user:josuebrunel +1434433566 +:100644 100644 41774ff... 38961e0... M myql/contrib/weather/weather.py +:100755 100755 233d325... 03cc841... M tests/tests.py + +user:josuebrunel +1434434220 +:100644 100644 6e0619c... d9beaf7... M myql/contrib/finance/stockscraper/stockretriever.py + +user:josuebrunel +1434435053 +:100755 100755 ef652e6... bffe01c... M myql/myql.py + +user:josuebrunel +1434435906 +:100755 100755 fd32288... 92258e5... M myql/errors.py +:100755 100755 bffe01c... 165b6e6... M myql/myql.py + +user:josuebrunel +1434437051 +:100644 100644 d9beaf7... 2d4f49e... M myql/contrib/finance/stockscraper/stockretriever.py +:100644 100644 4bcb8e5... d04ebff... M myql/contrib/table/base.py +:100755 100755 daf1619... cc5e251... M myql/contrib/table/binder.py +:100755 100755 4a48f43... 679a07f... M myql/contrib/table/table.py +:100755 100755 165b6e6... a08e49e... M myql/myql.py +:100644 100644 6df9a45... 18c9bb5... M myql/utils.py + +user:josuebrunel +1434437407 +:100644 100644 2d4f49e... e2cf12e... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 cc5e251... f49facf... M myql/contrib/table/binder.py +:100755 100755 679a07f... 45671b9... M myql/contrib/table/table.py + +user:Josue Kouka +1434439078 +user:josuebrunel +1434608589 +:100644 100644 e2cf12e... fdf5d2f... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 03cc841... 87ccb0b... M tests/tests.py + +user:josuebrunel +1434611825 +:100644 100644 488d12e... 8bea0af... M docs/stockscraper.md +:100644 100644 e84cdc5... 83ef098... M mkdocs.yml +:100755 100755 a08e49e... fc37b68... M myql/myql.py + +user:Josue Kouka +1434612870 +user:josuebrunel +1435350727 +:100644 100644 fdf5d2f... e64735b... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 fc37b68... 6c83af6... M myql/myql.py +:100755 100755 87ccb0b... c55d9f1... M tests/tests.py + +user:josuebrunel +1435352264 +:100644 100644 e64735b... 222abea... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 c55d9f1... a2909a8... M tests/tests.py + +user:josuebrunel +1435352415 +:100644 100644 38961e0... 0c7fce8... M myql/contrib/weather/weather.py + +user:Josue Kouka +1435377560 +user:josuebrunel +1435413084 +:100644 100644 8bea0af... a326af0... M docs/stockscraper.md +:100644 100644 222abea... 3069a07... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 a2909a8... ff37c90... M tests/tests.py + +user:josuebrunel +1435413102 +:100755 100755 65fd2f4... 91aaf45... M run_tests.sh + +user:Josue Kouka +1435415400 +user:josuebrunel +1435678981 +:100755 100755 ff37c90... 3e20d31... M tests/tests.py + +user:josuebrunel +1435679016 +:100644 100644 3069a07... 2f0f4a5... M myql/contrib/finance/stockscraper/stockretriever.py + +user:josuebrunel +1435680381 +:100755 100755 6c83af6... 8ca0d96... M myql/myql.py + +user:Josue Kouka +1435698790 +user:josuebrunel +1436132977 +:100755 100755 91aaf45... 0175f75... M run_tests.sh + +user:josuebrunel +1436133032 +:100644 100644 d04ebff... cd7e99e... M myql/contrib/table/base.py + +user:josuebrunel +1436133093 +:100755 100755 8ca0d96... 4a64547... M myql/myql.py + +user:Josue Kouka +1436134037 +user:josuebrunel +1436341117 +:100755 100755 4c8443c... b7fc40f... M README.md + +user:josuebrunel +1436341234 +:100644 100644 18c9bb5... 0732be8... M myql/utils.py + +user:josuebrunel +1436345214 +:000000 100644 0000000... efef5c5... A docs/weather.md +:100644 100644 83ef098... 914563d... M mkdocs.yml + +user:josuebrunel +1436346119 +:100644 100644 2f0f4a5... 47eeb46... M myql/contrib/finance/stockscraper/stockretriever.py +:100755 100755 3e20d31... 69a4bc2... M tests/tests.py + +user:josuebrunel +1436346135 +:100755 100755 362dbc8... f957bcf... M setup.py + +user:josuebrunel +1436346544 +:100644 100644 a326af0... bcf96af... M docs/stockscraper.md +:100644 100644 efef5c5... 2c0dd81... M docs/weather.md + +user:Josue Kouka +1436347476 +user:Josue Kouka +1436348694 +user:josuebrunel +1436360277 +:100644 100644 914563d... 3f2f882... M mkdocs.yml + +user:josuebrunel +1436360288 +user:josuebrunel +1436430781 +:100644 100644 9ed6273... d6301c7... M docs/contrib.md +:100644 100644 7f0fa9c... 85be75a... M docs/table.md +:100644 100644 2c0dd81... b0fb3f3... M docs/weather.md + +user:josuebrunel +1436474868 +:100755 100755 debf5a8... db4aa67... M myql/__init__.py + +user:Josue Kouka +1436476268 +user:josuebrunel +1437238188 +:100755 100755 f957bcf... a292fdd... M setup.py + +user:Josue Kouka +1437989723 +:100755 100755 4a64547... 156e5ca... M myql/myql.py + +user:Josue Kouka +1438335833 +:100755 100755 db4aa67... 83e490c... M myql/__init__.py +:100755 100755 f957bcf... 42c437a... M setup.py + +user:Josue Kouka +1438336189 +:100755 100755 4a64547... fdba9b5... M myql/myql.py + +user:Josue Kouka +1438363779 +:100644 100644 a557ba1... 2675f56... M dev_requirements.txt + +user:Josue Kouka +1438425303 +:100755 100755 281ee45... afef996... M tests/__init__.py +:100755 100755 69a4bc2... 8a63a41... M tests/tests.py + +user:Josue Kouka +1438425408 +:100755 100755 69a4bc2... 8b2993c... M tests/tests.py + +user:Josue Kouka +1438425493 +user:Josue Kouka +1438429944 +:100644 100644 88ee395... 5417ab2... M .coveragerc + +user:Josue Kouka +1438580607 +:100755 100755 50c3577... 0703f7d... M myql/myql.py + +user:Josue Kouka +1438580731 +:100755 100755 777a9be... 7579ed7... M tests/tests.py + +user:Josue Kouka +1438590077 +:100755 100755 0703f7d... 6c795a4... M myql/myql.py + +user:Josue Kouka +1438595177 +:100755 100755 6c795a4... f74db54... M myql/myql.py + +user:Josue Kouka +1438595663 +:100755 100755 f74db54... b50d888... M myql/myql.py + +user:Josue Kouka +1438596403 +:100755 100755 7579ed7... bf11f5a... M tests/tests.py + +user:Josue Kouka +1438596908 +:100755 100755 bf11f5a... a1d3099... M tests/tests.py + +user:Josue Kouka +1438598952 +:100755 100755 b50d888... 3c2cb79... M myql/myql.py + +user:Josue Kouka +1438601394 +user:Josue Kouka +1438602485 +:100755 100755 2e7fe64... 7e2f96e... M requirements.txt +:100755 100755 42c437a... 1057c89... M setup.py + +user:Josue Kouka +1439388915 +:100755 100755 a1d3099... 0a42ed1... M tests/tests.py + +user:Josue Kouka +1439390981 +:100755 100755 3c2cb79... e3ecb4c... M myql/myql.py +:100755 100755 afef996... f44095e... M tests/__init__.py +:100755 100755 0a42ed1... 27c93a5... M tests/tests.py + +user:Josue Kouka +1439391285 +:100755 100755 27c93a5... c129bcb... M tests/tests.py + +user:Josue Kouka +1439442151 +:100644 100644 2c91b44... 318b0fa... M .travis.yml + +user:Josue Kouka +1439448655 +:100644 100644 2c91b44... 318b0fa... M .travis.yml + +user:Josue Kouka +1439490344 +user:Josue Kouka +1439557470 +:100755 100755 e3ecb4c... d5f6b69... M myql/myql.py +:100755 100755 c129bcb... 5345652... M tests/tests.py + +user:Josue Kouka +1439558245 +:100755 100755 5345652... 11a13d3... M tests/tests.py + +user:Josue Kouka +1439559100 +:100755 100755 11a13d3... 8a98faa... M tests/tests.py + +user:Josue Kouka +1439559673 +:100755 100755 d5f6b69... 7008797... M myql/myql.py +:100755 100755 8a98faa... addb03b... M tests/tests.py + +user:Josue Kouka +1439561022 +:100755 100755 addb03b... df5fd70... M tests/tests.py + +user:Josue Kouka +1439567960 +user:Josue Kouka +1439573243 +:100755 100755 df5fd70... b750c41... M tests/tests.py + +user:Josue Kouka +1439576312 +:100755 100755 7008797... 271f158... M myql/myql.py +:100755 100755 b750c41... e449d86... M tests/tests.py + +user:Josue Kouka +1439578657 +:100755 100755 f44095e... 2295300... M tests/__init__.py +:100755 100755 e449d86... 57e47fa... M tests/tests.py + +user:Josue Kouka +1439579944 +:100755 100755 271f158... 1cdb8a2... M myql/myql.py +:100755 100755 2295300... ce0d9bb... M tests/__init__.py +:100755 100755 57e47fa... f84f421... M tests/tests.py + +user:Josue Kouka +1439580455 +:100755 100755 1cdb8a2... bb67059... M myql/myql.py +:100755 100755 f84f421... 727086a... M tests/tests.py + +user:Josue Kouka +1439580626 +:100755 100755 bb67059... b293cc3... M myql/myql.py +:100755 100755 727086a... c7e2231... M tests/tests.py + +user:Josue Kouka +1439619071 +:100755 100755 b293cc3... 40c37f3... M myql/myql.py +:100755 100755 ce0d9bb... 098093e... M tests/__init__.py +:100755 100755 c7e2231... fff7058... M tests/tests.py + +user:Josue Kouka +1439619679 +:100755 100755 40c37f3... d0f8759... M myql/myql.py +:100755 100755 fff7058... 3fe9b74... M tests/tests.py + +user:Josue Kouka +1439631003 +:100755 100755 d0f8759... 394bbd9... M myql/myql.py + +user:Josue Kouka +1439631388 +:100755 100755 394bbd9... d1a388e... M myql/myql.py + +user:Josue Kouka +1439657777 +:100755 100755 3fe9b74... 09f6c4a... M tests/tests.py + +user:Josue Kouka +1439727449 +:100755 100755 d1a388e... 9a51cdf... M myql/myql.py +:100755 100755 098093e... 283872c... M tests/__init__.py +:100755 100755 09f6c4a... 6d5f772... M tests/tests.py + +user:Josue Kouka +1439729402 +:100755 100755 9a51cdf... 6fba0ea... M myql/myql.py + +user:Josue Kouka +1439732625 +:100755 100755 6fba0ea... 286ea37... M myql/myql.py +:100755 100755 6d5f772... e8dfb60... M tests/tests.py + +user:Josue Kouka +1439733796 +:100755 100755 286ea37... eb0cc96... M myql/myql.py +:100755 100755 e8dfb60... c27f160... M tests/tests.py + +user:Josue Kouka +1439733871 +:100755 100755 c27f160... 92a01e2... M tests/tests.py + +user:Josue Kouka +1439738850 +:100755 100755 eb0cc96... faa8ddb... M myql/myql.py + +user:Josue Kouka +1439813725 +:100755 100755 faa8ddb... af6792a... M myql/myql.py + +user:Josue Kouka +1439842419 +:100755 100755 92a01e2... c324c7a... M tests/tests.py + +user:Josue Kouka +1439842589 +user:Josue Kouka +1439881042 +:100755 100755 c324c7a... ed924f4... M tests/tests.py + +user:Josue Kouka +1439886645 +:100755 100755 af6792a... fa8d757... M myql/myql.py + +user:Josue Kouka +1439886691 +:100755 100755 ed924f4... 564ad0c... M tests/tests.py + +user:Josue Kouka +1439889121 +:100755 100755 564ad0c... a005531... M tests/tests.py + +user:Josue Kouka +1439889484 +:100755 100755 fa8d757... 6a26bf2... M myql/myql.py +:100755 100755 a005531... a61ae9e... M tests/tests.py + +user:Josue Kouka +1439899825 +:000000 100755 0000000... 23897d4... A myql/logger.py +:100755 100755 6a26bf2... 6d73238... M myql/myql.py +:100755 100755 a61ae9e... 6f2266d... M tests/tests.py + +user:Josue Kouka +1439900572 +:100755 100755 6d73238... b3f3c98... M myql/myql.py + +user:Josue Kouka +1439901975 +:100755 100755 b3f3c98... 6f4258a... M myql/myql.py + +user:Josue Kouka +1439903116 +:100755 100755 6f4258a... ca71d8c... M myql/myql.py +:100755 100755 6f2266d... 4b191fd... M tests/tests.py + +user:Josue Kouka +1439903985 +:100755 100755 4b191fd... 52dbd38... M tests/tests.py + +user:Josue Kouka +1439904648 +:100755 100755 92258e5... c1032c4... M myql/errors.py +:100755 000000 23897d4... 0000000... D myql/logger.py + +user:Josue Kouka +1439908193 +:100755 100755 ca71d8c... 06cb556... M myql/myql.py + +user:Josue Kouka +1439911388 +:100755 100755 52dbd38... 01692da... M tests/tests.py + +user:Josue Kouka +1439925662 +:100755 100755 06cb556... efceccb... M myql/myql.py + +user:Josue Kouka +1440016051 +:100644 100644 3f2f882... 8f140d9... M mkdocs.yml + +user:Josue Kouka +1440070761 +:100755 100755 efceccb... 177fb8e... M myql/myql.py +:100755 100755 01692da... 43a11d8... M tests/tests.py + +user:Josue Kouka +1440074542 +:100755 100755 177fb8e... 3ae38b2... M myql/myql.py + +user:Josue Kouka +1440074567 +:100755 100755 b7fc40f... 8bb6ff0... M README.md +:100644 100644 1a7af9c... a5a7ca2... M docs/index.md +:100644 100644 3b9593d... 44e0009... M docs/myql.md +:100644 100644 ad2a5c9... 8e25358... M docs/oauth.md + +user:Josue Kouka +1440076439 +:100644 100644 a5a7ca2... 49ce8bd... M docs/index.md +:100644 100644 44e0009... 3dc1ece... M docs/myql.md + +user:Josue Kouka +1440077529 +user:Josue Kouka +1440141443 +:100755 100755 8bb6ff0... b923789... M README.md +:100644 100644 fd727b2... 3fab26d... M README.rst +:100644 100644 49ce8bd... 5d9fcab... M docs/index.md + +user:Josue Kouka +1440165189 +user:Josue Kouka +1440309747 +:100755 100755 3ae38b2... e382406... M myql/myql.py + +user:Josue Kouka +1440326477 +:100755 100755 43a11d8... e26e6e0... M tests/tests.py + +user:Josue Kouka +1440326488 +user:Josue Kouka +1440326669 +:100755 100755 83e490c... e82056d... M myql/__init__.py +:100755 100755 1057c89... 1cf8472... M setup.py + +user:Josue Kouka +1440328016 +user:Josue Kouka +1440329558 +:100755 100755 b923789... 8263ab1... M README.md + +user:Josue Kouka +1440329954 +:100644 100644 3fab26d... 54c0553... M README.rst + +user:Josue Kouka +1440330370 \ No newline at end of file diff --git a/lokingyql/__init__.py b/lokingyql/__init__.py deleted file mode 100644 index 4261349..0000000 --- a/lokingyql/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from lokingyql import LokingYQL -from yahooauth import YahooOAuth - -import errors \ No newline at end of file diff --git a/lokingyql/config.py b/lokingyql/config.py deleted file mode 100644 index 97cd841..0000000 --- a/lokingyql/config.py +++ /dev/null @@ -1,2 +0,0 @@ -consumer_key = '' -consumer_secret = '' \ No newline at end of file diff --git a/lokingyql/contrib/__init__.py b/lokingyql/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lokingyql/errors.py b/lokingyql/errors.py deleted file mode 100644 index 50b537a..0000000 --- a/lokingyql/errors.py +++ /dev/null @@ -1,29 +0,0 @@ -class NoTableSelectedError(Exception): - '''Error raised when no table has been selected - ''' - def __init__(self, msg): - self.msg = msg - - def __str__(self): - return repr(self.msg) - -class NoConfigFileError(Exception): - '''Error raised when the config file passed - doesn't exist - ''' - def __init__(self, msg): - self.msg = msg - - def __str__(self,): - return repr(self.msg) - - -class NoConfigParameter(Exception): - '''Error raised when config parameters don't exist - ''' - def __init__(self, msg): - self.msg = msg - - def __str__(self,): - return repr(self.msg) - \ No newline at end of file diff --git a/lokingyql/lokingyql.py b/lokingyql/lokingyql.py deleted file mode 100644 index 05bc2a4..0000000 --- a/lokingyql/lokingyql.py +++ /dev/null @@ -1,242 +0,0 @@ -import requests -import yahooauth -import errors - -import importlib - -__author__ = 'Josue Kouka' -__email__ = 'josuebrunel@gmail.com' - -class LokingYQL(object): - '''Yet another Python Yahoo! Query Language Wrapper - Attributes: - - url : data provider url - - table : default table, so you won't have to specify a table later - - format : default format of the responses - - diagnostics : set to to see diagnostics on queries - - community : set to to have access to community tables - ''' - default_url = 'https://query.yahooapis.com/v1/public/yql' - community_data = "env 'store://datatables.org/alltableswithkeys'; " #Access to community table - - def __init__(self, table=None, url=default_url, community=False, format='json', oauth=None): - self.url = url - self.table = table - self.format = format - self._query = None # used to build query when using methods such as ,,, and + """ + def __init__(self, name, **kwargs): + """ + """ + self.name = name + vars(self).update(kwargs) + + self.etree = self._buildElementTree() + + if vars(self).get('urls',None): + [ self.addUrl(url) for url in self.urls ] + + if vars(self).get('inputs',None): + [ self.addInput(elt) for elt in self.inputs ] + + if vars(self).get('paging',None): + self.addPaging(self.paging) + + def _buildElementTree(self,): + """Turns object into a Element Tree + """ + t_binder = ctree.Element(self.name) + + for k,v in self.__dict__.items(): + if k not in ('name', 'urls', 'inputs', 'paging') and v : + t_binder.set(k,v) + + self.etree = t_binder + return t_binder + + def addUrl(self, url): + """Add url to binder + """ + + if url not in self.urls: + self.urls.append(url) + + root = self.etree + t_urls = root.find('urls') + + if not t_urls: + t_urls = ctree.SubElement(root, 'urls') + + t_url = ctree.SubElement(t_urls, 'url') + t_url.text = url + + return True + + def removeUrl(self, url): + """Remove passed url from a binder + """ + + root = self.etree + t_urls = root.find('urls') + + if not t_urls: + return False + + for t_url in t_urls.findall('url'): + if t_url.text == url.strip(): + t_urls.remove(t_url) + if url in self.urls: + self.urls.remove(url) + return True + + return False + + def addInput(self, key): + """Add key to input : key, value or map + """ + if key not in self.inputs: + self.inputs.append(key) + + root = self.etree + t_inputs = root.find('inputs') + + if not t_inputs : + t_inputs = ctree.SubElement(root, 'inputs') + + t_inputs.append(key.etree) + + return True + + def removeInput(self, key_id, input_type='key'): + """Remove key (key, value, map) from Input + key_id : id of the input element i.e + input_type : type of the input ; key, value or map + """ + root = self.etree + t_inputs = root.find('inputs') + + if not t_inputs: + return False + + keys = t_inputs.findall(input_type) + + key = [ key for key in keys if key.get('id') == key_id ] + + try: + t_inputs.remove(key[0]) + return True + except (Exception,) as e: + print(e) + + return False + + def addPaging(self,paging): + """Add paging to Binder + """ + if not vars(self).get('paging', None): + self.paging = paging + root = self.etree + + try: + root.append(paging.etree) + return True + except (Exception,) as e: + print(e) + + return False + + def removePaging(self,): + """Remove paging from Binder + """ + root = self.etree + t_paging = root.find('paging') + + try: + root.remove(t_paging) + return True + except (Exception,) as e: + print(e) + + return False + + +class BaseInput(object): + """This class represents an Input Element under Binding element. + Input Element can be : , or + Full Documentation https://developer.yahoo.com/yql/guide/yql-opentables-reference.html#yql-opentables-key + """ + + def __init__(self, input_type, id, type, paramType, like='', required=False, default='', private=False, const=False, batchable=False, maxBatchItems=0): + """ + - input_type : can be , or + - id : The name of the key. This represents what the user needs to provide in the WHERE clause. + - like (as): The alias of the key used in YQL statements. + - type : The type of data coming back from the Web service. + - required : A boolean that answers the question + - paramType : Determines how this key is represented and passed on to the Web service. + - default : This value is used if one isn't specified by the developer in the SELECT. + - private : Hide this key's value to the user (in both "desc" and "diagnostics"). + - const : A boolean that indicates whether the default attribute must be present and cannot be changed by the end user. + - batchable : A boolean which answers the question: Does this select and URL support multiple key fetches/requests in a single request (batched fetching)? + - maxBatchItems : How many requests should be combined in a single batch call. + """ + self.name = input_type + self.id = id + self.like = like # as is a python , that's why in argument we use + self.type = type + self.paramType = paramType + self.required = required + self.default = default + self.private = private + self.const = const + self.batchable = batchable + self.maxBatchItems = maxBatchItems + + self.etree = self._buildElementTree() + + def _buildElementTree(self,): + """Turn object into an ElementTree + """ + t_elt = ctree.Element(self.name) + + for k,v in [ (key,value) for key,value in self.__dict__.items() if key != 'name']: # Excluding name from list of items + if v and v != 'false' : + t_elt.set(k if k != 'like' else 'as', str(v).lower()) + + self._etree = t_elt + return t_elt + +class BasePaging(object): + """Class representing a element under a , , , + """ + def __init__(self, name, itemPath, produces, pollingFrequencySeconds=0, urls=[], inputs=[], paging=None): + + super(Binder, self).__init__(name, itemPath=itemPath, produces=produces, pollingFrequencySeconds=pollingFrequencySeconds, urls=urls, inputs=inputs, paging=paging) + + +class BinderFunction(BaseBinder): + """Represent a function : + """ + + def __init__(self, func_name, func_code='', func_file=None, inputs=[]): + """ + - func_name : name of the stored procedure + - func_code : your js code passed through a str + - func_file : file containing your code + """ + super(BinderFunction, self).__init__('function', inputs=inputs) + self.func_name = func_name + self.etree.set('name', func_name) + + if func_code: + self.addFunction(func_code) + + if func_file: + self.addFunction('', from_file=func_file) + + +class InputKey(BaseInput): + """Class representing a key of an Input + """ + + def __init__(self, *args, **kwargs): + super(InputKey, self).__init__('key', *args, **kwargs) + + +class InputValue(BaseInput): + """Class representing value under an Input + """ + def __init__(self, *args, **kwargs): + super(InputValue, self).__init__('value', *args, **kwargs) + + +class InputMap(BaseInput): + """Class representing map under an Input + """ + def __init__(self, *args, **kwargs): + super(InputMap, self).__init__('map', *args, **kwargs) + + +class PagingPage(BasePaging): + """Class representing + """ + def __init__(self, start, pageSize, total): + super(PagingPage, self).__init__('page', start=start, pageSize=pageSize, total=total) + + +class PagingOffset(BasePaging): + """Class representing + """ + def __init__(self, matrix, start, pageSize, total): + super(PagingOffset, self).__init__('offset', matrix, start=start, pageSize=pageSize, total=total) + self.matrix = str(matrix).lower() + self.etree.set('matrix', self.matrix) + + +class PagingUrl(BasePaging): + """Class representing + """ + def __init__(self, nextpage): + super(PagingUrl, self).__init__('url', nextpage=nextpage) + + +class BinderMeta(type): + + INPUT_KEYS = ['name', 'itemPath', 'produces', 'pollingFrequencySeconds', 'urls', 'keys', 'pages'] + + def __new__(cls, name, bases, dct): + + if name != 'BinderModel': + binder_attr = {key: value for (key, value) in dct.items() if key in cls.INPUT_KEYS} + binder_attr['inputs'] = [ value for value in dct.values() if isinstance(value, BaseInput)] + paging = [ value for value in dct.values() if isinstance(value, BasePaging)] + if paging : + binder_attr['paging'] = paging[0] + + binder = Binder(**binder_attr) + if dct.get('function',None): + binder.addFunction(func_code='', from_file=dct['function']) + dct = { key : value for (key, value) in dct.items() if key in ('__module__', '__metaclass__')} + dct['binder'] = binder + # Add KeyException Management + return super(BinderMeta,cls).__new__(cls, name, bases, dct) + + +class BinderModel(Binder): + __metaclass__ = BinderMeta + diff --git a/myql/contrib/table/exceptions.py b/myql/contrib/table/exceptions.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/myql/contrib/table/exceptions.py @@ -0,0 +1 @@ + diff --git a/myql/contrib/table/func.js b/myql/contrib/table/func.js new file mode 100644 index 0000000..f3b503b --- /dev/null +++ b/myql/contrib/table/func.js @@ -0,0 +1,5 @@ + // Include the flickr signing library + y.include("http:blog.pipes.yahoo.net/wp-content/uploads/flickr.js"); + // GET the flickr result using a signed url + var fs = new flickrSigner(api_key,secret); + response.object = y.rest(fs.createUrl({method:method, format:""})).get().response(); diff --git a/myql/contrib/table/table.py b/myql/contrib/table/table.py new file mode 100755 index 0000000..0c59d0f --- /dev/null +++ b/myql/contrib/table/table.py @@ -0,0 +1,140 @@ +import os +from xml.dom import minidom +from xml.etree import cElementTree as xtree + +from myql.contrib.table.base import Base +from myql.contrib.table.binder import Binder, BinderFunction + +class Table(Base): + """Class representating a YQL Table + """ + + _TAB_ATTR = {'xmlns':'http://query.yahooapis.com/v1/schema/table.xsd', 'securityLevel':'any', 'https':'false'} + + def __init__(self, name, author, apiKeyURL, documentationURL, sampleQuery=[], description=None, table_attr=None, bindings=[]): + """Initialize the class + """ + self.name = name + self.author = author + self.apiKey = apiKeyURL + self.documentationURL = documentationURL + self.description = description + self.sampleQuery = sampleQuery + self.table_attr = table_attr + self.etree = self._init_table_elementTree() + self.bindings = bindings + + if bindings: + [ self.addBinder(binder) for binder in bindings ] + + def __repr__(self,): + return "".format(self.name) + + def _xml_pretty_print(self, data): + """Pretty print xml data + """ + raw_string = xtree.tostring(data, 'utf-8') + parsed_string = minidom.parseString(raw_string) + return parsed_string.toprettyxml(indent='\t') + + def _create_table_xml_file(self, data, fname=None): + """Creates a xml file of the table + """ + content = self._xml_pretty_print(data) + if not fname: + fname = self.name + with open(fname+".xml", 'w') as f: + f.write(content) + + def _init_table_elementTree(self, xml=True, db_table=True): + """Create a table + """ + # tag object + t_table = xtree.Element('table') + #
+ if not self.table_attr : + self.table_attr = self._TAB_ATTR + for attr in self.table_attr.items() : + t_table.set(*attr) + + # + t_meta = xtree.SubElement(t_table, 'meta') + + # Loop over a sorted key,value of class attributes while ignoring table_attr and name + for key, value in [(k,v) for k,v in sorted(self.__dict__.items(), key=lambda x: x[0]) if k not in ('table_attr','name') ]: + if isinstance(value, list): # Works for element like sampleQuery + for elt in value: + t_tag = xtree.SubElement(t_meta, key) # setting attribute name as a tag name + t_tag.text = elt # Setting attribute value as text + else: + t_tag = xtree.SubElement(t_meta,key) + t_tag.text = value + + ## + t_bindings = xtree.SubElement(t_table, 'bindings') + ## + + self.etree = t_table + return t_table + + def save(self, name=None, path=None): + """Save file as xml + """ + if path : + name = os.path.join(path,name) + + try: + self._create_table_xml_file(self.etree, name) + except (Exception,) as e: + print(e) + return False + + return True + + def addBinder(self, binder): + """Adds a binder to the file + """ + root = self.etree + bindings = root.find('bindings') + bindings.append(binder.etree) + + return True + + def removeBinder(self, name): + """Remove a binder from a table + """ + root = self.etree + + t_bindings = root.find('bindings') + + t_binder = t_bindings.find(name) + + if t_binder : + t_bindings.remove(t_binder) + return True + + return False + + +class TableMeta(type): + + TABLE_KEYS = ['name', 'author', 'apiKeyURL', 'documentationURL', 'sampleQuery','description'] + + def __new__(cls, name, bases, dct): + if name != 'TableModel': + table_attr = {key: value for (key, value) in dct.items() if key in cls.TABLE_KEYS } + table_attr['bindings'] = [ value for value in dct.values() if isinstance(value, Binder) or isinstance(value, BinderFunction)] + table = Table(**table_attr) + dct = { key : value for (key, value) in dct.items() if key in ('__module__', '__metaclass__')} + dct['table'] = table + + return super(TableMeta, cls).__new__(cls, name, bases, dct) + + +class TableModel(Table): + __metaclass__ = TableMeta + + +def BinderFrom(cls_binder_meta): + return cls_binder_meta.binder + diff --git a/myql/contrib/weather/__init__.py b/myql/contrib/weather/__init__.py new file mode 100644 index 0000000..afdd8f4 --- /dev/null +++ b/myql/contrib/weather/__init__.py @@ -0,0 +1,3 @@ +from __future__ import absolute_import + +from myql.contrib.weather.weather import Weather diff --git a/myql/contrib/weather/weather.py b/myql/contrib/weather/weather.py new file mode 100644 index 0000000..0c7fce8 --- /dev/null +++ b/myql/contrib/weather/weather.py @@ -0,0 +1,61 @@ +from __future__ import absolute_import + +from myql.myql import YQL + + +class Weather(YQL): + """Weather Class + """ + + def __init__(self, unit=None, **kwargs): + """Initialize a weather object + """ + kwargs.update({'community': False}) + + super(Weather, self).__init__(**kwargs) + + self.unit = unit + + def get_weather_in(self, place, unit=None, items=None): + """Return weather info according to place + """ + unit = unit if unit else self.unit + response = self.select('weather.forecast', items=items).where(['woeid','IN',('SELECT woeid FROM geo.places WHERE text="{0}"'.format(place),)], ['u','=',unit] if unit else []) + return response + + def get_weather_forecast(self, place, unit=None): + """Return weather forecast accoriding to place + """ + unit = unit if unit else self.unit + response = self.get_weather_in(place, items=['item.forecast'], unit=unit) + return response + + def get_weather_description(self, place): + """Return weather description + """ + response = self.get_weather_in(place, items=['item.condition.text']) + return response + + def get_current_condition(self, place): + """Return weather condition + """ + response = self.get_weather_in(place, items=['item.condition']) + return response + + def get_current_atmosphere(self, place): + """Return weather atmosphere + """ + response = self.get_weather_in(place, items=['atmosphere']) + return response + + def get_current_wind(self, place): + """Return weather wind + """ + response = self.get_weather_in(place, items=['wind']) + return response + + def get_astronomy(self, place): + """Return sunrise and sunset time + """ + response = self.get_weather_in(place, items=['astronomy']) + return response diff --git a/myql/errors.py b/myql/errors.py new file mode 100755 index 0000000..c1032c4 --- /dev/null +++ b/myql/errors.py @@ -0,0 +1,9 @@ +class NoTableSelectedError(Exception): + '''Error raised when no table has been selected + ''' + def __init__(self, msg=None): + self.msg = msg + + def __str__(self): + return repr(self.msg) + diff --git a/myql/myql.py b/myql/myql.py new file mode 100755 index 0000000..631d3af --- /dev/null +++ b/myql/myql.py @@ -0,0 +1,366 @@ +"""Simple Python Wrapper of the Yahoo! Query Language +""" + +from __future__ import absolute_import + +import re +import logging + +import requests +from myql import errors + + +logging.basicConfig(level=logging.DEBUG,format="[%(asctime)s %(levelname)s] [%(name)s.%(module)s.%(funcName)s] %(message)s \n") +logger = logging.getLogger('mYQL') + +logging.getLogger('requests').disabled = True # Disabling requests default logger + + +class YQL(object): + '''Yet another Python Yahoo! Query Language Wrapper + Attributes: + - url : data provider url + - table : default table, so you won't have to specify a table later + - format : default format of the responses + - diagnostics : set to to see diagnostics on queries + - community : set to to have access to community tables + ''' + PUBLIC_URL = 'https://query.yahooapis.com/v1/public/yql' + PRIVATE_URL = 'https://query.yahooapis.com/v1/yql' + COMMUNITY_DATA = "env 'store://datatables.org/alltableswithkeys'; " #Access to community table + + FUNC_FILTERS = ['sort', 'tail', 'truncate', 'reverse', 'unique', 'sanitize'] + + def __init__(self, community=True, format='json', jsonCompact=True, crossProduct=None, debug=False, diagnostics=False, oauth=None): + self.community = community # True means access to community data + self.format = format + self._table = None + self._query = None # used to build query when using methods such as