{ "info": { "author": "Andrew Moffat", "author_email": "andrew.robert.moffat@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "PBS has now become sh.\n======================\n\nPBS will no longer be supported. Please upgrade here:\n\nhttp://pypi.python.org/pypi/sh\n\nAnd migrate your existin code with:\n\n```python\nimport sh as pbs\n```\n\n* * *\n\nPBS is a unique subprocess wrapper that maps your system programs to\nPython functions dynamically. PBS helps you write shell scripts in\nPython by giving you the good features of Bash (easy command calling, easy\npiping) with all the power and flexibility of Python.\n\n```python\nfrom pbs import ifconfig\nprint ifconfig(\"eth0\")\n```\n\nPBS is not a collection of system commands implemented in Python.\n\n# Getting\n\n $> pip install pbs\n\n# Usage\n\nThe easiest way to get up and running is to import pbs\ndirectly or import your program from pbs:\n\n```python\nimport pbs\nprint pbs.ifconfig(\"eth0\")\n\nfrom pbs import ifconfig\nprint ifconfig(\"eth0\")\n```\n\nA less common usage pattern is through PBS Command wrapper, which takes a\nfull path to a command and returns a callable object. This is useful for\nprograms that have weird characters in their names or programs that aren't in\nyour $PATH:\n\n```python\nimport pbs\nffmpeg = pbs.Command(\"/usr/bin/ffmpeg\")\nffmpeg(movie_file)\n```\n\nThe last usage pattern is for trying PBS through an interactive REPL. By\ndefault, this acts like a star import (so all of your system programs will be\nimmediately available as functions):\n\n $> python pbs.py\n\n\n# Examples\n\n## Executing Commands\n\nCommands work like you'd expect. **Just call your program's name like\na function:**\n\n```python\n# print the contents of this directory \nprint ls(\"-l\")\n\n# get the longest line of this file\nlongest_line = wc(__file__, \"-L\")\n\n# get interface information\nprint ifconfig(\"eth0\")\n```\n\nNote that these aren't Python functions, these are running the binary\ncommands on your system dynamically by resolving your PATH, much like Bash does.\nIn this way, all the programs on your system are easily available\nin Python.\n\nYou can also call attributes on commands. This translates to the command\nname followed by the attribute name:\n\n```python\nfrom pbs import git\n\n# resolves to \"git branch -v\"\nprint git.branch(\"-v\")\n```\n\nIt turns out this is extremely useful for commands whose first argument is often\nanother sub-command (like git, svn, time, sudo, etc).\nSee \"Baking\" for an advanced usage of this.\n\n## Keyword Arguments\n\nKeyword arguments also work like you'd expect: they get replaced with the\nlong-form and short-form commandline option:\n\n```python\n# resolves to \"curl http://duckduckgo.com/ -o page.html --silent\"\ncurl(\"http://duckduckgo.com/\", o=\"page.html\", silent=True)\n\n# or if you prefer not to use keyword arguments, this does the same thing:\ncurl(\"http://duckduckgo.com/\", \"-o\", \"page.html\", \"--silent\")\n\n# resolves to \"adduser amoffat --system --shell=/bin/bash --no-create-home\"\nadduser(\"amoffat\", system=True, shell=\"/bin/bash\", no_create_home=True)\n\n# or\nadduser(\"amoffat\", \"--system\", \"--shell\", \"/bin/bash\", \"--no-create-home\")\n```\n\n## Piping\n\nPiping has become function composition:\n\n```python\n# sort this directory by biggest file\nprint sort(du(glob(\"*\"), \"-sb\"), \"-rn\")\n\n# print the number of folders and files in /etc\nprint wc(ls(\"/etc\", \"-1\"), \"-l\")\n```\n\n## Redirection\n\nPBS can redirect the standard and error output streams of a process to a file. \nThis is done with the special _out and _err keyword arguments. You can pass a\nfilename or a file object as the argument value. When the name of an already \nexisting file is passed, the contents of the file will be overwritten.\n\n```python\nls(_out=\"files.list\")\nls(\"nonexistent\", _err=\"error.txt\")\n```\n\nPBS can also redirect the error output stream to the standard output stream,\nusing the special _err_to_out=True keyword argument.\n\n\n## Sudo and With Contexts\n\nCommands can be run within a \"with\" context. Popular commands using this\nmight be \"sudo\" or \"fakeroot\":\n\n```python\nwith sudo:\n print ls(\"/root\")\n```\n\nIf you need\nto run a command in a with context AND call it, for example, specifying\na -p prompt with sudo, you need to use the \"_with\" keyword argument.\nThis let's the command know that it's being run from a with context so\nit can behave correctly.\n\n```python\nwith sudo(p=\">\", _with=True):\n print ls(\"/root\")\n```\n\n## Background Processes\n\nCommands can be run in the background with the special _bg=True keyword\nargument:\n\n```python\n# blocks\nsleep(3)\nprint \"...3 seconds later\"\n\n# doesn't block\np = sleep(3, _bg=True)\nprint \"prints immediately!\"\np.wait()\nprint \"...and 3 seconds later\"\n```\n\nYou can also pipe together background processes!\n\n```python\np = wc(curl(\"http://github.com/\", silent=True, _bg=True), \"--bytes\")\nprint \"prints immediately!\"\nprint \"byte count of github: %d\" % int(p) # lazily completes\n```\n\nThis lets you start long-running commands at the beginning of your script\n(like a file download) and continue performing other commands in the\nforeground.\n\n\n## Foreground Processes\n\nForeground processes are processes that you want to interact directly with\nthe default stdout and stdin of your terminal. In other words, these are\nprocesses that you do not want to return their output as a return value\nof their call. An example would be opening a text editor:\n\n```python\nvim(file_to_edit)\n```\n\nThis will block because pbs will be trying to aggregate the output\nof the command to python, without displaying anything to the screen. The\nsolution is the \"_fg\" special keyword arg:\n\n```python\nvim(file_to_edit, _fg=True)\n```\n\nThis will open vim as expected and let you use it as expected, with all\nthe input coming from the keyboard and the output going to the screen.\nThe return value of a foreground process is an empty string.\n\n\n## Finding Commands\n\n\"Which\" finds the full path of a program, or returns None if it doesn't exist.\nThis command is one of the few commands implemented as a Python function,\nand therefore doesn't rely on the \"which\" program actually existing. \n\n```python\nprint which(\"python\") # \"/usr/bin/python\"\nprint which(\"ls\") # \"/bin/ls\"\nprint which(\"some_command\") # None\n\nif not which(\"supervisorctl\"): apt_get(\"install\", \"supervisor\", \"-y\")\n```\n\n## Baking\n\nPBS is capable of \"baking\" arguments into commands. This is similar\nto the stdlib functools.partial wrapper. An example can speak volumes:\n\n```python\nfrom pbs import ls\n\nls = ls.bake(\"-la\")\nprint ls # \"/usr/bin/ls -la\"\n\n# resolves to \"ls / -la\"\nprint ls(\"/\") \n```\n\nThe idea is that calling \"bake\" on a command creates a callable object \nthat automatically passes along all of the arguments passed into \"bake\".\nThis gets **really interesting** when you combine this with the attribute\naccess on a command:\n\n```python\nfrom pbs import ssh\n\n# calling whoami on the server. this is tedious to do if you're running\n# any more than a few commands.\niam1 = ssh(\"myserver.com\", \"-p 1393\", \"whoami\")\n\n# wouldn't it be nice to bake the common parameters into the ssh command?\nmyserver = ssh.bake(\"myserver.com\", p=1393)\n\nprint myserver # \"/usr/bin/ssh myserver.com -p 1393\"\n\n# resolves to \"/usr/bin/ssh myserver.com -p 1393 whoami\"\niam2 = myserver.whoami()\n\nassert(iam1 == iam2) # True!\n```\n\nNow that the \"myserver\" callable represents a baked ssh command, you\ncan call anything on the server easily:\n\n```python\n# resolves to \"/usr/bin/ssh myserver.com -p 1393 tail /var/log/dumb_daemon.log -n 100\"\nprint myserver.tail(\"/var/log/dumb_daemon.log\", n=100)\n```\n\n## Environment Variables\n\nEnvironment variables are available much like they are in Bash:\n\n```python\nprint HOME\nprint SHELL\nprint PS1\n```\n\nYou can set enviroment variables the usual way, through the os.environ\nmapping:\n\n```python\nimport os\nos.environ[\"TEST\"] = \"123\"\n```\n\nNow any new subprocess commands called from the script will be able to\naccess that environment variable.\n\n## Exceptions\n\nExceptions are dynamically generated based on the return code of the command.\nThis lets you catch a specific return code, or catch all error return codes\nthrough the base class ErrorReturnCode:\n\n```python\ntry: print ls(\"/some/non-existant/folder\")\nexcept ErrorReturnCode_2:\n print \"folder doesn't exist!\"\n create_the_folder()\nexcept ErrorReturnCode:\n print \"unknown error\"\n exit(1)\n```\n\n## Globbing\n\nGlob-expansion is not done on your arguments. For example, this will not work:\n\n```python\nfrom pbs import du\nprint du(\"*\")\n```\n\nYou'll get an error to the effect of \"cannot access '\\*': No such file or directory\".\nThis is because the \"\\*\" needs to be glob expanded:\n\n```python\nfrom pbs import du, glob\nprint du(glob(\"*\")) \n```\n\n\n## Commandline Arguments\n\nYou can access commandline arguments similar to Bash's $1, $2, etc by using\nARG1, ARG2, etc:\n\n```python\nprint ARG1, ARG2\n\n# if an argument isn't defined, it's set to None\nif ARG10 is None: do_something()\n```\n\nYou can access the entire argparse/optparse-friendly list of commandline\narguments through \"ARGV\". This is recommended for flexibility:\n\n```python\nimport argparse\nparser = argparse.ArgumentParser(prog=\"PROG\")\nparser.add_argument(\"-x\", default=3, type=int)\nns = parser.parse_args(ARGV)\nprint ns.x\n```\n\n\n## Weirdly-named Commands\n\nPBS automatically handles underscore-dash conversions. For example, if you want\nto call apt-get:\n\n```python\napt_get(\"install\", \"mplayer\", y=True)\n```\n\nPBS looks for \"apt_get\", but if it doesn't find it, replaces all underscores\nwith dashes and searches again. If the command still isn't found, a\nCommandNotFound exception is raised.\n\nCommands with other, less-commonly symbols in their names must be accessed\ndirectly through the \"Command\" class wrapper. The Command class takes the full\npath to the program as a string:\n\n```python\np27 = Command(which(\"python2.7\"))\nprint p27(\"-h\")\n```\n\nThe Command wrapper is also useful for commands that are not in your standard PATH:\n\n```python\nscript = Command(\"/tmp/temporary-script.sh\")\nprint script()\n```\n\n## Non-standard Exit Codes\n\nNormally, if a command returns an exit code that is not 0, PBS raises an exception\nbased on that exit code. However, if you have determined that an error code\nis normal and want to retrieve the output of the command without PBS raising an\nexception, you can use the \"_ok_code\" special argument to suppress the exception:\n\n```python\noutput = pbs.ls(\"dir_that_exists\", \"dir_that_doesnt\", _ok_code=2)\n```\n\nIn the above example, even though you're trying to list a directory that doesn't\nexist, you can still get the output from the directory that does exist by telling\nthe command that 2 is an \"ok\" exit code, so don't raise an exception.\n\n_ok_code can also take a list or tuple of numbers for multiple ok exit codes. \n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/amoffat/pbs", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "pbs", "package_url": "https://pypi.org/project/pbs/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pbs/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/amoffat/pbs" }, "release_url": "https://pypi.org/project/pbs/0.110/", "requires_dist": null, "requires_python": null, "summary": "Python subprocess wrapper", "version": "0.110" }, "last_serial": 796093, "releases": { "0.100": [ { "comment_text": "", "digests": { "md5": "54e28167c24277d954921c91d65d3984", "sha256": "84a4e6a261199cefe421ed0fa3276b53fbb864817cef59eb6256ff840e645902" }, "downloads": -1, "filename": "pbs-0.100.tar.gz", "has_sig": false, "md5_digest": "54e28167c24277d954921c91d65d3984", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13093, "upload_time": "2012-03-16T04:27:03", "url": "https://files.pythonhosted.org/packages/fc/0c/d743c293c073b1b69421fd7c955bf05d4068d0b5a8de9539e11ddc720a44/pbs-0.100.tar.gz" } ], "0.101": [ { "comment_text": "", "digests": { "md5": "14e35d44f414f5289a342a1fa46fbfc1", "sha256": "22a15336ef2b15c16d354f701b651e4e1d3cb75cc6a0a80721e738e535d82655" }, "downloads": -1, "filename": "pbs-0.101.tar.gz", "has_sig": false, "md5_digest": "14e35d44f414f5289a342a1fa46fbfc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13086, "upload_time": "2012-03-16T05:31:28", "url": "https://files.pythonhosted.org/packages/4b/bf/dec1718a2e154d519e5f791a0a174cc534b033edecd2806f25ba07ce17a7/pbs-0.101.tar.gz" } ], "0.102": [ { "comment_text": "", "digests": { "md5": "504fadc68f99dbd730f4f453f6529de4", "sha256": "c493013686525732ee6e0aa2f91084dd164bf39953e3000e15bc3d44196e1275" }, "downloads": -1, "filename": "pbs-0.102.tar.gz", "has_sig": false, "md5_digest": "504fadc68f99dbd730f4f453f6529de4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13449, "upload_time": "2012-03-23T01:50:50", "url": "https://files.pythonhosted.org/packages/d1/6a/c912a303e4e823756647190f7d1a86565eaa0143842a42ea1360284b77ed/pbs-0.102.tar.gz" } ], "0.103": [ { "comment_text": "", "digests": { "md5": "32c7c441b33f80b3d03c1076e4f5da24", "sha256": "70b476ae35c506c160a668edf9ae0d3d3a2b5caab411bcf3e405b3fd6befb0d8" }, "downloads": -1, "filename": "pbs-0.103.tar.gz", "has_sig": false, "md5_digest": "32c7c441b33f80b3d03c1076e4f5da24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13523, "upload_time": "2012-03-23T20:28:27", "url": "https://files.pythonhosted.org/packages/72/e9/fb8e3fbb0fd650d4b43f57b8140ec11bdb44203647e704f5f98d9e9ec684/pbs-0.103.tar.gz" } ], "0.104": [ { "comment_text": "", "digests": { "md5": "a554d83a67c5912807693e0b15b8f492", "sha256": "b8aaef449186dfc897eee4f4604b2f3f534829b2cdd572cc2525ac799134666b" }, "downloads": -1, "filename": "pbs-0.104.tar.gz", "has_sig": false, "md5_digest": "a554d83a67c5912807693e0b15b8f492", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13068, "upload_time": "2012-03-28T05:51:31", "url": "https://files.pythonhosted.org/packages/cd/a8/e1b7dde4972cac620b47c906a8e94ce9beeab0d0046ce67e2fecd3f444aa/pbs-0.104.tar.gz" } ], "0.105": [ { "comment_text": "", "digests": { "md5": "ff9b264df71ffcc7780b2c88f14c54ce", "sha256": "16dd6ce46013361ff88bfe59996a6e1b8641992aff05bcde5c068a282fcc7e15" }, "downloads": -1, "filename": "pbs-0.105.tar.gz", "has_sig": false, "md5_digest": "ff9b264df71ffcc7780b2c88f14c54ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13704, "upload_time": "2012-04-04T22:40:12", "url": "https://files.pythonhosted.org/packages/c6/9e/fe09096c6662fa14da866d6886bd2c15fd29c3a571310be156595a9a7afb/pbs-0.105.tar.gz" } ], "0.107": [ { "comment_text": "", "digests": { "md5": "1ecf3c47a41acb136400b580f3afa014", "sha256": "f63b0e48a8631553e8502fceb3bcccefd86c85e5bff188da772f56762dfa3569" }, "downloads": -1, "filename": "pbs-0.107.tar.gz", "has_sig": false, "md5_digest": "1ecf3c47a41acb136400b580f3afa014", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13696, "upload_time": "2012-07-07T01:03:29", "url": "https://files.pythonhosted.org/packages/47/81/a65a91123fc455c960dd779bdb2353e2cf7a0f50e99bfedea830216d90f4/pbs-0.107.tar.gz" } ], "0.108": [ { "comment_text": "", "digests": { "md5": "e532fcbcfa741c4d6cecebbb7e68f4be", "sha256": "10767cc413853f6494ba206fc1dbd78c995dc524b67fc30013cda8fbe330831e" }, "downloads": -1, "filename": "pbs-0.108.tar.gz", "has_sig": false, "md5_digest": "e532fcbcfa741c4d6cecebbb7e68f4be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13637, "upload_time": "2012-07-17T03:47:08", "url": "https://files.pythonhosted.org/packages/a9/a9/f8f51f08e54f8e7a55f572efaddf79104722d8a581757ee41d04c0c731dc/pbs-0.108.tar.gz" } ], "0.109": [ { "comment_text": "", "digests": { "md5": "fff31f90184a3eec5d73f6210bfd6aee", "sha256": "f3a4c023617d3f1f08198b926ecb6e922e752a420c21f02e4f73787ab956e5c2" }, "downloads": -1, "filename": "pbs-0.109.tar.gz", "has_sig": false, "md5_digest": "fff31f90184a3eec5d73f6210bfd6aee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13235, "upload_time": "2012-09-14T07:35:48", "url": "https://files.pythonhosted.org/packages/2a/f1/f6c808090c8aac3e28b818bc363a63b1b8fde7b62a1f87ba4534cb8e5143/pbs-0.109.tar.gz" } ], "0.110": [ { "comment_text": "", "digests": { "md5": "89965e2207d76445810ceb0cf2f37039", "sha256": "05fafccbab7ce1cb2f25330267c8a622b569ad95b40c83220a36983f53757469" }, "downloads": -1, "filename": "pbs-0.110.tar.gz", "has_sig": false, "md5_digest": "89965e2207d76445810ceb0cf2f37039", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13427, "upload_time": "2012-10-20T18:47:28", "url": "https://files.pythonhosted.org/packages/fe/0f/7bae82505a8678de06aed0974dbe24c2f963de55e6d15390f36131fa7cd4/pbs-0.110.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "05b3cf0cf2d331762cd3b5901a59ef58", "sha256": "c9ae779dc3c6c473762e3d7c77c03eaa0b56dfdba7536395b385ba532781fbab" }, "downloads": -1, "filename": "pbs-0.5.tar.gz", "has_sig": false, "md5_digest": "05b3cf0cf2d331762cd3b5901a59ef58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8808, "upload_time": "2012-01-31T06:26:42", "url": "https://files.pythonhosted.org/packages/ac/71/854e333c35dfe5a9721fb1e859b7c80605ed694f2769b4b6c448ff73db57/pbs-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "6300fa699e4a992f912a699c4c4efef5", "sha256": "c1c39feaed2392c8083a25973980eba7135702ada206a51f03bc183837de9327" }, "downloads": -1, "filename": "pbs-0.6.tar.gz", "has_sig": false, "md5_digest": "6300fa699e4a992f912a699c4c4efef5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8822, "upload_time": "2012-01-31T19:24:28", "url": "https://files.pythonhosted.org/packages/cb/3a/5022dc809b97f1e9bc17e8e32e9f12bf119cfe7d9f1cf4f78a65941b9dcb/pbs-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "b552369887b6a3e911779c0470ebf218", "sha256": "459bf96042d496cc0768998ce2a5acd986436b76f2ae8dd52c4a690d3f2be6a2" }, "downloads": -1, "filename": "pbs-0.7.tar.gz", "has_sig": false, "md5_digest": "b552369887b6a3e911779c0470ebf218", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9329, "upload_time": "2012-02-01T04:46:22", "url": "https://files.pythonhosted.org/packages/1c/89/7d41452c0ab6af01f55c5bd33746ec7968633d1480657f59cb0f8cec6cf9/pbs-0.7.tar.gz" } ], "0.71": [ { "comment_text": "", "digests": { "md5": "444ae8146aa6a67092a91bcfe126729a", "sha256": "110d0dbeec07ef8c9adafd577fbfe65b9940856e06070b3b167eae8592cd1c1e" }, "downloads": -1, "filename": "pbs-0.71.tar.gz", "has_sig": false, "md5_digest": "444ae8146aa6a67092a91bcfe126729a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9368, "upload_time": "2012-02-01T23:57:34", "url": "https://files.pythonhosted.org/packages/5f/e0/a5c9cd4787d548a77f99d88497d4fb56eee2a8271e8fc4e6ce49821539ac/pbs-0.71.tar.gz" } ], "0.75": [ { "comment_text": "", "digests": { "md5": "4b9dd4475815feacd36344a2ae966487", "sha256": "9bf020a1c9e26b653cb5e831906e54baeb2426aecea6b8d53a91687b60ce8675" }, "downloads": -1, "filename": "pbs-0.75.tar.gz", "has_sig": false, "md5_digest": "4b9dd4475815feacd36344a2ae966487", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10060, "upload_time": "2012-02-02T06:10:26", "url": "https://files.pythonhosted.org/packages/20/51/73479193c11dc3e481d1cf7dd97ec328519da47590b44ae13946503f68f1/pbs-0.75.tar.gz" } ], "0.80": [ { "comment_text": "", "digests": { "md5": "eba0ae5da1c4b7f24657972129e54737", "sha256": "2fc447829a91ff3e40e92260d8386c2456ac2fdb06f7bbff8ddbe0b032274365" }, "downloads": -1, "filename": "pbs-0.80.tar.gz", "has_sig": false, "md5_digest": "eba0ae5da1c4b7f24657972129e54737", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10197, "upload_time": "2012-02-03T06:54:03", "url": "https://files.pythonhosted.org/packages/4d/f7/1c20d193389431ca2bf6b02e96436a45f85cc4f9fc89cc16325acbfb991f/pbs-0.80.tar.gz" } ], "0.81": [ { "comment_text": "", "digests": { "md5": "8d3f83fb3d931e3d79a8ecfcb973ee35", "sha256": "a5cb3cd3ad326e855ddc0a2f2a0ece858fceec920f42b89317c789621f2b143d" }, "downloads": -1, "filename": "pbs-0.81.tar.gz", "has_sig": false, "md5_digest": "8d3f83fb3d931e3d79a8ecfcb973ee35", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10980, "upload_time": "2012-02-03T19:05:24", "url": "https://files.pythonhosted.org/packages/5d/38/71b55644bbece2c2441ec73746c5c9d2b90e8e5cad3fb7f013b2e526b590/pbs-0.81.tar.gz" } ], "0.82": [ { "comment_text": "", "digests": { "md5": "14e7cebfb5b3c08b9dc9e16f80f9d187", "sha256": "4e40546411a8c16eab9f83a30b88bafa5c90da70081f2bbf0aa0bfdd8d88af3d" }, "downloads": -1, "filename": "pbs-0.82.tar.gz", "has_sig": false, "md5_digest": "14e7cebfb5b3c08b9dc9e16f80f9d187", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11453, "upload_time": "2012-02-04T00:53:34", "url": "https://files.pythonhosted.org/packages/26/75/d1d2abb8bef53b30b9901ce1be6e5854cba3eac7f55a3d418dcc0e2ac32a/pbs-0.82.tar.gz" } ], "0.90": [ { "comment_text": "", "digests": { "md5": "4eec44fcd63ffd9c7a08425ee142c302", "sha256": "c5d3a038f9aa12761980049844a66a596e68bb0cae18bc26fdb4cb86150dbbbe" }, "downloads": -1, "filename": "pbs-0.90.tar.gz", "has_sig": false, "md5_digest": "4eec44fcd63ffd9c7a08425ee142c302", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11214, "upload_time": "2012-02-04T03:42:36", "url": "https://files.pythonhosted.org/packages/54/63/6b4d55662c68aa1348a0529a24758cdf93c6dc6809007f04bb7a640df823/pbs-0.90.tar.gz" } ], "0.91": [ { "comment_text": "", "digests": { "md5": "866f0b00b5a173ac6e40ba9e162de17c", "sha256": "7376e61ded1b2dbae6a5f489b6b2c449a3c1d4bf1565de604e511be383a0d027" }, "downloads": -1, "filename": "pbs-0.91.tar.gz", "has_sig": false, "md5_digest": "866f0b00b5a173ac6e40ba9e162de17c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11368, "upload_time": "2012-02-07T02:26:58", "url": "https://files.pythonhosted.org/packages/a1/61/ee4ddcc3da8853d7fff23d2324ed42c87d75a2de48f81160620ae24fd927/pbs-0.91.tar.gz" } ], "0.92": [ { "comment_text": "", "digests": { "md5": "fb6da94257a02cc1da9e552aacc90bc5", "sha256": "0b99214f29fca0ce62af0559f473e31e68b0f44f8cd990f8ab3a4425f97d8649" }, "downloads": -1, "filename": "pbs-0.92.tar.gz", "has_sig": false, "md5_digest": "fb6da94257a02cc1da9e552aacc90bc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11361, "upload_time": "2012-02-07T03:00:13", "url": "https://files.pythonhosted.org/packages/87/ac/62920466eb69b67ce298ff0abf45d9ed484f35cbc8f142ed63150281d649/pbs-0.92.tar.gz" } ], "0.93": [ { "comment_text": "", "digests": { "md5": "c5af5ba445cbf752daf36d1904c4f644", "sha256": "d8646e3308cac9a33511537db6d5979257c7c8044b20d80982917ee687751b66" }, "downloads": -1, "filename": "pbs-0.93.tar.gz", "has_sig": false, "md5_digest": "c5af5ba445cbf752daf36d1904c4f644", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11913, "upload_time": "2012-02-08T20:18:28", "url": "https://files.pythonhosted.org/packages/63/72/f09bcbf667751b456116168e52ada47bab06919418fae813e2d891adec9c/pbs-0.93.tar.gz" } ], "0.94": [ { "comment_text": "", "digests": { "md5": "658824bff33e589f991c3a95be93ee05", "sha256": "0b101b709f8f868d0e9b3f03c1b373af0d6c8daeb0aa35bc177617c51f49db1b" }, "downloads": -1, "filename": "pbs-0.94.tar.gz", "has_sig": false, "md5_digest": "658824bff33e589f991c3a95be93ee05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11381, "upload_time": "2012-02-09T18:51:42", "url": "https://files.pythonhosted.org/packages/d4/42/3ff3d44d8dc8f8e10c4e7f378d3c8b6d607c68ca67e2da5c4e001eac6272/pbs-0.94.tar.gz" } ], "0.95": [ { "comment_text": "", "digests": { "md5": "37060adf6e875ddb9d9e51d0cbfeef7b", "sha256": "6f21883a92e2b8dc87a1f16cdfd7e392d079b1bc14e260c01b0a0e75f6269b65" }, "downloads": -1, "filename": "pbs-0.95.tar.gz", "has_sig": false, "md5_digest": "37060adf6e875ddb9d9e51d0cbfeef7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11375, "upload_time": "2012-02-17T04:49:50", "url": "https://files.pythonhosted.org/packages/6c/82/f146bf0db8f0b8efc2860ea50352a1cac7d49764de73f85adb23c26794c2/pbs-0.95.tar.gz" } ], "0.96": [ { "comment_text": "", "digests": { "md5": "8ad8d3fec07497dbf0add292f7f5f453", "sha256": "cbf56b1048c1f9ae87f5ead9722ddd5610afbc7a831887b027f4f7122934b495" }, "downloads": -1, "filename": "pbs-0.96.tar.gz", "has_sig": false, "md5_digest": "8ad8d3fec07497dbf0add292f7f5f453", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11905, "upload_time": "2012-02-22T21:49:28", "url": "https://files.pythonhosted.org/packages/ff/d3/87dd50993fb9437eb3db4107e59302b5aec4c36c4fce5433fcfaba8b58ef/pbs-0.96.tar.gz" } ], "0.97": [ { "comment_text": "", "digests": { "md5": "fcf565096c57226a1437ea242eddff0d", "sha256": "8dd31e7cc545056329040dfe8353e604d51b809e56097168d81d60f460baa00e" }, "downloads": -1, "filename": "pbs-0.97.tar.gz", "has_sig": false, "md5_digest": "fcf565096c57226a1437ea242eddff0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12122, "upload_time": "2012-02-24T03:12:20", "url": "https://files.pythonhosted.org/packages/46/27/cb510e168380490a3e2f65c7eaad0c5814457fa3c91ceb5036aa4b652bb4/pbs-0.97.tar.gz" } ], "0.98": [ { "comment_text": "", "digests": { "md5": "7d8c8413ff9908fc91ff3a04773f1d93", "sha256": "f5ff4d1a79dd734dda6eb85bea3c0b77f83ed64cae35fd052009825a4fa7d2a5" }, "downloads": -1, "filename": "pbs-0.98.tar.gz", "has_sig": false, "md5_digest": "7d8c8413ff9908fc91ff3a04773f1d93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11636, "upload_time": "2012-02-26T01:07:06", "url": "https://files.pythonhosted.org/packages/81/af/08858e4385598d817a32d76d78a17bf477e4c414a0c60bcf6d53a0505374/pbs-0.98.tar.gz" } ], "0.99": [ { "comment_text": "", "digests": { "md5": "19220ce0e335eee310e255e75c1cec29", "sha256": "1ef2ca86da2df18e8fe38492e045194c20da2a512edf9963d7c923c513eb15f9" }, "downloads": -1, "filename": "pbs-0.99.tar.gz", "has_sig": false, "md5_digest": "19220ce0e335eee310e255e75c1cec29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12607, "upload_time": "2012-03-10T22:38:24", "url": "https://files.pythonhosted.org/packages/e5/96/dc142fdc9d2dc2df036b0fdbc4103f3fca893c8894b45ef65311e580aade/pbs-0.99.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "89965e2207d76445810ceb0cf2f37039", "sha256": "05fafccbab7ce1cb2f25330267c8a622b569ad95b40c83220a36983f53757469" }, "downloads": -1, "filename": "pbs-0.110.tar.gz", "has_sig": false, "md5_digest": "89965e2207d76445810ceb0cf2f37039", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13427, "upload_time": "2012-10-20T18:47:28", "url": "https://files.pythonhosted.org/packages/fe/0f/7bae82505a8678de06aed0974dbe24c2f963de55e6d15390f36131fa7cd4/pbs-0.110.tar.gz" } ] }