{ "info": { "author": "Pranesh Srinivasan", "author_email": "spranesh@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Environment :: Plugins", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: POSIX :: Linux", "Programming Language :: C", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Software Development", "Topic :: Utilities" ], "description": "=======\nRedhawk\n=======\n\nRedhawk is a code navigation system built on the idea of a language agnostic\nparse tree. It currently supports C & Python.\n\nCode navigation systems are few and far. They are either too tied to a\nlanguage, or are very heuristic in nature --- using regex based parsers.\nRedhawk attempts to acheive the best of both worlds. It uses standard, robust,\nparsers each of the languages, and converts the resulting AST to a language\nagnostic AST, or LAST.\n\nThe resulting LAST can be queried by using either Selectors (similar to\nJQuery), or an xpath like syntax. A Typical use of Redhawk is as shown below::\n\n $ redhawk query '*/DefineFunction' file1.py file2.c\n\nRedhawk is currently under heavy development. The code can be found on\n`github`_. \n\nRedhawk currently requires python 2.6 or 2.7.\n\nProject News\n------------\n\nAn introductory set of videos, have been uploaded to `Youtube`_.\n\nA `Vim plugin`_ released in version 1.1.5, for query, and replace (using an\neditable quickfix list).\n\nFrom Version 1.1.2 onwards, Redhawk supports parallel querying using the\nparallel-python (pp) module. This speeds up Redhawk's querying on large\ncodebases. Querying for closures anywhere in Django (~2200 files) can now be\ndone in ~20 seconds on a celeron netbook.\n\nProject Objectives\n------------------\n\n(or what's coming up)\n\n1. Allow users to effectively find and thereby navigate code in an\neditor-independent manner.\n\n2. Better documentation for API usage, and a long list of examples, with\nexamples scripts using the Selector API.\n\n3. Allow cross-language analysis in the future, thereby benefitting projects\nin multiple languages.\n\n4. Expose the LAST in a simple manner via the Redhawk API for other tools.\nThese tools could involve indenting code, suggesting completions, or static\nanalysis.\n\n5. Eventually allow editing of the LAST, and thereby powerful \nrefactoring.\n\n\nDependencies\n------------\n\n*Runtime Dependencies*:\n\n* `pycparser`_ is required to parse C code into ASTs. This\n in-turn depends on Python-PLY (`python-ply` on debian-ubuntu).\n\n*Optional but highly recommended Dependencies*:\n\n* `pp`_ - Parallel Python is required for running queries in parallel. This\n speeds up queries by more than 2x. This is highly recommended if you are\n going to query large projects. The whole of Django can be queried in less\n than 20 seconds, by using parallel python (passing `-p` to the `query`\n command).\n\n* `Python Graphviz`_ is required for generating pretty AST graphs. This\n package is an *optional* dependency, but highly recommended. This package goes by the name\n `python-pygraphviz` on Ubuntu, and depends on `graphviz`, and `dot`. (`Pip`\n seems to have a hard time install pygraphviz. Either `easy_install` or\n installing from your distribution's package manager should work).\n\n*Development (Compile-time) Dependencies*:\n\n* `Python YAML`_ is required for generating the AST classes in node.py\n form a simple configuration file. This goes by the name python-yaml on\n debian/ubuntu.\n\n* `nosetests`_ is required for running the test suite.\n\n*Development Cycle*:\n\n* Use bin/start_simple_bash_with_redhawk_in_pythonpath.sh\n\n* Run nosetests from redhawk/ as root. Ensure tests pass.\n\n* Make awesome changes!\n\n* Submit a pull request to the project on github.\n\nInstalling\n----------\n\n`pip` is the recommended tool to install Redhawk. It goes by `python-pip` on\ndebian/ubuntu and `pip`_ on the Python Package Index. The command::\n\n $ sudo pip install redhawk\n\nshould install redhawk, along with its dependency - pycparser. \n\nIt is however recommended that you install the other packages also::\n\n $ sudo easy_install pygraphviz\n $ sudo pip install nose 'PyYAML>=3.09' 'nose>=0.11'\n\nor by using your distribution's package manager. On Ubuntu/Debian (Ubuntu\nLucid seems to have new enough packages)::\n\n $ sudo aptitude install python-pygraphviz python-yaml python-nose\n \n\nNotes\n-----\n\n1. Run `_build_tables.py` in the pycparser directory, to pre-generate the lex\nand yacc tables. This will enable quicker parsing of C files. If pycparser was installed for all users, then \n \n * Root priviliges may be required to run _build_tables.py \n * Permissions for the resulting `lextab.py` and `yacctab.py` must be changed\n to allow all users to read (755).\n\nYou can find more about this `here`_.\n\n\nUsing Redhawk\n-------------\n\nRedhawk can be used from either the `redhawk` executable, or via the redhawk\nAPI.\n\n1. Using the `redhawk` program.\n2. Using the Redhawk API via `import redhawk`\n\n\nUsing the `redhawk` executable\n------------------------------\n\nThe `redhawk` program supports eight commands:\n\n========= =======================================================\n Command Purpose\n========= =======================================================\nadd Add files to an AST index.\ninit Create an EMPTY AST index.\nlistfiles List all the files in the AST index.\nprompt Drop into a python prompt with helpful functions for \n exploring the parse tree.\nquery Query for a pattern in a list of files, or in the index.\nremove Remove files from the AST index.\nshow Show (visualize) a file either as text, or as an image.\nwhere Print the location of the current redhawk index (if there is one).\n========= =======================================================\n\nThe simplest way to run `redhawk` is to simply use a `query` command on a file\n(or directory). The `query` command as described above takes an xpath-like\nquery, and a list of files (or directories), and searches for matches.\n\nIn the case that the set of files is large and is to be repeatedly queried, a\n`redhawk` Language Agnostic Tree (LAST) database can be created using the\n`redhawk init` command. Files in the project can be added to the database\nusing the `redhawk add` command.\n\nThe `show` command helps visualise the internal LAST structure used. The\ncommand::\n\n $ redhawk show file.c\n\nwill show the LAST of `file.c` in a lisp/scheme like (sexp) syntax. A more\ndescriptive helpful visualisation can be obtained using the `-i` (or `-e`)\nflags, which show graphs (generated using `graphviz` using the\n`python-graphviz` module). This *requires* the pygraphviz module, an optional\nthough recommended, dependency. The command::\n\n $ redhawk show file.c -i\n\nshows a graph using the default image python libraries.\n\nThe `prompt` command drops you into a prompt for exploring and querying the\nLAST. This enables the use of selectors, a very powerful method for finding\nwhat you want. For more information on selectors, see::\n\n $ pydoc redhawk.common.selector\n\nfor detailed documentation.\n\nIntroduction to the Query Language\n----------------------------------\n\nThe `query` command supports an XPATH-like language for querying. We describe\nexamples below. In querying for a particular construct, the name of that Node\nin the LAST has to be known. (Thorough documentation about this is coming up.\nFor now, one can refer to the `node`_ and `types`_ yaml configuration files on\ngithub.) [1]_ \n\nFor the examples below, we shall use the `counter.py`_ file. It is to be noted\nthat the same queries will work with other languages also (only C is supported\nfor now).::\n\n 1\tdef CounterClosure(init=0):\n 2\t value = [init]\n 3\t def Inc():\n 4\t value[0] += 1\n 5\t return value[0]\n 6\t return Inc\n 7\t\n 8\tclass CounterClass:\n 9\t def __init__(self, init=0):\n 10\t self.value = init\n 11\t\n 12\t def Bump(self):\n 13\t self.value += 1\n 14\t return self.value\n 15\t\n 16\tdef CounterIter(init = 0):\n 17\t while True:\n 18\t init += 1\n 19\t yield init\n 20\t\n 21\tif __name__ == '__main__':\n 22\t c1 = CounterClosure()\n 23\t c2 = CounterClass()\n 24\t c3 = CounterIter()\n 25\t assert(c1() == c2.Bump() == c3.next())\n 26\t assert(c1() == c2.Bump() == c3.next())\n 27\t assert(c1() == c2.Bump() == c3.next())\n 28\t \n\n\nTry `redhawk show` on the above file, to get a feel of its structure. You can\nview the graphviz generated graph at `imgur`_.\n\n*Example 1*:\nLet us find all functions at the module level in `counter.py`::\n\n $ redhawk query 'DefineFunction' counter.py\n\nThis gives us::\n\n counter.py:16:def CounterIter(init = 0):\n counter.py:1:def CounterClosure(init=0):\n\n\nNOTE:\n\n1. The results are not necessarily in a sorted order, with respect to\n line number. This does not hamper the use of Redhawk for searching and\n navigation. (The results will always be guaranteed to be sorted with respect to the\n files). On the plus side, this makes Redhawk a little bit faster. If order is\n required, a simple invocation of the unix `sort` program should fix this.\n\n2. The above query would work on a C program as well. Running the same query\n on `stats.c`_ gives us::\n\n stats.c:17:float Variance(float *p, int len)\n stats.c:5:float Mean(float *p, int len)\n stats.c:34:int main()\n\n*Example 2*:\nLet us find all functions one level below the module level in `counter.py`::\n\n $ redhawk query '*/DefineFunction' counter.py\n\nThis gives us::\n\n counter.py:9:def __init__(self, init=0):\n counter.py:3:def Inc():\n counter.py:12:def Bump(self):\n\n\n*Example 3*:\nLet us find all functions *anywhere* in the program.::\n\n $ redhawk query '**/DefineFunction' counter.py\n\nThis gives us::\n\n counter.py:9:def __init__(self, init=0):\n counter.py:16:def CounterIter(init = 0):\n counter.py:3:def Inc():\n counter.py:1:def CounterClosure(init=0):\n counter.py:12:def Bump(self):\n\n*Example 4*:\nSuppose we wanted to find all closures in the file. We could do this via::\n\n $ redhawk query '**/DefineFunction/**/DefineFunction' counter.py\n\nThis gives us::\n\n counter.py:3:def Inc():\n\n*Example 5*:\nLet us find all functions whose name starts with 'Counter'. Looking at the\n`node` yaml configuration tells us that `DefineFunction` has an argument called\nname. Now we simply need to test whether the first 7 letters of the name are\n\"Counter\"::\n\n $ redhawk query '**/DefineFunction@{n.name[:7] == \"Counter\"}' counter.py\n\nThis gives us:\n\n counter.py:16:def CounterIter(init = 0):\n counter.py:1:def CounterClosure(init=0):\n\n\nThe `@{..}` represents a python lambda function, with the default variable n.\nThus, it is another way of providing arbitrary functions to match with. [2]_\n\nTo remind the reader that all these queries are langauge agnostic, running the\nabove command, but instead search for all functions that have the letter `e` in\nthe them, in the `stats.c`_ file.::\n\n $ redhawk query '**/DefineFunction@{n.name.find(\"e\") != -1}' stats.c\n\ngives us::\n\n stats.c:17:float Variance(float *p, int len)\n stats.c:5:float Mean(float *p, int len)\n\n*Example 7*:\nFind all assignments where init is involved. Looking again at the `node`\nconfiguration file, we realise that we are looking for `Assignment` Nodes, which\nhave a `ReferVariable` descendent, whose name is 'init'::\n\n $ redhawk query '**/Assignment/**/ReferVariable@[name=\"init\"]' counter.py\n\nThis gives us::\n\n counter.py:2:value = [init]\n counter.py:18:init += 1\n counter.py:10:self.value = init\n\nNote the `@[..]` syntax similar to XPATH, for referring to an attribute.\n\n*Example 8*:\nWhat if we wanted assignments were init was being set, and not referred to? We\nwould use a code block to look at the `lvalue` of the `Assignment`.::\n\n $ redhawk query '**/Assignment@{n.lvalue.name == \"init\"}' counter.py\n\nThis gives us::\n\n counter.py:18:init += 1\n\n*Example 9*:\nLet us find all Function calls that start with 'Counter'. Looking again at the\n`node`_ yaml configuration, we see that we want to find 'CallFunction's, where\nthe function object has a name starting with \"Counter\". [3]_ ::\n\n $ redhawk query '**/CallFunction@{n.function.name[:7] == \"Counter\"}' counter.py\n\nThis gives us::\n\n counter.py:24:c3 = CounterIter()\n counter.py:22:c1 = CounterClosure()\n counter.py:23:c2 = CounterClass()\n\n*Example 10*\nLet us find all Function definitions whose first argument is `self` [4]_::\n\n $ redhawk query '**/DefineFunction/FunctionArguments/@[name=\"self\"][0]' counter.py\n\nThis gives us::\n\n counter.py:12: def Bump(self):\n counter.py:9: def __init__(self, init=0):\n\nThe last `[0]` is square brackets, indicates the position of that node with\nrespect to its parent.\n\n*Example 11*\nLet us find all Function definitions whose last argument is `self`. The\nfollowing query is *WRONG*::\n\n $ redhawk query '**/DefineFunction/FunctionArguments/@[name=\"self\"][-1]' counter.py\n\nThe above query gives us no output. Why? Looking at the `node`_ configuration\nfile, we see that, `FunctionArguments` has three children --- `arguments`,\n`var_arguments`, `kwd_arguments`, the latter two of which are `None`\neverywhere in the file as no variable or keyword arguments are used. Thus, the\nchildren of `FunctionArguments` everywhere in the `counter.py` file takes the\nform `[[..], None, None]`.\n\nWhat we really want, is the last element of the first element, the `arguments`\nlist. This can be expressed as follows [4]_::\n\n $ redhawk query '**/DefineFunction/FunctionArguments/@[name=\"self\"][0, -1]' counter.py\n\nThis gives us::\n\n counter.py:12: def Bump(self):\n\nIn hindsight, the query in the previous example could have also been expressed\nas::\n\n $ redhawk query '**/DefineFunction/FunctionArguments/@[name=\"self\"][0, 0]' counter.py\n\n\nNote: For convenience's sake, even `[0, -1, 0]`, or `[0, -1, 0, 0, .. , 0]` is\ndefined to return the same result. Read the 'Position Syntax' section in the\ndocumentation of `redhawk.common.xpath` for more information.\n\n\nAn abstract grammar of the query language can be found via::\n\n $ pydoc redhawk.common.xpath\n\nMuch more is possible, using the Selector API.\n\nUsing the API\n-------------\n\nThe `redhawk` package can also be used as an API by importing\n`redhawk.common.selector` and related packages. Some of the useful packages\nare already imported for the user in `redhawk prompt` and are a good place to\nstart things at.\n\n*Example 1*:\nSuppose in the above file we wanted to find all generators, i.e, function\ndefinitions, which had a yield as a descendent. We shall see how easy, and\nlogical this query becomes using selectors.\n\nWe first go into a redhawk prompt::\n\n $ redhawk prompt counter.py\n \n\nWe are greeted with a help banner::\n\n Built in Variables:\n trees - contains the parse trees of the files passed in the command line\n \n Built in Functions:\n ConvertFileToAst - Converts a file into a language agnostic AST.\n ConvertCodeToAst - Converts a code snippet into a language agnostic AST.\n Help - Displays this prompt.\n ShowASTAsImage - Shows the AST as a graph using dot.\n \n Built in Modules:\n S - redhawk.common.selector\n X - redhawk.common.xpath\n F - redhawk.common.format_position\n \n To view this again, use the Help() function.\n \n\nIn the prompt, we define our selectors. (See `pydoc redhawk.common.selector`\nfor what selectors are, and how they can be composed)::\n\n In [1]: function_def = S.S(node_type='DefineFunction')\n In [2]: yield_stmt = S.S(node_type='Yield')\n In [3]: reqd_selector = function_def.HasDescendant(yield_stmt)\n\n\nWe then apply the selector on the file. The asts of the files passed are in\nthe `trees argument`. Since this file was the first, it is in `trees[0]`::\n\n In [4]: results = list(reqd_selector(trees))\n In [5]: results[0]\n\ngives us::\n\n Out[5]: DefineFunction\n\n\nThis is indeed the function we wanted. Just to be sure, we use the\n`F.PrintContextInFile` function to print the context of the tree.::\n\n In [6]: F.PrintContextInFile(results[0], context=6)\n counter.py:10: self.value = init\n counter.py:11: \n counter.py:12: def Bump(self):\n counter.py:13: self.value += 1\n counter.py:14: return self.value\n counter.py:15: \n counter.py:16: > def CounterIter(init = 0):\n counter.py:17: while True:\n counter.py:18: init += 1\n counter.py:19: yield init\n counter.py:20: \n counter.py:21: if __name__ == '__main__':\n counter.py:22: c1 = CounterClosure()\n\n\nIt is easy to see from this example that selectors are highly composable, and\nthus are very powerful. It is hoped that using selectors becomes a natural way\nto write powerful custom scripts, for querying code.\n\nLicense\n-------\nRedhawk is distributed under the terms of the 2-clause BSD license. You are\nfree to use it for commercial or non-commercial projects with little or no\nrestriction. For a complete text of the license see the LICENSE.txt file in\nthe source distribution.\n\nChange List\n------------\n*v1.2.3*\n\n* Previous release introduced a regression in C where a top level node was\nreturning an empty AST. This version contains this small but important fix.\n\n*v1.2.2*\n\n* Support for running Redhawk via Python 3. Great thanks to \nbkabrda@ and ncoghlan@ for their changes!\n\n* Compatibility for new PyCParser changes.\n\n*v1.2.1*\n\n* The Lua source code written in ANSI-compliant C, can now be Redhawk-ed!\n\n*v1.2.0*\n\n* Added new position functionality to xpath.py! (See Examples 10, and 11 aboev for\n example usage).\n* Added to the default imports in prompt.py: redhawk.common.nodes, redhawk.common.types, redhawk.common.xpath\n* Added a --show-parsed-query option to redhawk query.\n* Made only critical messages appear in the default verbose level.\n\n*v1.1.6*\n\n* Major internal refactoring involving get_ast.py\n* Prompt command accepts directories, and can be told not to use IPython.\n* A new selector function called Apply to make prompt usage easier.\n\n* Bug fixes wrt IPython shell and error handling.\n\n*v1.1.5*\n\n* `Vim plugin`_ released.\n\n* Patch to FormatPosition to not strip lines when context = 0.\n\n*v1.1.4*\n\n* Bugs fixed in xpath.py and pickling of NodeMatchQuery class for Parallel\n Python.\n\n*v1.1.3*\n\nBugs in the README's RST syntax fixed.\n\n*v1.1.2*\n\n* Redhawk can now use parallel python (on the same machine), to perform\n queries on codebases. This speeds up Redhawk (almost) proportionally to the\n number of cores you have on your computer. Redhawk can now query for\n closures in Django in just ~20 seconds.\n\n* Friendlier usage strings and help messages.\n\n*v1.1.1*\n\n* Python2.7 compatibility: ast.parse (Thanks to Nafai77)\n\n* Profiled, performance improvements by 15% by shifting to deque, and caching\n flattened children.\n\n* Provided a bin/start_simple_bash_with_redhawk_in_pythonpath.sh to enter a\n temporary shell with redhawk in PYTHONPATH (for devs).\n\n*v1.1.0*\n\n* Fast enough to work on Django - Querying DefineClass anywhere in the\n codebase (~2300 python files), takes just 45 seconds on a celeron netbook.\n Thats 19ms per file!\n\n* Uses the shelve module instead of the pickle module, to decrease read and\n write times for the redhawk database.\n\n* Redhawk supports three new commands - `listfiles`, `remove`, `where`\n \n* The `query`, and `show`, commands take an extra argument `-s`, to decide if\n new trees should be added to the database.\n\n* Skip a file if there is a parser error.\n\n.. [1] `ast_gen.py`_ generates `node.py`_ and `types.py`_ using these YAML configuration files.\n\n.. [2] In fact the portion inside the `@{..}` is just appended to a 'lambda n:' and `eval`-ed to get a function.\n\n.. [3] Note that 'CallFunction's do not directly have a name. This is because the function object, unlike that of a function definition, can be a value. It is possible to do (f.g[x])(y), and such.\n\n.. [4] These queries actually finds us the argument, and not the function itself. But this shouldn't matter when we have the definition on the same line.\n\n\n\n.. _Vim plugin: http://www.vim.org/scripts/script.php?script_id=3586\n.. _imgur: http://imgur.com/CBHCX\n.. _counter.py: https://github.com/spranesh/Redhawk/tree/master/redhawk/test/files/examples/counter.py\n.. _stats.c: https://github.com/spranesh/Redhawk/tree/master/redhawk/test/files/examples/stats.c\n.. _ast_gen.py: https://github.com/spranesh/Redhawk/blob/master/redhawk/common/_ast_gen.py\n.. _node.py: https://github.com/spranesh/Redhawk/blob/master/redhawk/common/node.py\n.. _types.py: https://github.com/spranesh/Redhawk/blob/master/redhawk/common/types.py\n.. _node: https://github.com/spranesh/Redhawk/blob/master/redhawk/common/_node_cfg.yaml\n.. _types: https://github.com/spranesh/Redhawk/blob/master/redhawk/common/_types_cfg.yaml\n.. _here: http://pycparser.googlecode.com/hg/README.html#installation-process\n.. _pip: http://pypi.python.org/pypi/pip\n.. _github: http://www.github.com/spranesh/Redhawk\n.. _Python Graphviz: http://networkx.lanl.gov/pygraphviz/\n.. _pycparser: http://code.google.com/p/pycparser/ \n.. _pp: http://pypi.python.org/pypi/pp\n.. _Python YAML: http://www.pyyaml.org\n.. _nosetests: http://somethingaboutorange.com/mrl/projects/nose/1.0.0/\n.. _Youtube: http://www.youtube.com/watch?v=azaXpahrxww", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/redhawk/", "keywords": null, "license": "The BSD 2-Clause License", "maintainer": null, "maintainer_email": null, "name": "redhawk", "package_url": "https://pypi.org/project/redhawk/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/redhawk/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/redhawk/" }, "release_url": "https://pypi.org/project/redhawk/1.2.3/", "requires_dist": null, "requires_python": null, "summary": "An AST based navigation system.", "version": "1.2.3" }, "last_serial": 2294909, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "96c4766e9e34ef43e9e9f8fb62546cd4", "sha256": "75c8025e6cdcbfa644a611a1e916765aa29bcaed7acfd218da22511077fede59" }, "downloads": -1, "filename": "redhawk-1.0.1.tar.gz", "has_sig": false, "md5_digest": "96c4766e9e34ef43e9e9f8fb62546cd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58636, "upload_time": "2011-05-11T16:54:53", "url": "https://files.pythonhosted.org/packages/12/d1/abfbaa161cec35bd8759e40842366f6e50f84460c2b03d0e3ab0a40e3d0c/redhawk-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "e182b7e5ae7f6b7b4b2f28bb7e32cdbd", "sha256": "53763c619331e6a0f52db620fa3c2fab8a7b468f0e7a4a0fb68f69baabca1d40" }, "downloads": -1, "filename": "redhawk-1.0.2.tar.gz", "has_sig": false, "md5_digest": "e182b7e5ae7f6b7b4b2f28bb7e32cdbd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58788, "upload_time": "2011-05-11T17:10:01", "url": "https://files.pythonhosted.org/packages/cc/34/d58090159348628a43a6d254802ed4a8844ebfaba174fec425991c3e7925/redhawk-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "8b4cdaaf7d7b3c291d3fbb3128c1cb7a", "sha256": "0b4337b6cf4b21412956fc2c6b6a02b4083f8aa6b9aa057415ced7836f37c152" }, "downloads": -1, "filename": "redhawk-1.0.3.tar.gz", "has_sig": false, "md5_digest": "8b4cdaaf7d7b3c291d3fbb3128c1cb7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61033, "upload_time": "2011-05-12T15:09:42", "url": "https://files.pythonhosted.org/packages/75/a3/5a36110de8a3b6efc774daf4a0f22f35cc02e4a1114c5235df1af501e772/redhawk-1.0.3.tar.gz" } ], "1.0.3dev": [], "1.1.0": [ { "comment_text": "", "digests": { "md5": "abecfcc95b42752bcab4911fb7e6c6c7", "sha256": "94c9dc77f4275889fa1cee8cd86952ad4489337a3babb8c8500cfed7a9366e27" }, "downloads": -1, "filename": "redhawk-1.1.0.tar.gz", "has_sig": false, "md5_digest": "abecfcc95b42752bcab4911fb7e6c6c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63359, "upload_time": "2011-05-12T21:52:54", "url": "https://files.pythonhosted.org/packages/49/24/d82f4255f69d799f67ac13717a9846838082b2189ff844d639df3b1367a2/redhawk-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "7fb2aafa236b5b949e89ce19d8275f61", "sha256": "4c1c714cd5ed95fec135e76f0e387f942e9c5d3e81f2b35151211b15c57daf28" }, "downloads": -1, "filename": "redhawk-1.1.1.tar.gz", "has_sig": false, "md5_digest": "7fb2aafa236b5b949e89ce19d8275f61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63827, "upload_time": "2011-05-14T09:55:24", "url": "https://files.pythonhosted.org/packages/5d/4d/f0b7cac65ab556dcdce282148f33d78ef99df858f6b7d325217e68501b56/redhawk-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "9742400a1688e899161b2531ee516849", "sha256": "ea9cff3816f04e01953cd898dec895cff17fbaab81b2cdc46b7945c00678640b" }, "downloads": -1, "filename": "redhawk-1.1.2.tar.gz", "has_sig": false, "md5_digest": "9742400a1688e899161b2531ee516849", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66743, "upload_time": "2011-05-14T22:33:16", "url": "https://files.pythonhosted.org/packages/8f/43/d41f557b8500feb9b183899f2914365824c0c6c7191e22bee67572c21396/redhawk-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "c9d247e8da7cd433766f7f50c027e217", "sha256": "184e830bd70f1ba9612ff6d02c7e166b9ab1f8b0ba3f9be946d32f4d96b21b1a" }, "downloads": -1, "filename": "redhawk-1.1.3.tar.gz", "has_sig": false, "md5_digest": "c9d247e8da7cd433766f7f50c027e217", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66752, "upload_time": "2011-05-14T22:45:21", "url": "https://files.pythonhosted.org/packages/7f/fa/8d44910c3a71bb8217fcdaa747d3cd92e068b3abf8626f1ad992e661f793/redhawk-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "2d37ae49d291cd8ff567df88d19735cd", "sha256": "91bde13777e18066dd4ecb4061930f4473fc5c9da7f4db21ee87855517749edf" }, "downloads": -1, "filename": "redhawk-1.1.4.tar.gz", "has_sig": false, "md5_digest": "2d37ae49d291cd8ff567df88d19735cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68598, "upload_time": "2011-05-16T21:02:09", "url": "https://files.pythonhosted.org/packages/c6/b2/b7e947ba31518e1357c3b9297e579da3b4af8bb2a5f7ce0537ec55507f82/redhawk-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "23d71bcf5e739b85d1795e325dd6f19d", "sha256": "17e1a4d961eb83ff2628a21d528fa8267f0af5171558570d286082e1d104c31e" }, "downloads": -1, "filename": "redhawk-1.1.5.tar.gz", "has_sig": false, "md5_digest": "23d71bcf5e739b85d1795e325dd6f19d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76902, "upload_time": "2011-05-16T22:05:03", "url": "https://files.pythonhosted.org/packages/77/21/f65caeebf21b19b9948d5f4d43326cabacc37ac598a6bb1b23b45665da67/redhawk-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "336ed6de91e6fa5001e1a975bf1f1c08", "sha256": "2e9a360ef77be555c24b55e60b49eb1ee9f6f18e75ed26cacf06782c7d8f85c6" }, "downloads": -1, "filename": "redhawk-1.1.6.tar.gz", "has_sig": false, "md5_digest": "336ed6de91e6fa5001e1a975bf1f1c08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 79697, "upload_time": "2011-05-17T21:15:31", "url": "https://files.pythonhosted.org/packages/b5/d5/d25ef2f621ba31d5484f026ba8dd10441eed47f17261c79a3bea2ee73a73/redhawk-1.1.6.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "790e34deb15d84ec91c3691e360132ad", "sha256": "6745597655eebf7ef4c640c556313e69e013ceb04bebafc928da3c563f4caa32" }, "downloads": -1, "filename": "redhawk-1.2.0.tar.gz", "has_sig": false, "md5_digest": "790e34deb15d84ec91c3691e360132ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 81880, "upload_time": "2011-05-19T20:40:29", "url": "https://files.pythonhosted.org/packages/42/94/f711fa0839066cce2462ae0ac3326e9be136c44802ec4a49a6734287ab90/redhawk-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "a39ed46b0f531b53b44f343e53832452", "sha256": "84a0e694ff90950c6fcc628cd3862a99b728d17978e3cd28fae8094b5ddb2db2" }, "downloads": -1, "filename": "redhawk-1.2.1.tar.gz", "has_sig": false, "md5_digest": "a39ed46b0f531b53b44f343e53832452", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 83429, "upload_time": "2011-05-21T07:02:25", "url": "https://files.pythonhosted.org/packages/bb/bf/003e5fadb68ef699105c2a155191e48635f5c55561e42e34a7cb0ef1d2bb/redhawk-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "98c0289965c6bcdbd8dd30db4d0e0b9c", "sha256": "72cdc17b7f6093ea5f2d1dacf4500cb6f1047b01a0fc24237c7ab587868c9f2f" }, "downloads": -1, "filename": "redhawk-1.2.2.tar.gz", "has_sig": false, "md5_digest": "98c0289965c6bcdbd8dd30db4d0e0b9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89238, "upload_time": "2016-08-22T04:52:35", "url": "https://files.pythonhosted.org/packages/83/a9/3ae293bcc7ade588e61314cc08bd404ab4d49ab8e5b9299e43475efd205d/redhawk-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "2732a46daa74c321ceec252498720986", "sha256": "c38a12861b9e4992daf38a75eefe75cd45dd1fd34c49f17718db8dd3279e1980" }, "downloads": -1, "filename": "redhawk-1.2.3.tar.gz", "has_sig": false, "md5_digest": "2732a46daa74c321ceec252498720986", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89418, "upload_time": "2016-08-22T05:24:15", "url": "https://files.pythonhosted.org/packages/98/a8/d87e3e03e577324b196ae29938c80e16469cdd3920e06a04fe0c2b4fdcda/redhawk-1.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2732a46daa74c321ceec252498720986", "sha256": "c38a12861b9e4992daf38a75eefe75cd45dd1fd34c49f17718db8dd3279e1980" }, "downloads": -1, "filename": "redhawk-1.2.3.tar.gz", "has_sig": false, "md5_digest": "2732a46daa74c321ceec252498720986", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 89418, "upload_time": "2016-08-22T05:24:15", "url": "https://files.pythonhosted.org/packages/98/a8/d87e3e03e577324b196ae29938c80e16469cdd3920e06a04fe0c2b4fdcda/redhawk-1.2.3.tar.gz" } ] }