Skip to main content

Simple JavaScript interpreter for Python

Project description

https://travis-ci.org/amol-/dukpy.png?branch=master https://coveralls.io/repos/amol-/dukpy/badge.png?branch=master https://img.shields.io/pypi/v/dukpy.svg

DukPy is a simple javascript interpreter for Python built on top of duktape engine without any external dependency. It comes with a bunch of common transpilers built-in for convenience:

  • CoffeeScript

  • BabelJS

  • TypeScript

  • JSX

  • LESS

Dukpy has been tested on Python 2.7 and Python 3.4, dukpy is currently not production ready and might actually crash your program as it is mostly implemented in C.

CoffeeScript Compiler

Using the coffeescript compiler is as easy as running:

>>> import dukpy
>>> dukpy.coffee_compile('''
...     fill = (container, liquid = "coffee") ->
...         "Filling the #{container} with #{liquid}..."
... ''')
'(function() {\n  var fill;\n\n  fill = function*(container, liquid) {\n    if (liquid == null) {\n      liquid = "coffee";\n    }\n    return "Filling the " + container + " with " + liquid + "...";\n  };\n\n}).call(this);\n'

TypeScript Transpiler

The TypeScript compiler can be used through the dukpy.typescript_compile function:

>>> import dukpy
>>> dukpy.typescript_compile('''
... class Greeter {
...     constructor(public greeting: string) { }
...     greet() {
...         return "<h1>" + this.greeting + "</h1>";
...     }
... };
...
... var greeter = new Greeter("Hello, world!");
... ''')
'var Greeter = (function () {\n    function Greeter(greeting) {\n        this.greeting = greeting;\n    }\n    Greeter.prototype.greet = function () {\n        return "<h1>" + this.greeting + "</h1>";\n    };\n    return Greeter;\n})();\n;\nvar greeter = new Greeter("Hello, world!");\n'

Currently the compiler has built-in options and doesn’t accept additional ones,

The DukPY based TypeScript compiler also provides a WebAssets ( http://webassets.readthedocs.org/en/latest/ ) filter to automatically compile TypeScript code in your assets pipeline. You register this filter as typescript within WebAssets using:

from webassets.filter import register_filter
from dukpy.webassets import TypeScript

register_filter(TypeScript)

Which makes the filter available with the typescript name.

NOTE: When using the TypeScript compiler for code that needs to run in the browser, make sure to add https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.24/system.js dependency. As import statements are resolved using SystemJS.

EcmaScript6 BabelJS Transpiler

To compile ES6 code to ES5 for everyday usage you can use dukpy.babel_compile:

>>> import dukpy
>>> dukpy.babel_compile('''
... class Point {
...     constructor(x, y) {
...             this.x = x;
...         this.y = y;
...         }
...         toString() {
...             return '(' + this.x + ', ' + this.y + ')';
...         }
... }
... ''')
'"use strict";\n\nvar _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); };\n\nvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };\n\nvar Point = (function () {\n    function Point(x, y) {\n        _classCallCheck(this, Point);\n\n        this.x = x;\n        this.y = y;\n    }\n\n    _prototypeProperties(Point, null, {\n        toString: {\n            value: function toString() {\n                return "(" + this.x + ", " + this.y + ")";\n            },\n            writable: true,\n            configurable: true\n        }\n    });\n\n    return Point;\n})();\n'

You can pass options to the BabelJS compiler just as keywords on the call to babel_compile().

The DukPY based BabelJS compiler also provides a WebAssets ( http://webassets.readthedocs.org/en/latest/ ) filter to automatically compile ES6 code in your assets pipeline. You register this filter as babeljs within WebAssets using:

from webassets.filter import register_filter
from dukpy.webassets import BabelJS

register_filter(BabelJS)

Which makes the filter available with the babeljs name. Only supported filter option is currently BABEL_MODULES_LOADER with value systemjs or umd to specify that compiled code should use SystemJS or UMD instead of CommonJS for modules.

NOTE: When using the BabelJS compiler for code that needs to run in the browser, make sure to add https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.13.0/polyfill.min.js dependency.

JSX to React Transpiling

DukPy provides a built-in compiler from JSX to React, this is available as dukpy.jsx_compile:

>>> import dukpy
>>> dukpy.jsx_compile('var react_hello = <h1>Hello, world!</h1>;')
u'"use strict";\n\nvar react_hello = React.createElement(\n  "h1",\n  null,\n  "Hello, world!"\n);'

The DukPY based JSX compiler also provides a WebAssets ( http://webassets.readthedocs.org/en/latest/ ) filter to automatically compile JSX+ES6 code in your assets pipeline. You register this filter as babeljsx within WebAssets using:

from webassets.filter import register_filter
from dukpy.webassets import BabelJSX

register_filter(BabelJSX)

Which makes the filter available with the babeljsx name. This filter supports the same options as the babel one.

Less Transpiling

DukPy provides a built-in distribution of the less compiler available through dukpy.less_compile:

>>> import dukpy
>>> dukpy.less_compile('.class { width: (1 + 1) }')
'.class {\n  width: 2;\n}\n'

The DukPY based LESS compiler also provides a WebAssets ( http://webassets.readthedocs.org/en/latest/ ) filter to automatically compile LESS code in your assets pipeline. You register this filter as lessc within WebAssets using:

from webassets.filter import register_filter
from dukpy.webassets import CompileLess

register_filter(CompileLess)

Which makes the filter available with the lessc name.

Using the JavaScript Interpreter

Using dukpy is as simple as calling the dukpy.evaljs function with the javascript code:

>>> import dukpy
>>> dukpy.evaljs("var o = {'value': 5}; o['value'] += 3; o")
{'value': 8}

The evaljs function executes the javascript and returns the resulting value as far as it is possible to encode it in JSON.

If execution fails a dukpy.JSRuntimeError exception is raised with the failure reason.

Passing Arguments

Any argument passed to evaljs is available in JavaScript inside the dukpy object in javascript. It must be possible to encode the arguments using JSON for them to be available in Javascript:

>>> import dukpy
>>>
>>> def sum3(value):
...     return dukpy.evaljs("dukpy['value'] + 3", value=value)
...
>>> sum3(7)
10

Running Multiple Scripts

The evaljs function supports providing multiple source codes to be executed in the same context.

Multiple script can be passed in a list or tuple:

>>> import dukpy
>>> dukpy.evaljs(["var o = {'value': 5}",
...               "o['value'] += 3",
...               "o"])
{'value': 8}

This is useful when your code requires dependencies to work, as you can load the dependency and then your code.

This is actually how the coffeescript compiler is implemented by DukPy itself:

def coffee_compile(source):
    with open(COFFEE_COMPILER, 'r') as coffeescript_js:
        return evaljs((coffeescript_js.read(), 'CoffeeScript.compile(dukpy.coffeecode)'),
                      coffeecode=source)

Using a persistent JavaScript Interpreter

The evaljs function creates a new interpreter on each call, this is usually convenient and avoid errors due to dirt global variables or unexpected execution status.

In some cases you might want to run code that has a slow bootstrap, so it’s convenient to reuse the same interpreter between two different calls so that the bootstrap cost has already been paid during the first execution.

This can be achieved by using the dukpy.JSInterpreter object.

Creating a dukpy.JSInterpreter permits to evaluate code inside that interpreter and multiple eval calls will share the same interpreter and global status:

>>> import dukpy
>>> interpreter = dukpy.JSInterpreter()
>>> interpreter.evaljs("var o = {'value': 5}; o")
{u'value': 5}
>>> interpreter.evaljs("o.value += 1; o")
{u'value': 6}

Loading modules with require

When using the dukpy.JSInterpreter object it is possible to use the require('modulename') instruction to load a module inside javascript.

Modules are looked up in all directories registered with dukpy.JSInterpreter.loader.register_path:

>>> import dukpy
>>> jsi = dukpy.JSInterpreter()
>>> jsi.loader.register_path('./js_modules')
>>> jsi.evaljs("isEmpty = require('fbjs/lib/isEmpty'); isEmpty([1])")
False

Installing packages from npmjs.org

When using the persistent javascript interpreter it is also possible to install packages from npmjs.org through the dukpy.install_jspackage function:

>>> import dukpy
>>> jsi = dukpy.JSInterpreter()
>>> dukpy.install_jspackage('promise', None, './js_modules')
Packages going to be installed: promise->7.1.1, asap->2.0.3
Fetching https://registry.npmjs.org/promise/-/promise-7.1.1.tgz..........................
Fetching https://registry.npmjs.org/asap/-/asap-2.0.3.tgz............
Installing promise in ./js_modules Done!

The same functionality is also provided by the dukpy-install shell command:

$ dukpy-install -d ./js_modules promise
Packages going to be installed: promise->7.1.1, asap->2.0.3
Fetching https://registry.npmjs.org/promise/-/promise-7.1.1.tgz..........................
Fetching https://registry.npmjs.org/asap/-/asap-2.0.3.tgz............
Installing promise in ./js_modules Done!

Please note that currently install_jspackage is not able to resolve conflicting dependencies.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dukpy-0.2.0.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

dukpy-0.2.0-cp36-cp36m-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.6m Windows x86-64

dukpy-0.2.0-cp36-cp36m-win32.whl (1.4 MB view details)

Uploaded CPython 3.6m Windows x86

dukpy-0.2.0-cp36-cp36m-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.6m

dukpy-0.2.0-cp36-cp36m-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 3.6m

dukpy-0.2.0-cp35-cp35m-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.5m Windows x86-64

dukpy-0.2.0-cp35-cp35m-win32.whl (1.4 MB view details)

Uploaded CPython 3.5m Windows x86

dukpy-0.2.0-cp35-cp35m-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.5m

dukpy-0.2.0-cp35-cp35m-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 3.5m

dukpy-0.2.0-cp34-cp34m-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.4m Windows x86-64

dukpy-0.2.0-cp34-cp34m-win32.whl (1.4 MB view details)

Uploaded CPython 3.4m Windows x86

dukpy-0.2.0-cp34-cp34m-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.4m

dukpy-0.2.0-cp34-cp34m-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 3.4m

dukpy-0.2.0-cp33-cp33m-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.3m Windows x86-64

dukpy-0.2.0-cp33-cp33m-win32.whl (1.4 MB view details)

Uploaded CPython 3.3m Windows x86

dukpy-0.2.0-cp33-cp33m-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.3m

dukpy-0.2.0-cp33-cp33m-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 3.3m

dukpy-0.2.0-cp27-cp27mu-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 2.7mu

dukpy-0.2.0-cp27-cp27mu-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 2.7mu

dukpy-0.2.0-cp27-cp27m-win_amd64.whl (1.4 MB view details)

Uploaded CPython 2.7m Windows x86-64

dukpy-0.2.0-cp27-cp27m-win32.whl (1.4 MB view details)

Uploaded CPython 2.7m Windows x86

dukpy-0.2.0-cp27-cp27m-manylinux1_x86_64.whl (2.0 MB view details)

Uploaded CPython 2.7m

dukpy-0.2.0-cp27-cp27m-manylinux1_i686.whl (2.0 MB view details)

Uploaded CPython 2.7m

File details

Details for the file dukpy-0.2.0.tar.gz.

File metadata

  • Download URL: dukpy-0.2.0.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for dukpy-0.2.0.tar.gz
Algorithm Hash digest
SHA256 42867ca64351c945d41ccf0decd268b61e0bc626a1456efa08f1ee3ee1f1aacf
MD5 efe627e67e0c0fbd2d50677ead6a0a22
BLAKE2b-256 7f324455a332ac8542e5b42ca70b3feb383515db57ac8884f720a254244cf918

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 35e51b7a21b93d7521f68825af3693f6cc89456154df7fe201af5268bc84018e
MD5 1ad721e95596655d6f666cac6aec5424
BLAKE2b-256 747baf0a143e9101e369c64698efee5acfeaf3ebf85304a3bce10bc6d3bfeecb

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 a879961a2c917a6ab77259b4e93a6cfb9b78a5831d07dd12a660b9abc5da920a
MD5 0ea6b2570f01e2a1e2d5fbc98cc66089
BLAKE2b-256 713857ebd197469a2de6c87138b6eaddc33f5b93e2e0de19582b6839ab912ccd

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 25c44076371dd2c7c2677d9febd36d526112f15871ccaa8489465b849a091913
MD5 971d0c39e1f47ac38baf5632b94ab764
BLAKE2b-256 c035bd9622ca394e205614fbc8959cd2def6f0e13b3fc7f92ebb7cd094db9c16

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 53f2262a160997e845c524f028d5aa8287c67dd9c84aaefbb1c39087b69d9850
MD5 9098829c685b675bfc9f97528bbada2b
BLAKE2b-256 3f93c01d293db6024109699d074939b8d3d6dc557f5b8fd755f7b9a2899e5d36

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 68de6cdfd36e85551d4057fcc612224dab76f1a8878fde7688d0a16e681fa963
MD5 a1dfb91c3487ea5203f67739b77b11ff
BLAKE2b-256 0e727c492c5bc87e073f0d01dd03836737c6ab82dd6743c15a06a2bef2a70f7a

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 859422978d025befe42da44125e8511b41287994ac5c2d982034f8a9558f356d
MD5 f5c0b1bf5c3c03a3370a9d643e2891f9
BLAKE2b-256 a6bc1e17d0f76f45cc99e01bb91cb4efe87b97e2d54e30e2f49a61279afdcd44

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ee3b3c6462b06b87eefe298dea9b8bff05c77cc25cb8ebd5c5ff2f553971a464
MD5 ffbf22ea7fe04d3e6eb7c9cbc8c4fd47
BLAKE2b-256 1dc70dfeef978e83697a84cb461eae325aea994159c4719c7d9ece332113b56f

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 1ca72a30adae4e5dccb870586e47efb9dc62948bba1a2bc4de901daa69e85ced
MD5 a21c227ea30f577ceaba754c9aa041f4
BLAKE2b-256 a2340a8c3570ca82dcd57bff70811e66ba294e78257f6f65f6818aa31f438d30

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 d45ee6c0008149575c53c358bd1832c98752ce31dcc299b4bcfd43a074c3a1a8
MD5 bd452df03f232e29f5b28d1a5b09d97f
BLAKE2b-256 6994e30d70f898a4ed2c66cb85f10d756c791ce07d86e19cc2cc29f411fb13fc

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 4666452afd7055bfa1c722fb0083d59489ed97f50ea853fdf50d7774a16c434d
MD5 59b99c38cbd43db44dde1cd062e3040e
BLAKE2b-256 301a87f6d983df27c5cbe5d84f6357a14169f4fa9e320e7efd38b61c6a44c0fd

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 bb4334da4ff128fc2a592695d2352ba2286e839eaa55ab39aba77eeee2953635
MD5 bef439497591ecbe8d34b7cac3d3134f
BLAKE2b-256 086cc9eac82a3c81d5fc18767cec9a8b4d95c68cb73ee1138bc1dfb4af181269

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp34-cp34m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 2e6868a56a167a53f9cd54faf4a4e788c800413eb87912d13511adef8d0ff194
MD5 d463a5344105011e156f66ed5fa11573
BLAKE2b-256 5c6f8fb9b5c45db06eb49342c1c6cca9460caac59eadfc879a34571a5648ea4c

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp33-cp33m-win_amd64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp33-cp33m-win_amd64.whl
Algorithm Hash digest
SHA256 3ae50a560248f8aa6c2ea344bbf084931500c35c11ebf1d2af209657f27a8f4a
MD5 cc1ae3ef2ce54a015f30a302fc0a70e2
BLAKE2b-256 8ecdad2e9030f61cc8e5b72ece1cff7b62041a103f81a0cc30832e82a0975595

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp33-cp33m-win32.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp33-cp33m-win32.whl
Algorithm Hash digest
SHA256 5331e75bb3466d81363d863d75663e88805713ff921692a6848cd58bb61d1939
MD5 e9420be8574e5a3978514f5ea143172e
BLAKE2b-256 67844079998c329aa1dacc86200ebc135cdd4ffcacf865d19d31902c03d90bb5

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp33-cp33m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp33-cp33m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0f85faca6d32044ac64347965c4d3e8c19c92df03d40ca9bf93ae38dfefba8d4
MD5 478845ac68f5418c146f713566e0a8e6
BLAKE2b-256 013b9b8431826ac375957de63652257fdfa30259bb19d64a23e055b03727256b

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp33-cp33m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp33-cp33m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 259e73b6d2ee2e588c682411620aa73c2b3666165a9993d2197bf10571da2f44
MD5 e44f614306c795b436b2ae81a5644470
BLAKE2b-256 87e57e5524b07baaca80b877d28776a635f09ed581c4cf6a64de3990703e5bd9

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27mu-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 6193f6dd51f7938d11e71a2a17850805e57c3d8e4ce5a3126201f27cf69e5e23
MD5 23c9ffd894b0f8a425ca71b5dd967837
BLAKE2b-256 0ff70617b8cfa058c44ada84b81a86713895a1b46cbaf7a4624870592ed254c1

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27mu-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27mu-manylinux1_i686.whl
Algorithm Hash digest
SHA256 9bdd9751d3d3e80b4898fa33ab3d225a4c32ede8e6125121b5f7ac15e63a6eda
MD5 897b7bf747f4a15d8d5f62532f9633f6
BLAKE2b-256 44da6d5c53e46ecc7b0fa1bf73b70ff1de75b6fd144869e827a0055a4cc49265

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27m-win_amd64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 633fb249e4c377df6f8013bbf676e94004f854a8785b944eca11ce80c4b65f77
MD5 92699f444c2dfc12172b109045cc7a1d
BLAKE2b-256 6f8710e41a9282eb2cb3c03c12b567244e7449dfebc74fef2452d7c6d62928a8

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27m-win32.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 6d6647da006469eb3b75c7f5f9bae46e82da2f673c77d73c5ca84204c5ba210e
MD5 c537779af6056e48fdb21f738e86844d
BLAKE2b-256 695c9766084d03bd4aa6b95037bc22f33a69a2ca9620bf58294d46212d9b3ecc

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8f6e333ff0b01f0645fe1469a1883844f3a53a028de4a47b999c423b8de13991
MD5 7f67124ed880efcfa1e9733a9226d613
BLAKE2b-256 42218ce2d1ab8194442e7db9271ee68d140e0c84b5030fcd240f78119d417dc7

See more details on using hashes here.

File details

Details for the file dukpy-0.2.0-cp27-cp27m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for dukpy-0.2.0-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 69ab6473da569925a960c420f8b3c5c7d0ec739ecc1d54cfc018596f1eca4743
MD5 2e427aca1b524950b06c4972f20448c2
BLAKE2b-256 d6c897bca9fac51d925d5325a3e60a1119cbae157fea3a9be383695f0925f8ca

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page