{ "info": { "author": "Martin J. Levy", "author_email": "martin@cloudflare.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "cloudflare-python\n=================\n\nInstallation\n------------\n\nTwo methods are provided to install this software. Use PyPi (see\n`package `__ details) or GitHub\n(see `package `__\ndetails).\n\nVia PyPI\n~~~~~~~~\n\n.. code:: bash\n\n $ sudo pip install cloudflare\n $\n\nYes - that simple! (the sudo may not be needed in some cases).\n\nVia github\n~~~~~~~~~~\n\n.. code:: bash\n\n $ git clone https://github.com/cloudflare/python-cloudflare\n $ cd python-cloudflare\n $ ./setup.py build\n $ sudo ./setup.py install\n $\n\nOr whatever variance of that you want to use. There is a Makefile\nincluded.\n\nCloudflare name change - dropping the capital F\n-----------------------------------------------\n\nIn Sepember/October 2016 the company modified its company name and\ndropped the capital F. However, for now (and for backward compatibility\nreasons) the class name stays the same.\n\nCloudflare API version 4\n------------------------\n\nThe Cloudflare API can be found `here `__.\nEach API call is provided via a similarly named function within the\n**CloudFlare** class. A full list is provided below.\n\nExample code\n------------\n\nAll example code is available on GitHub (see\n`package `__ in the\n`examples `__\nfolder).\n\nBlog\n----\n\nThis package was initially introduced\n`here `__ via\nCloudflare's `blog `__.\n\nGetting Started\n---------------\n\nA very simple listing of zones within your account; including the IPv6\nstatus of the zone.\n\n.. code:: python\n\n import CloudFlare\n\n def main():\n cf = CloudFlare.CloudFlare()\n zones = cf.zones.get()\n for zone in zones:\n zone_id = zone['id']\n zone_name = zone['name']\n print zone_id, zone_name\n\n if __name__ == '__main__':\n main()\n\nThis example works when there are less than 50 zones (50 is the default\nnumber of values returned from a query like this).\n\nNow lets expand on that and add code to show the IPv6 and SSL status of\nthe zones. Lets also query 100 zones.\n\n.. code:: python\n\n import CloudFlare\n\n def main():\n cf = CloudFlare.CloudFlare()\n zones = cf.zones.get(params = {'per_page':100})\n for zone in zones:\n zone_id = zone['id']\n zone_name = zone['name']\n\n settings_ssl = cf.zones.settings.ssl.get(zone_id)\n ssl_status = settings_ssl['value']\n\n settings_ipv6 = cf.zones.settings.ipv6.get(zone_id)\n ipv6_status = settings_ipv6['value']\n\n print zone_id, zone_name, ssl_status, ipv6_status\n\n if __name__ == '__main__':\n main()\n\nIn order to query more than a single page of zones, we would have to use\nthe raw mode (decribed more below). We can loop over many get calls and\npass the page parameter to facilitate the paging.\n\nRaw mode is only needed when a get request has the possibility of\nreturning many items.\n\n.. code:: python\n\n import CloudFlare\n\n def main():\n cf = CloudFlare.CloudFlare(raw=True)\n page_number = 0\n while True:\n page_number += 1\n raw_results = cf.zones.get(params={'per_page':5,'page':page_number})\n zones = raw_results['result']\n\n for zone in zones:\n zone_id = zone['id']\n zone_name = zone['name']\n print zone_id, zone_name\n\n total_pages = raw_results['result_info']['total_pages']\n if page_number == total_pages:\n break\n\n if __name__ == '__main__':\n main()\n\nA more complex example follows.\n\n.. code:: python\n\n import CloudFlare\n\n def main():\n zone_name = 'example.com'\n\n cf = CloudFlare.CloudFlare()\n\n # query for the zone name and expect only one value back\n try:\n zones = cf.zones.get(params = {'name':zone_name,'per_page':1})\n except CloudFlare.exceptions.CloudFlareAPIError as e:\n exit('/zones.get %d %s - api call failed' % (e, e))\n except Exception as e:\n exit('/zones.get - %s - api call failed' % (e))\n\n if len(zones) == 0:\n exit('No zones found')\n\n # extract the zone_id which is needed to process that zone\n zone = zones[0]\n zone_id = zone['id']\n\n # request the DNS records from that zone\n try:\n dns_records = cf.zones.dns_records.get(zone_id)\n except CloudFlare.exceptions.CloudFlareAPIError as e:\n exit('/zones/dns_records.get %d %s - api call failed' % (e, e))\n\n # print the results - first the zone name\n print zone_id, zone_name\n\n # then all the DNS records for that zone\n for dns_record in dns_records:\n r_name = dns_record['name']\n r_type = dns_record['type']\n r_value = dns_record['content']\n r_id = dns_record['id']\n print '\\t', r_id, r_name, r_type, r_value\n\n exit(0)\n\n if __name__ == '__main__':\n main()\n\nProviding Cloudflare Username and API Key\n-----------------------------------------\n\nWhen you create a **CloudFlare** class you can pass up to four\nparameters.\n\n- Account email\n- Account API key\n- Optional Origin-CA Certificate Token\n- Optional Debug flag (True/False)\n\n.. code:: python\n\n import CloudFlare\n\n # A minimal call - reading values from environment variables or configuration file\n cf = CloudFlare.CloudFlare()\n\n # A minimal call with debug enabled\n cf = CloudFlare.CloudFlare(debug=True))\n\n # A full blown call with passed basic account information\n cf = CloudFlare.CloudFlare(email='user@example.com', token='00000000000000000000000000000000')\n\n # A full blown call with passed basic account information and CA-Origin info\n cf = CloudFlare.CloudFlare(email='user@example.com', token='00000000000000000000000000000000', certtoken='v1.0-...')\n\nIf the account email and API key are not passed when you create the\nclass, then they are retrieved from either the users exported shell\nenvironment variables or the .cloudflare.cfg or ~/.cloudflare.cfg or\n~/.cloudflare/cloudflare.cfg files, in that order.\n\nThere is one call that presently doesn't need any email or token\ncertification (the */ips* call); hence you can test without any values\nsaved away.\n\nUsing shell environment variables\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ export CF_API_EMAIL='user@example.com'\n $ export CF_API_KEY='00000000000000000000000000000000'\n $ export CF_API_CERTKEY='v1.0-...'\n $\n\nThese are optional environment variables; however, they do override the\nvalues set within a configuration file.\n\nUsing configuration file to store email and keys\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ cat ~/.cloudflare/cloudflare.cfg\n [CloudFlare]\n email = user@example.com\n token = 00000000000000000000000000000000\n certtoken = v1.0-...\n extras =\n $\n\nThe *CF\\_API\\_CERTKEY* or *certtoken* values are used for the Origin-CA\n*/certificates* API calls. You can leave *certtoken* in the\nconfiguration with a blank value (or omit the option variable fully).\n\nThe *extras* values are used when adding API calls outside of the core\ncodebase. Technically, this is only useful for internal testing within\nCloudflare. You can leave *extras* in the configuration with a blank\nvalue (or omit the option variable fully).\n\nExceptions and return values\n----------------------------\n\nResponse data\n~~~~~~~~~~~~~\n\nThe response is build from the JSON in the API call. It contains the\n**results** values; but does not contain the paging values.\n\nYou can return all the paging values by calling the class with raw=True.\nHere's an example without paging.\n\n.. code:: python\n\n #!/usr/bin/env python\n\n import json\n import CloudFlare\n\n def main():\n cf = CloudFlare.CloudFlare()\n zones = cf.zones.get(params={'per_page':5})\n print len(zones)\n\n if __name__ == '__main__':\n main()\n\nThe results are as follows.\n\n::\n\n 5\n\nWhen you add the raw option; the APIs full structure is returned. This\nmeans the paging values can be seen.\n\n.. code:: python\n\n #!/usr/bin/env python\n\n import json\n import CloudFlare\n\n def main():\n cf = CloudFlare.CloudFlare(raw=True)\n zones = cf.zones.get(params={'per_page':5})\n print zones.length()\n print json.dumps(zones, indent=4, sort_keys=True)\n\n if __name__ == '__main__':\n main()\n\nThis produces.\n\n::\n\n 5\n {\n \"result\": [\n ...\n ],\n \"result_info\": {\n \"count\": 5,\n \"page\": 1,\n \"per_page\": 5,\n \"total_count\": 31,\n \"total_pages\": 7\n }\n }\n\nA full example of paging is provided below.\n\nExceptions\n~~~~~~~~~~\n\nThe library will raise **CloudFlareAPIError** when the API call fails.\nThe exception returns both an integer and textual message in one value.\n\n.. code:: python\n\n import CloudFlare\n\n ...\n try\n r = ...\n except CloudFlare.exceptions.CloudFlareAPIError as e:\n exit('api error: %d %s' % (e, e))\n ...\n\nThe other raised response is **CloudFlareInternalError** which can\nhappen when calling an invalid method.\n\nIn some cases more than one error is returned. In this case the return\nvalue **e** is also an array. You can iterate over that array to see\nthe additional error.\n\n.. code:: python\n\n import sys\n import CloudFlare\n\n ...\n try\n r = ...\n except CloudFlare.exceptions.CloudFlareAPIError as e:\n if len(e) > 0:\n sys.stderr.write('api error - more than one error value returned!\\n')\n for x in e:\n sys.stderr.write('api error: %d %s\\n' % (x, x))\n exit('api error: %d %s' % (e, e))\n ...\n\nException examples\n~~~~~~~~~~~~~~~~~~\n\nHere's examples using the CLI command cli4 of the responses passed back\nin exceptions.\n\nFirst a simple get with a clean (non-error) response.\n\n::\n\n $ cli4 /zones/:example.com/dns_records | jq -c '.[]|{\"name\":.name,\"type\":.type,\"content\":.content}'\n {\"name\":\"example.com\",\"type\":\"MX\",\"content\":\"something.example.com\"}\n {\"name\":\"something.example.com\",\"type\":\"A\",\"content\":\"10.10.10.10\"}\n $\n\nNext a simple/single error response. This is simulated by providing\nincorrect authentication information.\n\n::\n\n $ CF_API_EMAIL='someone@example.com' cli4 /zones/\n cli4: /zones - 9103 Unknown X-Auth-Key or X-Auth-Email\n $\n\nFinally, a command that provides more than one error response. This is\nsimulated by passing an invalid IPv4 address to a DNS record creation.\n\n::\n\n $ cli4 --post name='foo' type=A content=\"1\" /zones/:example.com/dns_records\n cli4: /zones/:example.com/dns_records - 9005 Content for A record is invalid. Must be a valid IPv4 address\n cli4: /zones/:example.com/dns_records - 1004 DNS Validation Error\n $\n\nIncluded example code\n---------------------\n\nThe\n`examples `__\nfolder contains many examples in both simple and verbose formats.\n\nA DNS zone code example\n-----------------------\n\n.. code:: python\n\n #!/usr/bin/env python\n\n import sys\n import CloudFlare\n\n def main():\n zone_name = sys.argv[1]\n cf = CloudFlare.CloudFlare()\n zone_info = cf.zones.post(data={'jump_start':False, 'name': zone_name})\n zone_id = zone_info['id']\n\n dns_records = [\n {'name':'foo', 'type':'AAAA', 'content':'2001:d8b::1'},\n {'name':'foo', 'type':'A', 'content':'192.168.0.1'},\n {'name':'duh', 'type':'A', 'content':'10.0.0.1', 'ttl':120},\n {'name':'bar', 'type':'CNAME', 'content':'foo'},\n {'name':'shakespeare', 'type':'TXT', 'content':\"What's in a name? That which we call a rose by any other name ...\"}\n ]\n\n for dns_record in dns_records:\n r = cf.zones.dns_records.post(zone_id, data=dns_record)\n exit(0)\n\n if __name__ == '__main__':\n main()\n\nA DNS zone delete code example (be careful)\n-------------------------------------------\n\n.. code:: python\n\n #!/usr/bin/env python\n\n import sys\n import CloudFlare\n\n def main():\n zone_name = sys.argv[1]\n cf = CloudFlare.CloudFlare()\n zone_info = cf.zones.get(params={'name': zone_name})\n zone_id = zone_info['id']\n\n dns_name = sys.argv[2]\n dns_records = cf.zones.dns_records.get(zone_id, params={'name':dns_name + '.' + zone_name})\n for dns_record in dns_records:\n dns_record_id = dns_record['id']\n r = cf.zones.dns_records.delete(zone_id, dns_record_id)\n exit(0)\n\n if __name__ == '__main__':\n main()\n\nCLI\n---\n\nAll API calls can be called from the command line. The command will\nconvert domain names on-the-fly into zone\\_identifier's.\n\n.. code:: bash\n\n $ cli4 [-V|--version] [-h|--help] [-v|--verbose] [-q|--quiet] [-j|--json] [-y|--yaml] [-r|--raw] [-d|--dump] [--get|--patch|--post|--put|--delete] [item=value ...] /command...\n\nCLI parameters for POST/PUT/PATCH\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor API calls that need to pass data or parameters there is various\nformats to use.\n\nThe simplest form is ``item=value``. This passes the value as a string\nwithin the APIs JSON data.\n\nIf you need a numeric value passed then **==** can be used to force the\nvalue to be treated as a numeric value within the APIs JSON data. For\nexample: ``item==value``.\n\nif you need to pass a list of items; then **[]** can be used. For\nexample:\n\n::\n\n pool_id1=\"11111111111111111111111111111111\"\n pool_id2=\"22222222222222222222222222222222\"\n pool_id3=\"33333333333333333333333333333333\"\n cli4 --post global_pools=\"[ ${pool_id1}, ${pool_id2}, ${pool_id3} ]\" region_pools=\"[ ]\" /user/load_balancers/maps\n\nData or parameters can be either named or unnamed. It can not be both.\nNamed is the majority format; as described above. Unnamed parameters\nsimply don't have anything before the **=** sign, as in ``=value``. This\nformat is presently only used by the Cloudflare Load Balancer API calls.\nFor example:\n\n::\n\n cli4 --put =\"00000000000000000000000000000000\" /user/load_balancers/maps/:00000000000000000000000000000000/region/:WNAM\n\nData can also be uploaded from file contents. Using the\n``item=@filename`` format will open the file and the contents uploaded\nin the POST.\n\nCLI output\n~~~~~~~~~~\n\nThe output from the CLI command is in JSON or YAML format (and human\nreadable). This is controled by the **--yaml** or **--json** flags (JSON\nis the default).\n\nSimple CLI examples\n~~~~~~~~~~~~~~~~~~~\n\n- ``cli4 /user/billing/profile``\n- ``cli4 /user/invites``\n\n- ``cli4 /zones/:example.com``\n- ``cli4 /zones/:example.com/dnssec``\n- ``cli4 /zones/:example.com/settings/ipv6``\n- ``cli4 --put /zones/:example.com/activation_check``\n- ``cli4 /zones/:example.com/keyless_certificates``\n\n- ``cli4 /zones/:example.com/analytics/dashboard``\n\nMore complex CLI examples\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHere is the creation of a DNS entry, followed by a listing of that entry\nand then the deletion of that entry.\n\n.. code:: bash\n\n $ $ cli4 --post name=\"test\" type=\"A\" content=\"10.0.0.1\" /zones/:example.com/dns_records\n {\n \"id\": \"00000000000000000000000000000000\",\n \"name\": \"test.example.com\",\n \"type\": \"A\",\n \"content\": \"10.0.0.1\",\n ...\n }\n $\n\n $ cli4 /zones/:example.com/dns_records/:test.example.com | jq '{\"id\":.id,\"name\":.name,\"type\":.type,\"content\":.content}'\n {\n \"id\": \"00000000000000000000000000000000\",\n \"name\": \"test.example.com\",\n \"type\": \"A\",\n \"content\": \"10.0.0.1\"\n }\n\n $ cli4 --delete /zones/:example.com/dns_records/:test.example.com | jq -c .\n {\"id\":\"00000000000000000000000000000000\"}\n $\n\nThere's the ability to handle dns entries with multiple values. This\nproduces more than one API call within the command.\n\n::\n\n $ cli4 /zones/:example.com/dns_records/:test.example.com | jq -c '.[]|{\"id\":.id,\"name\":.name,\"type\":.type,\"content\":.content}'\n {\"id\":\"00000000000000000000000000000000\",\"name\":\"test.example.com\",\"type\":\"A\",\"content\":\"192.168.0.1\"}\n {\"id\":\"00000000000000000000000000000000\",\"name\":\"test.example.com\",\"type\":\"AAAA\",\"content\":\"2001:d8b::1\"}\n $\n\nHere are the cache purging commands.\n\n.. code:: bash\n\n $ cli4 --delete purge_everything=true /zones/:example.com/purge_cache | jq -c .\n {\"id\":\"00000000000000000000000000000000\"}\n $\n\n $ cli4 --delete files='[http://example.com/css/styles.css]' /zones/:example.com/purge_cache | jq -c .\n {\"id\":\"00000000000000000000000000000000\"}\n $\n\n $ cli4 --delete files='[http://example.com/css/styles.css,http://example.com/js/script.js]' /zones/:example.com/purge_cache | jq -c .\n {\"id\":\"00000000000000000000000000000000\"}\n $\n\n $ cli4 --delete tags='[tag1,tag2,tag3]' /zones/:example.com/purge_cache | jq -c .\n cli4: /zones/:example.com/purge_cache - 1107 Only enterprise zones can purge by tag.\n $\n\nA somewhat useful listing of available plans for a specific zone.\n\n.. code:: bash\n\n $ cli4 /zones/:example.com/available_plans | jq -c '.[]|{\"id\":.id,\"name\":.name}'\n {\"id\":\"00000000000000000000000000000000\",\"name\":\"Pro Website\"}\n {\"id\":\"00000000000000000000000000000000\",\"name\":\"Business Website\"}\n {\"id\":\"00000000000000000000000000000000\",\"name\":\"Enterprise Website\"}\n {\"id\":\"0feeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\"name\":\"Free Website\"}\n $\n\nCloudflare CA CLI examples\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nHere's some Cloudflare CA examples. Note the need of the zone\\_id=\nparameter with the basic **/certificates** call.\n\n.. code:: bash\n\n $ cli4 /zones/:example.com | jq -c '.|{\"id\":.id,\"name\":.name}'\n {\"id\":\"12345678901234567890123456789012\",\"name\":\"example.com\"}\n $\n\n $ cli4 zone_id=12345678901234567890123456789012 /certificates | jq -c '.[]|{\"id\":.id,\"expires_on\":.expires_on,\"hostnames\":.hostnames,\"certificate\":.certificate}'\n {\"id\":\"123456789012345678901234567890123456789012345678\",\"expires_on\":\"2032-01-29 22:36:00 +0000 UTC\",\"hostnames\":[\"*.example.com\",\"example.com\"],\"certificate\":\"-----BEGIN CERTIFICATE-----\\n ... \"}\n {\"id\":\"123456789012345678901234567890123456789012345678\",\"expires_on\":\"2032-01-28 23:23:00 +0000 UTC\",\"hostnames\":[\"*.example.com\",\"example.com\"],\"certificate\":\"-----BEGIN CERTIFICATE-----\\n ... \"}\n {\"id\":\"123456789012345678901234567890123456789012345678\",\"expires_on\":\"2032-01-28 23:20:00 +0000 UTC\",\"hostnames\":[\"*.example.com\",\"example.com\"],\"certificate\":\"-----BEGIN CERTIFICATE-----\\n ... \"}\n $\n\nA certificate can be viewed via a simple GET request.\n\n.. code:: bash\n\n $ cli4 /certificates/:123456789012345678901234567890123456789012345678\n {\n \"certificate\": \"-----BEGIN CERTIFICATE-----\\n ... \",\n \"expires_on\": \"2032-01-29 22:36:00 +0000 UTC\",\n \"hostnames\": [\n \"*.example.com\",\n \"example.com\"\n ],\n \"id\": \"123456789012345678901234567890123456789012345678\",\n \"request_type\": \"origin-rsa\"\n }\n $\n\nCreating a certificate. This is done with a **POST** request. Note the\nuse of **==** in order to pass a decimal number (vs. string) in JSON.\nThe CSR is not shown for simplicity sake.\n\n.. code:: bash\n\n $ CSR=`cat example.com.csr`\n $ cli4 --post hostnames='[\"example.com\",\"*.example.com\"]' requested_validity==365 request_type=\"origin-ecc\" csr=\"$CSR\" /certificates\n {\n \"certificate\": \"-----BEGIN CERTIFICATE-----\\n ... \",\n \"csr\": \"-----BEGIN CERTIFICATE REQUEST-----\\n ... \",\n \"expires_on\": \"2018-09-27 21:47:00 +0000 UTC\",\n \"hostnames\": [\n \"*.example.com\",\n \"example.com\"\n ],\n \"id\": \"123456789012345678901234567890123456789012345678\",\n \"request_type\": \"origin-ecc\",\n \"requested_validity\": 365\n }\n $\n\nDeleting a certificate can be done with a **DELETE** call.\n\n.. code:: bash\n\n $ cli4 --delete /certificates/:123456789012345678901234567890123456789012345678\n {\n \"id\": \"123456789012345678901234567890123456789012345678\",\n \"revoked_at\": \"0000-00-00T00:00:00Z\"\n }\n $\n\nPaging CLI examples\n~~~~~~~~~~~~~~~~~~~\n\nThe **--raw** command provides access to the paging returned values. See\nthe API documentation for all the info. Here's an example of how to page\nthru a list of zones (it's included in the examples folder as\n**example\\_paging\\_thru\\_zones.sh**).\n\n.. code:: bash\n\n :\n tmp=/tmp/$$_\n trap \"rm ${tmp}; exit 0\" 0 1 2 15\n PAGE=0\n while true\n do\n cli4 --raw per_page=5 page=${PAGE} /zones > ${tmp}\n domains=`jq -c '.|.result|.[]|.name' < ${tmp} | tr -d '\"'`\n result_info=`jq -c '.|.result_info' < ${tmp}`\n COUNT=` echo \"${result_info}\" | jq .count`\n PAGE=` echo \"${result_info}\" | jq .page`\n PER_PAGE=` echo \"${result_info}\" | jq .per_page`\n TOTAL_COUNT=`echo \"${result_info}\" | jq .total_count`\n TOTAL_PAGES=`echo \"${result_info}\" | jq .total_pages`\n echo COUNT=${COUNT} PAGE=${PAGE} PER_PAGE=${PER_PAGE} TOTAL_COUNT=${TOTAL_COUNT} TOTAL_PAGES=${TOTAL_PAGES} -- ${domains}\n if [ \"${PAGE}\" == \"${TOTAL_PAGES}\" ]\n then\n ## last section\n break\n fi\n # grab the next page\n PAGE=`expr ${PAGE} + 1`\n done\n\nIt produces the following results.\n\n::\n\n COUNT=5 PAGE=1 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- accumsan.example auctor.example consectetur.example dapibus.example elementum.example\n COUNT=5 PAGE=2 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- felis.example iaculis.example ipsum.example justo.example lacus.example\n COUNT=5 PAGE=3 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- lectus.example lobortis.example maximus.example morbi.example pharetra.example\n COUNT=5 PAGE=4 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- porttitor.example potenti.example pretium.example purus.example quisque.example\n COUNT=5 PAGE=5 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- sagittis.example semper.example sollicitudin.example suspendisse.example tortor.example\n COUNT=1 PAGE=7 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- varius.example vehicula.example velit.example velit.example vitae.example\n COUNT=5 PAGE=6 PER_PAGE=5 TOTAL_COUNT=31 TOTAL_PAGES=7 -- vivamus.example\n\nDNSSEC CLI examples\n~~~~~~~~~~~~~~~~~~~\n\n.. code:: bash\n\n $ cli4 /zones/:example.com/dnssec | jq -c '{\"status\":.status}'\n {\"status\":\"disabled\"}\n $\n\n $ cli4 --patch status=active /zones/:example.com/dnssec | jq -c '{\"status\":.status}'\n {\"status\":\"pending\"}\n $\n\n $ cli4 /zones/:example.com/dnssec\n {\n \"algorithm\": \"13\",\n \"digest\": \"41600621c65065b09230ebc9556ced937eb7fd86e31635d0025326ccf09a7194\",\n \"digest_algorithm\": \"SHA256\",\n \"digest_type\": \"2\",\n \"ds\": \"example.com. 3600 IN DS 2371 13 2 41600621c65065b09230ebc9556ced937eb7fd86e31635d0025326ccf09a7194\",\n \"flags\": 257,\n \"key_tag\": 2371,\n \"key_type\": \"ECDSAP256SHA256\",\n \"modified_on\": \"2016-05-01T22:42:15.591158Z\",\n \"public_key\": \"mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==\",\n \"status\": \"pending\"\n }\n $\n\nZone file upload and download CLI examples (uses BIND format files)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nRefer to `Import DNS\nrecords `__\non API documentation for this feature.\n\n.. code:: bash\n\n $ cat zone.txt\n example.com. IN SOA somewhere.example.com. someone.example.com. (\n 2017010101\n 3H\n 15\n 1w\n 3h\n )\n\n record1.example.com. IN A 10.0.0.1\n record2.example.com. IN AAAA 2001:d8b::2\n record3.example.com. IN CNAME record1.example.com.\n record4.example.com. IN TXT \"some text\"\n $\n\n $ cli4 --post file=@zone.txt /zones/:example.com/dns_records/import\n {\n \"recs_added\": 4,\n \"total_records_parsed\": 4\n }\n $\n\nThe following is documented within the **Advanced** option of the DNS\npage within the Cloudflare portal.\n\n::\n\n $ cli4 /zones/:example.com/dns_records/export | egrep -v '^;;|^$'\n $ORIGIN .\n @ 3600 IN SOA example.com. root.example.com. (\n 2025552311 ; serial\n 7200 ; refresh\n 3600 ; retry\n 86400 ; expire\n 3600) ; minimum\n example.com. 300 IN NS REPLACE&ME$WITH^YOUR@NAMESERVER.\n record4.example.com. 300 IN TXT \"some text\"\n record3.example.com. 300 IN CNAME record1.example.com.\n record1.example.com. 300 IN A 10.0.0.1\n record2.example.com. 300 IN AAAA 2001:d8b::2\n $\n\nThe egrep is used for documentation brevity.\n\nThis can also be done via Python code with the following example.\n\n::\n\n #!/usr/bin/env python\n import sys\n import CloudFlare\n\n def main():\n zone_name = sys.argv[1]\n cf = CloudFlare.CloudFlare()\n\n zones = cf.zones.get(params={'name': zone_name})\n zone_id = zones[0]['id']\n\n dns_records = cf.zones.dns_records.export.get(zone_id)\n for l in dns_records.splitlines():\n if len(l) == 0 or l[0] == ';':\n continue\n print l\n exit(0)\n\n if __name__ == '__main__':\n main()\n\nCloudflare Workers\n~~~~~~~~~~~~~~~~~~\n\nCloudflare Workers are described on the Cloudflare blog at\n`here `__\nand\n`here `__,\nwith the beta release announced\n`here `__.\n\nThe Python libraries now support the Cloudflare Workers API calls. The\nfollowing javascript is lifted from https://cloudflareworkers.com/ and\nslightly modified.\n\n::\n\n $ cat modify-body.js\n addEventListener(\"fetch\", event => {\n event.respondWith(fetchAndModify(event.request));\n });\n\n async function fetchAndModify(request) {\n console.log(\"got a request:\", request);\n\n // Send the request on to the origin server.\n const response = await fetch(request);\n\n // Read response body.\n const text = await response.text();\n\n // Modify it.\n const modified = text.replace(\n \"\",\n \"\");\n\n // Return modified response.\n return new Response(modified, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n }\n $\n\nHere's the website with it's simple ```` statement\n\n::\n\n $ curl -sS https://example.com/ | fgrep '\n $\n\nNow lets add the script. Looking above, you will see that it's simple\naction is to modify the ```` statement and make the background\nyellow.\n\n::\n\n $ cli4 --put @- /zones/:example.com/workers/script < modify-body.js\n {\n \"etag\": \"1234567890123456789012345678901234567890123456789012345678901234\",\n \"id\": \"example-com\",\n \"modified_on\": \"2018-02-15T00:00:00.000000Z\",\n \"script\": \"addEventListener(\\\"fetch\\\", event => {\\n event.respondWith(fetchAndModify(event.request));\\n});\\n\\nasync function fetchAndModify(request) {\\n console.log(\\\"got a request:\\\", request);\\n\\n // Send the request on to the origin server.\\n const response = await fetch(request);\\n\\n // Read response body.\\n const text = await response.text();\\n\\n // Modify it.\\n const modified = text.replace(\\n \\\"\\\",\\n \\\"\\\");\\n\\n // Return modified response.\\n return new Response(modified, {\\n status: response.status,\\n statusText: response.statusText,\\n headers: response.headers\\n });\\n}\\n\",\n \"size\": 603\n }\n $\n\nThe following call checks that the script is associated with the zone.\nIn this case, it's the only script added by this user.\n\n::\n\n $ python3 -m cli4 /user/workers/scripts\n [\n {\n \"created_on\": \"2018-02-15T00:00:00.000000Z\",\n \"etag\": \"1234567890123456789012345678901234567890123456789012345678901234\",\n \"id\": \"example-com\",\n \"modified_on\": \"2018-02-15T00:00:00.000000Z\"\n }\n ]\n $\n\nNext step is to make sure a route is added for that script on that zone.\n\n::\n\n $ cli4 --post pattern=\"example.com/*\" script=\"example-com\" /zones/:example.com/workers/routes\n {\n \"id\": \"12345678901234567890123456789012\"\n }\n $\n\n $ cli4 /zones/:example.com/workers/routes\n [\n {\n \"id\": \"12345678901234567890123456789012\",\n \"pattern\": \"example.com/*\",\n \"script\": \"example-com\"\n }\n ]\n $\n\nWith that script added to the zone and the route added, we can now see\nthe website has been modified because of the Cloudflare Worker.\n\n::\n\n $ curl -sS https://example.com/ | fgrep '\n $\n\nAll this can be removed; hence bringing the website back to its initial\nstate.\n\n::\n\n $ cli4 --delete /zones/:example.com/workers/script\n 12345678901234567890123456789012\n $ cli4 --delete /zones/:example.com/workers/routes/:12345678901234567890123456789012\n true\n $\n\n $ curl -sS https://example.com/ | fgrep '\n $\n\nRefer to the Cloudflare Workers API documentation for more information.\n\nImplemented API calls\n---------------------\n\nThe **--dump** argument to cli4 will produce a list of all the call\nimplemented within the library.\n\n.. code:: bash\n\n $ cli4 --dump\n /certificates\n /ips\n /organizations\n ...\n /zones/ssl/analyze\n /zones/ssl/certificate_packs\n /zones/ssl/verification\n $\n\nTable of commands\n~~~~~~~~~~~~~~~~~\n\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | ``PUT`` | ``POST`` | ``PATCH`` | ``DELETE`` | API call |\n+===========+===========+============+=============+==============+===============================================================+\n| ``GET`` | | ``POST`` | | ``DELETE`` | /certificates |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /ips |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /organizations |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /organizations/:identifier/firewall/access\\_rules/rules |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| | | | ``PATCH`` | | /organizations/:identifier/invite |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | | ``DELETE`` | /organizations/:identifier/invites |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | ``DELETE`` | /organizations/:identifier/members |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /organizations/:identifier/railguns |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /organizations/:identifier/railguns/:identifier/zones |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /organizations/:identifier/roles |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /organizations/:identifier/virtual\\_dns |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /railguns |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /railguns/:identifier/zones |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /user |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /user/billing/history |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /user/billing/profile |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /user/billing/subscriptions/apps |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /user/billing/subscriptions/zones |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /user/firewall/access\\_rules/rules |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /user/invites |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | ``DELETE`` | /user/organizations |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /user/virtual\\_dns |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /zones |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| | ``PUT`` | | | | /zones/:identifier/activation\\_check |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /zones/:identifier/analytics/colos |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /zones/:identifier/analytics/dashboard |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /zones/:identifier/available\\_plans |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| | ``PUT`` | | | | /zones/:identifier/custom\\_certificates/prioritize |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /zones/:identifier/custom\\_certificates |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | ``PUT`` | | | | /zones/:identifier/custom\\_pages |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | ``PUT`` | ``POST`` | | ``DELETE`` | /zones/:identifier/dns\\_records |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/firewall/waf/packages/:identifier/groups |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/firewall/waf/packages/:identifier/rules |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/firewall/waf/packages |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /zones/:identifier/firewall/access\\_rules/rules |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | ``POST`` | ``PATCH`` | ``DELETE`` | /zones/:identifier/keyless\\_certificates |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | ``PUT`` | ``POST`` | ``PATCH`` | ``DELETE`` | /zones/:identifier/pagerules |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| | | | | ``DELETE`` | /zones/:identifier/purge\\_cache |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /zones/:identifier/railguns/:identifier/diagnose |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/railguns |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | | | /zones/:identifier/settings/advanced\\_ddos |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/always\\_online |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/browser\\_cache\\_ttl |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/browser\\_check |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/cache\\_level |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/challenge\\_ttl |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/development\\_mode |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/email\\_obfuscation |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/hotlink\\_protection |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/ip\\_geolocation |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/ipv6 |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/minify |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/mirage |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/mobile\\_redirect |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/origin\\_error\\_page\\_pass\\_thru |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/polish |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/prefetch\\_preload |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/response\\_buffering |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/rocket\\_loader |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/security\\_header |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/security\\_level |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/server\\_side\\_exclude |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/sort\\_query\\_string\\_for\\_cache |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/ssl |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/tls\\_1\\_2\\_only |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/tls\\_client\\_auth |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/true\\_client\\_ip\\_header |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n| ``GET`` | | | ``PATCH`` | | /zones/:identifier/settings/waf |\n+-----------+-----------+------------+-------------+--------------+---------------------------------------------------------------+\n\nAdding extra API calls manually\n-------------------------------\n\nExtra API calls can be added via the configuration file\n\n.. code:: bash\n\n $ cat ~/.cloudflare/cloudflare.cfg\n [CloudFlare]\n extras =\n /client/v4/command\n /client/v4/command/:command_identifier\n /client/v4/command/:command_identifier/settings\n $\n\nWhile it's easy to call anything within Cloudflare's API, it's not very\nuseful to add items in here as they will simply return API URL errors.\nTechnically, this is only useful for internal testing within Cloudflare.\n\nIssues\n------\n\nThe following error can be caused by an out of date SSL/TLS library\nand/or out of date Python.\n\n::\n\n /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.\n SNIMissingWarning\n /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.\n InsecurePlatformWarning\n\nThe solution can be found\n`here `__\nand/or\n`here `__.\n\nPython 2.x vs 3.x support\n-------------------------\n\nAs of May/June 2016 the code is now tested against pylint. This was\nrequired in order to move the codebase into Python 3.x. The motivation\nfor this came from `Danielle Madeley\n(danni) `__.\n\nWhile the codebase has been edited to run on Python 3.x, there's not\nbeen enough Python 3.x testing performed. If you can help in this\nregard; please contact the maintainers.\n\nCredit\n------\n\nThis is based on work by `Felix Wong\n(gnowxilef) `__ found\n`here `__. It\nhas been seriously expanded upon.\n\nCopyright\n---------\n\nPortions copyright `Felix Wong\n(gnowxilef) `__ 2015 and Cloudflare 2016.\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cloudflare/python-cloudflare", "keywords": "cloudflare", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "cloudflare", "package_url": "https://pypi.org/project/cloudflare/", "platform": "", "project_url": "https://pypi.org/project/cloudflare/", "project_urls": { "Homepage": "https://github.com/cloudflare/python-cloudflare" }, "release_url": "https://pypi.org/project/cloudflare/2.3.0/", "requires_dist": null, "requires_python": "", "summary": "Python wrapper for the Cloudflare v4 API", "version": "2.3.0" }, "last_serial": 5292982, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "18cfbda8afe167ae42603e600d73242c", "sha256": "39e03236849c5a60e20cdcf8d5fbbba5717f04a3bb311f6c4745932d8efc9e47" }, "downloads": -1, "filename": "cloudflare-1.0.1.tar.gz", "has_sig": true, "md5_digest": "18cfbda8afe167ae42603e600d73242c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17848, "upload_time": "2016-05-13T01:18:43", "url": "https://files.pythonhosted.org/packages/f7/01/eb1adaf861355805c73c152fd73f01ebacaca98f9e4e2aab5bc768d150b2/cloudflare-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "b92aa5ada1c77da4b978c2c4149a23d4", "sha256": "e862c603ec3b735918e970f7a47373aae26352e1dc2357edd9e5fc10074de2de" }, "downloads": -1, "filename": "cloudflare-1.0.2.tar.gz", "has_sig": true, "md5_digest": "b92aa5ada1c77da4b978c2c4149a23d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18020, "upload_time": "2016-05-17T01:53:16", "url": "https://files.pythonhosted.org/packages/e5/67/b2dfa47b737f69a13a2e3ea1ce132011ed43a81a9ed1ac7b22ec63f9deef/cloudflare-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "2b023dd5e5d2809ae0b26968f5111676", "sha256": "5d05d23778d4e50f7d532cc22a832ddb17c7295f450474dbec25e2021b977cbf" }, "downloads": -1, "filename": "cloudflare-1.0.3.tar.gz", "has_sig": true, "md5_digest": "2b023dd5e5d2809ae0b26968f5111676", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18044, "upload_time": "2016-05-17T08:19:55", "url": "https://files.pythonhosted.org/packages/6c/16/18ae2d30716f246c978ed3c9809d76000a668680333308241f52bed621d8/cloudflare-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "1966b479d6ba7aee5066ce16cfa3a903", "sha256": "7f845aa17a672e7159f91df9166e8b036b9c5100b1b10c88ec71c1bf26c9fd90" }, "downloads": -1, "filename": "cloudflare-1.0.4.tar.gz", "has_sig": true, "md5_digest": "1966b479d6ba7aee5066ce16cfa3a903", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20166, "upload_time": "2016-05-17T15:27:34", "url": "https://files.pythonhosted.org/packages/4c/11/89a9cb46c53df82b14ebf78a41e33b0e4d03befc3b4dec61d2e9f1e34009/cloudflare-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "53728b008daf0d798e934e769e17b130", "sha256": "a87f35cf3f059a0b4662ff71ffadb18d067530da5d0ca425b303f9a649c25f5e" }, "downloads": -1, "filename": "cloudflare-1.0.5.tar.gz", "has_sig": true, "md5_digest": "53728b008daf0d798e934e769e17b130", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21662, "upload_time": "2016-05-17T21:30:16", "url": "https://files.pythonhosted.org/packages/3c/ad/8574acdf6b3119898c4263d6b8fd0744d21bb87fa682812e266c18c4cadc/cloudflare-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "523a827970737473615380e1397960cc", "sha256": "3b1a055e2532bdd143d95b9e0623751afa2c878805f42c180f95e9ff7c8aca37" }, "downloads": -1, "filename": "cloudflare-1.0.6.tar.gz", "has_sig": true, "md5_digest": "523a827970737473615380e1397960cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22619, "upload_time": "2016-05-18T10:28:58", "url": "https://files.pythonhosted.org/packages/c4/cb/2cda1ee60eb6df93504460e9aa2ba2bc763ae96c8d05dda639de6ab586bf/cloudflare-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "75208970b8f153805a8b508b92ca31e3", "sha256": "bba7ad6697f578de2dd28db24ac73b9402b2429eb790c2ca03a65a3ae2e867b2" }, "downloads": -1, "filename": "cloudflare-1.0.7.tar.gz", "has_sig": true, "md5_digest": "75208970b8f153805a8b508b92ca31e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22625, "upload_time": "2016-05-18T12:48:19", "url": "https://files.pythonhosted.org/packages/5f/48/b363d1c0e442860b13b89a890a3030e5fce9e1870d296bd87b0495dc2b6d/cloudflare-1.0.7.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "b719bbc2bf2c45be2596abd61a23981c", "sha256": "b0a6e626ca620223ec64eea1018f270d2bd9d080ff16704fc034a311266ffb6d" }, "downloads": -1, "filename": "cloudflare-1.1.0.tar.gz", "has_sig": true, "md5_digest": "b719bbc2bf2c45be2596abd61a23981c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24718, "upload_time": "2016-06-14T22:27:05", "url": "https://files.pythonhosted.org/packages/f7/79/01dc5859b44c6dc2d0142dc191e52b7e2587c3d38bc15791fb84ecc7975b/cloudflare-1.1.0.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "96e7ba390697cff3fac4996769bac8a5", "sha256": "29be6562b46939dca59e00139e8f3228d642bbf87cea9b4b84fbde8d8d55a9d7" }, "downloads": -1, "filename": "cloudflare-1.1.2.tar.gz", "has_sig": true, "md5_digest": "96e7ba390697cff3fac4996769bac8a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24681, "upload_time": "2016-06-18T21:04:17", "url": "https://files.pythonhosted.org/packages/5c/f6/d266b73be13add74d38f7d9a70490918010eaada3d55053abbd65ae39cfd/cloudflare-1.1.2.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "3a8ec3283c214bc3b51ae90e8617e2fd", "sha256": "ea36b2d73e0ffc4e9e8ede891def59c94e8717a2e06657aa604a19ce1b68b454" }, "downloads": -1, "filename": "cloudflare-1.1.4.tar.gz", "has_sig": true, "md5_digest": "3a8ec3283c214bc3b51ae90e8617e2fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25820, "upload_time": "2016-06-22T02:12:19", "url": "https://files.pythonhosted.org/packages/d6/8f/bdc56ceedb2730bf7e3d0db851aa3447b26b9180b5d1646f5ebfe4983c7b/cloudflare-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "899da9327403f0de5b9da0a0004e0de1", "sha256": "655c6767478cdc19cda373860457761336984f93ec9c4ac8fa9f530a2d491cd5" }, "downloads": -1, "filename": "cloudflare-1.1.5.tar.gz", "has_sig": true, "md5_digest": "899da9327403f0de5b9da0a0004e0de1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25839, "upload_time": "2016-07-05T00:19:33", "url": "https://files.pythonhosted.org/packages/82/1a/8209865df0b6266873f87125969e7aa1090a80216448f3ef760a5026c369/cloudflare-1.1.5.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "ab3416c9014ba3fe916810d502b1a2f5", "sha256": "65bc87e0d06542f8e050982d4cd171a95e711222f24b6caeb1815ceb6362ef62" }, "downloads": -1, "filename": "cloudflare-1.2.1.tar.gz", "has_sig": true, "md5_digest": "ab3416c9014ba3fe916810d502b1a2f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29750, "upload_time": "2016-10-17T18:22:15", "url": "https://files.pythonhosted.org/packages/6c/b8/43ea44a96c8f1026f9aa1c5f348c8eafadc179617025274eea6b6cfe2b2c/cloudflare-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "10ac209ea8ea8cc60b7560e0af720884", "sha256": "2cfd0ecfee1f7c6edb24db5cb50b9f79a31301c2674666803cb12da55b10bf3d" }, "downloads": -1, "filename": "cloudflare-1.2.2.tar.gz", "has_sig": true, "md5_digest": "10ac209ea8ea8cc60b7560e0af720884", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30044, "upload_time": "2016-10-18T00:20:00", "url": "https://files.pythonhosted.org/packages/3f/f4/c11fc1518c8626f8c873c76d7e96060b164a4ee95b9006ddc7ae81e86138/cloudflare-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "c3b30c7cb57722c3a3a5a801252e3ed9", "sha256": "2db4b58160a0bda1bd9208068096b78515a3ebe0f22ac830aa9a5368c464da2a" }, "downloads": -1, "filename": "cloudflare-1.2.3.tar.gz", "has_sig": true, "md5_digest": "c3b30c7cb57722c3a3a5a801252e3ed9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30534, "upload_time": "2016-10-19T01:19:35", "url": "https://files.pythonhosted.org/packages/dc/f9/969ffe0285a79094766dc5f5bbe69fee806bccbfcc95800fad425928673a/cloudflare-1.2.3.tar.gz" } ], "1.2.6": [ { "comment_text": "", "digests": { "md5": "cf51951165372abbdd4fc6f3f87a954c", "sha256": "83a62b0edf453ea0fce999272542939e3cd3f7ba8470a61cfdac39ec289cef83" }, "downloads": -1, "filename": "cloudflare-1.2.6.tar.gz", "has_sig": true, "md5_digest": "cf51951165372abbdd4fc6f3f87a954c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37606, "upload_time": "2016-10-21T19:56:38", "url": "https://files.pythonhosted.org/packages/bc/a2/aa4a9e927a87b33d607481c8979d99d90328e03a4cbef8860fee2d20d337/cloudflare-1.2.6.tar.gz" } ], "1.2.7": [ { "comment_text": "", "digests": { "md5": "d12268a32cf1f91054788934cf9dc784", "sha256": "c439261652c55f18434659537678aa152c7049298ff75e3f563704338ecf1c0c" }, "downloads": -1, "filename": "cloudflare-1.2.7.tar.gz", "has_sig": true, "md5_digest": "d12268a32cf1f91054788934cf9dc784", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38598, "upload_time": "2016-10-21T20:47:46", "url": "https://files.pythonhosted.org/packages/19/32/48d46ac03359988b0e31ebecf6b53fff96e2ac2ebb81653490818a6c34a3/cloudflare-1.2.7.tar.gz" } ], "1.2.8": [ { "comment_text": "", "digests": { "md5": "93b0c724c74c7932e5fa7a8fe5551b9b", "sha256": "5bebc89f10539fa33e732de8ca71fc1f8e4d8b7be57e5a23a4226434570ad2d4" }, "downloads": -1, "filename": "cloudflare-1.2.8.tar.gz", "has_sig": true, "md5_digest": "93b0c724c74c7932e5fa7a8fe5551b9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37642, "upload_time": "2016-10-21T20:54:07", "url": "https://files.pythonhosted.org/packages/4a/2c/c02d08bbcc72af6027eb128b40f2fcabfceab5cb16f7e105269f0c79dbde/cloudflare-1.2.8.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "dea5e27bbb6c1f5934c81193876e6a39", "sha256": "6b1dbb28772387f83b7d2d25874c6d7b135709dacb880f26b5c44de7452ec65f" }, "downloads": -1, "filename": "cloudflare-1.3.0.tar.gz", "has_sig": true, "md5_digest": "dea5e27bbb6c1f5934c81193876e6a39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37681, "upload_time": "2016-10-21T21:11:16", "url": "https://files.pythonhosted.org/packages/70/d8/072f1d0cb003ffcd0a9440bd7ab5ec4090a751138c045d9e1eba8ca87a96/cloudflare-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "046589dca631aa67ffe0b6eb0eb1ac2b", "sha256": "cf94a5d40d9121e5ca60ef9015d6650a05a06c097bb8350d171ddf130a83f933" }, "downloads": -1, "filename": "cloudflare-1.3.1.tar.gz", "has_sig": true, "md5_digest": "046589dca631aa67ffe0b6eb0eb1ac2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37966, "upload_time": "2016-10-25T12:33:42", "url": "https://files.pythonhosted.org/packages/ef/00/1e5f9faab343de34887a49d32a9e874716e21bd0bc2bb7d8d736452f4e8e/cloudflare-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "4ebf60744171acfafb80c20743b1e057", "sha256": "7b86daca7c018f0216841a7f9df09e199aa1b02599e7c2e18c30e330a786d924" }, "downloads": -1, "filename": "cloudflare-1.3.2.tar.gz", "has_sig": true, "md5_digest": "4ebf60744171acfafb80c20743b1e057", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40867, "upload_time": "2016-10-30T23:24:59", "url": "https://files.pythonhosted.org/packages/28/07/2e52dad1f172893c5c2cc98c0259f98dfe30137c9282d50efcd61d3d149e/cloudflare-1.3.2.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "3bc22074f9ce5e1104358b1624f0da85", "sha256": "4047c7f763d55721d7c02ead71a293dbd0f44c2cc2a9f9462b104fd98fbe6b9b" }, "downloads": -1, "filename": "cloudflare-1.4.0.tar.gz", "has_sig": true, "md5_digest": "3bc22074f9ce5e1104358b1624f0da85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42984, "upload_time": "2016-12-05T19:05:17", "url": "https://files.pythonhosted.org/packages/0b/f9/21fe368771b05ae15f3c7e90b011405dd3ce9de81b5bf23021f7f1203da7/cloudflare-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "10043ee6bebe76e2347db97bb78ec7c6", "sha256": "daf242d64e20c9cc02cd85e3495ffc6076c1a9204f87e93f4f58cef466066651" }, "downloads": -1, "filename": "cloudflare-1.4.1.tar.gz", "has_sig": true, "md5_digest": "10043ee6bebe76e2347db97bb78ec7c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43038, "upload_time": "2016-12-10T23:43:22", "url": "https://files.pythonhosted.org/packages/1d/ff/d3e28fff13f193bf37264c607babae6febea240ea07ec4b0fb7b0734c75f/cloudflare-1.4.1.tar.gz" } ], "1.4.10": [ { "comment_text": "", "digests": { "md5": "3e0e7ab91da51c29e2ccd0d812c9e97e", "sha256": "d9ada592d08d233f2c04fdf59e8ec09326c264d987095f96a4e7fa97a90568f1" }, "downloads": -1, "filename": "cloudflare-1.4.10.tar.gz", "has_sig": true, "md5_digest": "3e0e7ab91da51c29e2ccd0d812c9e97e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43332, "upload_time": "2016-12-29T20:31:22", "url": "https://files.pythonhosted.org/packages/1b/91/9abfd897aef5cb91daa99a6fdb25f3fb467149ffbb93cc3548b2b417b4f2/cloudflare-1.4.10.tar.gz" } ], "1.4.11": [ { "comment_text": "", "digests": { "md5": "59c3af7fc42957c48a4a7f97f7903574", "sha256": "eb15e7052d5c9fc7ea93155569756d2014ab6bb16e6d4efd1dd4f45fcc555ef7" }, "downloads": -1, "filename": "cloudflare-1.4.11.tar.gz", "has_sig": true, "md5_digest": "59c3af7fc42957c48a4a7f97f7903574", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43424, "upload_time": "2016-12-30T04:25:37", "url": "https://files.pythonhosted.org/packages/19/4f/7ef643bcc14c9fef825f314676809f816ed4d7394aa381e446860264f118/cloudflare-1.4.11.tar.gz" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "dc4118cfa12760b60e94a336f1977049", "sha256": "270d204b0cfffaf0b1c7e2fbe229f76292f8b0ce755ce9b0b969c5d736d0dce9" }, "downloads": -1, "filename": "cloudflare-1.4.2.tar.gz", "has_sig": true, "md5_digest": "dc4118cfa12760b60e94a336f1977049", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43214, "upload_time": "2016-12-11T20:24:52", "url": "https://files.pythonhosted.org/packages/88/34/b405b9593eb8917508604881608c685a0114066cf6c020e8aa8039a88487/cloudflare-1.4.2.tar.gz" } ], "1.4.4": [ { "comment_text": "", "digests": { "md5": "25d98aa50b23ca40cb2b0a4839fd2234", "sha256": "b6960b93a83b71cc13c8fa1369a771ac387353f7fd5aa88022499b988e0d1dd1" }, "downloads": -1, "filename": "cloudflare-1.4.4.tar.gz", "has_sig": true, "md5_digest": "25d98aa50b23ca40cb2b0a4839fd2234", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43287, "upload_time": "2016-12-22T22:31:42", "url": "https://files.pythonhosted.org/packages/ae/fb/1825b26f6b5a2eb1939ee34e24748490058cb20e16ebf7486849fef2d0e3/cloudflare-1.4.4.tar.gz" } ], "1.4.5": [ { "comment_text": "", "digests": { "md5": "5a18e4a44e9be6d2b4ff9c144ca45d65", "sha256": "622d0d7be3f9873053c4debd3a842ee84d20e4d951a2c8f08e4f9e1819b77fca" }, "downloads": -1, "filename": "cloudflare-1.4.5.tar.gz", "has_sig": true, "md5_digest": "5a18e4a44e9be6d2b4ff9c144ca45d65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43531, "upload_time": "2016-12-27T18:28:40", "url": "https://files.pythonhosted.org/packages/10/f4/469f4f7f868adef55c103e62a1e39d2600dc30dca9c96832f32a550dbd53/cloudflare-1.4.5.tar.gz" } ], "1.4.7": [ { "comment_text": "", "digests": { "md5": "c315d0fd2e4092f22af762606a78f5af", "sha256": "53655f384ecba9dc1ad63472ba121fae7fc8934911cba45218e6638deaf4a12a" }, "downloads": -1, "filename": "cloudflare-1.4.7.tar.gz", "has_sig": true, "md5_digest": "c315d0fd2e4092f22af762606a78f5af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43283, "upload_time": "2016-12-29T04:42:54", "url": "https://files.pythonhosted.org/packages/4f/15/e124801e133e421b101c357cb73d95a26bb1cb9bbaa75dcc5af156474f97/cloudflare-1.4.7.tar.gz" } ], "1.4.8": [ { "comment_text": "", "digests": { "md5": "38af6d8787c9a1cc4f8986e301debcfe", "sha256": "a368b65cc3a038b93af4728bdef96046616dafd2f0d66b879749353c2bc167e1" }, "downloads": -1, "filename": "cloudflare-1.4.8.tar.gz", "has_sig": true, "md5_digest": "38af6d8787c9a1cc4f8986e301debcfe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43315, "upload_time": "2016-12-29T04:56:47", "url": "https://files.pythonhosted.org/packages/3c/ec/05717e504309ba48d736bef4975a46be1ff6b360dd88c667a8333f89ff66/cloudflare-1.4.8.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "c5c3239ae2e500758579533678572fc7", "sha256": "e9600495d373b306d56f28b2f55fafa33000d060a8e6e3a3a6e15497c7d53f65" }, "downloads": -1, "filename": "cloudflare-1.5.1.tar.gz", "has_sig": true, "md5_digest": "c5c3239ae2e500758579533678572fc7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42194, "upload_time": "2016-12-30T18:34:56", "url": "https://files.pythonhosted.org/packages/40/c4/af743b84254e08f934165e77dcc1560b3b482e53e151b8059a4fe2e711dd/cloudflare-1.5.1.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "f34fd4efa8d048785abb18f822f59154", "sha256": "e404d66711d5de32d193797199d3b55676b6db43d199f73aa6476bea2aeeab64" }, "downloads": -1, "filename": "cloudflare-1.6.0.tar.gz", "has_sig": true, "md5_digest": "f34fd4efa8d048785abb18f822f59154", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42136, "upload_time": "2017-08-22T11:57:34", "url": "https://files.pythonhosted.org/packages/c5/b1/d04630976c2a321992a4675083b2f7b82b9846697ba73992b269621b17ac/cloudflare-1.6.0.tar.gz" } ], "1.6.2": [ { "comment_text": "", "digests": { "md5": "ed7c28026a5b50c9041864a41228615a", "sha256": "d86112eeedb535d1370b05a26f30ce85565650dfaa3e31909905211ebe909ca2" }, "downloads": -1, "filename": "cloudflare-1.6.2.tar.gz", "has_sig": true, "md5_digest": "ed7c28026a5b50c9041864a41228615a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42734, "upload_time": "2017-08-23T10:00:25", "url": "https://files.pythonhosted.org/packages/9c/91/a1629ecaff20e0ea29a840183381ef314b1ee93b3ca6edcd56f8ee8b28e1/cloudflare-1.6.2.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "c4a219ce7877921ab415464c73e1d6fe", "sha256": "5cc1ded001b00bc29b7d0fbdaf9fbd150b19772a560918cc39ec524a83e6122d" }, "downloads": -1, "filename": "cloudflare-1.7.0.tar.gz", "has_sig": true, "md5_digest": "c4a219ce7877921ab415464c73e1d6fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43993, "upload_time": "2017-08-27T06:51:41", "url": "https://files.pythonhosted.org/packages/98/aa/fa841cfe4de5d6432d07949e3e6973b98b8b8232cd13af2e52193b948c68/cloudflare-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "ba37a72bbd351d3a304c1108f72bf591", "sha256": "3c1ba5750be56cadf7709656e9369c23407337505662cecb30007194004104ae" }, "downloads": -1, "filename": "cloudflare-1.7.1.tar.gz", "has_sig": true, "md5_digest": "ba37a72bbd351d3a304c1108f72bf591", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43976, "upload_time": "2017-08-27T16:29:58", "url": "https://files.pythonhosted.org/packages/d9/6a/a7c4c141c461cc18cb25cdefb3c9c1ddbe5c0699e902c09a28d4070cee47/cloudflare-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "6523c9659b7126774de0356ec6935618", "sha256": "eba8174ad50016a5c8dc2a81fd14dcda44851be33aef3271a64554899a9d7087" }, "downloads": -1, "filename": "cloudflare-1.7.2.tar.gz", "has_sig": true, "md5_digest": "6523c9659b7126774de0356ec6935618", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45016, "upload_time": "2017-08-27T17:49:29", "url": "https://files.pythonhosted.org/packages/b3/73/595cecef248a85180af49af40cea3d65da71ce9368e48bbad4bdacf42928/cloudflare-1.7.2.tar.gz" } ], "1.7.3": [ { "comment_text": "", "digests": { "md5": "36ea6dc164e1c6d2aac45c02412bf963", "sha256": "dded1f5e2d1b97b75b2518cd7b5bb491a527fdbaef001f31b118b9c27d0af845" }, "downloads": -1, "filename": "cloudflare-1.7.3.tar.gz", "has_sig": true, "md5_digest": "36ea6dc164e1c6d2aac45c02412bf963", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46025, "upload_time": "2017-08-27T18:04:27", "url": "https://files.pythonhosted.org/packages/e7/3d/84f919530c97d8678904fcc642d8e3e274a8e7edad19726733d23c216452/cloudflare-1.7.3.tar.gz" } ], "1.7.4": [ { "comment_text": "", "digests": { "md5": "11e72875f37fdb23ddf271ce7f6ed4d2", "sha256": "0f8777b32df17428f187639fca13cab379ef84c237fdf329adb5b49fc78c0caa" }, "downloads": -1, "filename": "cloudflare-1.7.4.tar.gz", "has_sig": true, "md5_digest": "11e72875f37fdb23ddf271ce7f6ed4d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46101, "upload_time": "2017-08-27T18:54:39", "url": "https://files.pythonhosted.org/packages/40/f0/042a7475bc66aaca15a35f24de79e69f6d84fae4626ae6cc0557b1d071dd/cloudflare-1.7.4.tar.gz" } ], "1.7.5": [ { "comment_text": "", "digests": { "md5": "6bed47a5edd747bf81186ee3bf733af6", "sha256": "0342e6f1a090fca504be510ae0d722afd7e43afe3ebb50eaf32339b3bace82c5" }, "downloads": -1, "filename": "cloudflare-1.7.5.tar.gz", "has_sig": true, "md5_digest": "6bed47a5edd747bf81186ee3bf733af6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46505, "upload_time": "2017-09-12T07:18:40", "url": "https://files.pythonhosted.org/packages/5d/02/7f318a2bb111a7f7c592982f19792109a9e72be8cd6ef2622cfee7e342bc/cloudflare-1.7.5.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "97d88b54c6791a3251dd1af1f1a791b7", "sha256": "cc7a932c9beb0913d21f75284ad04e0c8c0a0a468ceb9b1dcd7353456d243d8c" }, "downloads": -1, "filename": "cloudflare-1.8.0.tar.gz", "has_sig": true, "md5_digest": "97d88b54c6791a3251dd1af1f1a791b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48154, "upload_time": "2017-09-27T22:14:38", "url": "https://files.pythonhosted.org/packages/cc/77/a504c4c0cf7920d1648aa06937ecec2afb40ba6d9037034e0659a737132d/cloudflare-1.8.0.tar.gz" } ], "1.8.1": [ { "comment_text": "", "digests": { "md5": "5150b766b046fb6bb1f2fa2623786b8f", "sha256": "3d73cb071a14d443a8d3ef19a0c6a4cbbfea784de3144666ecbcd35ddfc9b5c2" }, "downloads": -1, "filename": "cloudflare-1.8.1.tar.gz", "has_sig": true, "md5_digest": "5150b766b046fb6bb1f2fa2623786b8f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48493, "upload_time": "2017-10-31T11:49:27", "url": "https://files.pythonhosted.org/packages/35/fd/6e11929d3a767e530ac05f6d9391c884ec7f264fa489b7c2b68b60be11cb/cloudflare-1.8.1.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "0fc8ae0637baaae22f7ca30b5bcc3a5a", "sha256": "60e261a62b0390bd29b0c1e91f1382e8778ed09b92de3eac270c1435819d8b45" }, "downloads": -1, "filename": "cloudflare-2.0.2.tar.gz", "has_sig": true, "md5_digest": "0fc8ae0637baaae22f7ca30b5bcc3a5a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50148, "upload_time": "2018-02-15T03:45:24", "url": "https://files.pythonhosted.org/packages/c6/b0/9bdab3ea3e9e96be78ccbcf29174c542acc30c9eb728822d5a2372769b9c/cloudflare-2.0.2.tar.gz" } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "ae7f0118dd0793ec48911a542e8a4ae3", "sha256": "ff408b44785df84fc67cf9de1f3815c296ee8a10df5ae6780742cccb139f0fda" }, "downloads": -1, "filename": "cloudflare-2.0.4.tar.gz", "has_sig": true, "md5_digest": "ae7f0118dd0793ec48911a542e8a4ae3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53411, "upload_time": "2018-02-15T06:23:28", "url": "https://files.pythonhosted.org/packages/48/a6/1cfaaec1f1d228bbbeba6c1603da1f2cfc62816f9d370906c4c8003f1b6d/cloudflare-2.0.4.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "4a05aaed22611225f300602c95776eeb", "sha256": "29ac4abe4451557053d4591f2604426a16f59bacd1740ea85c67d6808150eb1e" }, "downloads": -1, "filename": "cloudflare-2.1.0.tar.gz", "has_sig": true, "md5_digest": "4a05aaed22611225f300602c95776eeb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53351, "upload_time": "2018-02-25T11:44:52", "url": "https://files.pythonhosted.org/packages/ea/44/910d1f5f1dde2f961c6ed667c2861cec20c1f5cb19a160ce1e6f558454a0/cloudflare-2.1.0.tar.gz" } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "356d82cca1e0558e2cb2c5c1ee03f65e", "sha256": "5978a6aa29bc31e077a6ccf7e39c1a96cad925b76bccea85f076d7708a40a898" }, "downloads": -1, "filename": "cloudflare-2.3.0.tar.gz", "has_sig": true, "md5_digest": "356d82cca1e0558e2cb2c5c1ee03f65e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52746, "upload_time": "2019-05-20T15:35:03", "url": "https://files.pythonhosted.org/packages/57/a8/10eea5162fe2d3e60e439c73da33b18d054a0b2682bfce4d9df6684e8fcc/cloudflare-2.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "356d82cca1e0558e2cb2c5c1ee03f65e", "sha256": "5978a6aa29bc31e077a6ccf7e39c1a96cad925b76bccea85f076d7708a40a898" }, "downloads": -1, "filename": "cloudflare-2.3.0.tar.gz", "has_sig": true, "md5_digest": "356d82cca1e0558e2cb2c5c1ee03f65e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52746, "upload_time": "2019-05-20T15:35:03", "url": "https://files.pythonhosted.org/packages/57/a8/10eea5162fe2d3e60e439c73da33b18d054a0b2682bfce4d9df6684e8fcc/cloudflare-2.3.0.tar.gz" } ] }