Releases

1.3.0

This is a list of changes implemented with this version. Some are internal and others are part of the skulpt API (if we had one 🙂 ). **python 2 incorrectness: (for those still using python 2 in production)** - `long` - when adding two long objects the result is likely to be an `int` - `method` - unbound methods are no longer supported - The `base` class for all type objects will be `object` even if the base class is not specified **skulpt api** - `Sk.builtin.object.prototype.genericGetAttr` -> `Sk.generic.getAttr` - `Sk.builtin.object.prototype.genericSetAttr` -> `Sk.generic.setAttr` - `Sk.builtin.type.typeLookup` removed and replaced by `Sk.abstr.typeLookup` - `biginter.js` replaced by the [jsbi](https://github.com/GoogleChromeLabs/jsbi) library - `Sk.abstr.inherits` removed - inheritance exclusively dealt with by `Sk.abstr.setUpInheritance` - `Sk.misceval.objectRepr` returns a js string (previously `Sk.builtin.str`) - `Sk.__future__.python3` becomes the default. Those wishing to use `python2` must define this in the `Sk.configure` object. - `Sk.abstr.binary_op_`, `Sk.abstr.binary_iop_`, `Sk.abstr.unary_op_` removed - use `Sk.abstr.numberBinOp`, `Sk.abstr.numberInplaceBinOp`, `Sk.abstr.numberUnaryOp` instead. **call signatures of builtins** - `new` is required for (almost) all builtin types - 3 exceptions - `Sk.builtin.bool`, `Sk.builtin.none`, `Sk.builtin.NotImplemented` - These 3 will always return their respective constant(s) and are thus not required to be used as constructors. - Restricted parameters for directly accessing a constructor of an `Sk.builtin` type - assertion failures raised in dev mode if `new` is not used - if using in production these error will not be raised. This may be a gotcha for anyone using this version. | type | params | notes | |---|---|---| | `Sk.builtin.int_` | `number, JSBI (bigint), string, undefined}` | can also be called with a python object that has `nb$int` defined | | `Sk.builtin.float_` | `number, undefined` | can also be called with a python object that has `nb$float` defined | | `Sk.builtin.complex` | `number, number` | | | `Sk.builtin.list` | `{Array=}` | Array of py objects or can be called with a python iterable| | `Sk.builtin.tuple` | `{Array=}` | Array of py objects can be called with a python iterable| | `Sk.builtin.set` | `{Array=}` | Array of py objects or can be called with a python iterable| | `Sk.builtin.dict` | `{Array=}` | key/value pairs - only python objects | | `Sk.builtin.str` | `{*}` | | | `Sk.builtin.bool` | `{*}` | | Note that you should only pass a number to the `int` javascript constructor if it's absolute value is less than `Number.MAX_SAFE_INTEGER`. Similarly you should only pass a `JSBI (bigint)` to the int constructor if it's absolute value is larger than `Number.MAX_SAFE_INTEGER`. **Major changes** - All type objects are now callable using their respective `tp$call` methods inherited from `Sk.builtin.type` - All native type objects will require a `tp$new` and `tp$init` method (maybe inherited by `Sk.builtin.object`) - All type objects are javascript instances of `Sk.builtin.type` - All single inherited objects follow javascript inheritance - All native type objects now have the following and replaces the use of `Sk.builtin.func` for all dunder function/methods. - `wrapper_descriptors` aka `slot_wrappers` - `method_descriptors` - `classmethod_descriptors` - `getset_descriptors` aka `attributes`/`member_descriptors` - `Sk.builtin.sk_method` is an alternative to `Sk.builtin.func` and is used by the above `descriptor` types - mangled names are never passed to the user but instead are an attribute on `Sk.builtin.str` instances as `$mangled` - `mappingproxy` added - `$d` removed on all type objects. - `attributes` of a type object now only appear on the `prototype`. Previously these appeared on both the `type` object and the `prototype` **Additions** - `dict`, `set`, `tuple` are suspendible - `map`, `filter`, `zip`, `reversed`, `enumerate` are suspendible - `classmethod`, `property`, `staticmethod` have native skulpt implementations - `super` can now be unbound [see this explanation](https://stackoverflow.com/questions/30190185/how-can-i-use-super-with-one-argument-in-python/30190341#30190341) - `Sk.builtin.func` objects gain a `qualname` in compile code - API for building native types - `Sk.abstr.buildNativeClass` - `range_iterator` class added - `reverse` iterators added for `list`, `dict_views`, `range` - `|` operator valid for `dict`, `dict_keys`, `dict_items` - `Counter` has number slots added - python docstrings now work **`Sk.abstr.`** - `objectHash` - `buildNativeClass` - `buildIteratorClass` - `setUpBuiltinMro` - `setUpMethods` - `setUpGetSets` - `setUpSlots` - `setUpClassMethod` - `setUpBaseInheritance` - `setUpModuleMethod` - `checkNoKwargs` - `checkNoArgs` - `checkOneArg` - `checkArgsLen` - `copyKeywordsToNamedArgs` **`Sk.generic.`** - `getAttr` - `setAttr` - `new` - `newMethodDef` - `iterNextWithArray` - `iterNextWithArrayCheckSize` - `iterLengthHintWithArrayMethodDef` - `iterReverseLengthHintMethodDef` - `getSetDict` **`Sk.misceval.`** - `asIndex` - will return the internal representation of the integer - or undefined if not indexable - could be a number or a bigint (JSBI) - `asIndexOrThrow` - does `asIndex` but throws an error if the number is not indexable - with an optional message parameter. - `asIndexSized` - throws an error if the object is not indexable, returns a Number always, Option to throw an error if the index is larger than `Number.MAX_SAFE_INTEGER`. This is the goto method for most builtins now. - `Iterator` - a python class that easily wraps an iterator - `arrayFromIterable` - optional canSuspend implementation that returns an array from a python iterator - `iterArray` - like `iterFor` but with an array rather than a python iterator **`slotdefs.js`** - contains all the information about mapping slots to dunders and vice versa. **slot changes** *only relevant for those developers and those writing slot functions directly - hopefully very few users* - `mp$length` replaced by `sq$length` in the codebase - `sq$ass_item`/`sq$ass_slice` replaced with `mp$ass_subscript` - `nb$nonzero` replaced with `nb$bool` and switch version to py2/py3 takes care of mapping the appropriate dunder method. - `mp$del_subscript` replaced by `mp$ass_subscript` (as per Cpython) - deleting vs setting an item is based on the call signature - `mp$ass_subscript(key, value)` -> set item - `mp$ass_subscript(key)` -> delete item - If a dunder func is defined on a user defined class then the slot function is guaranteed. - e.g. `__len__` defined guarantees `sq$length`. - A slot function defined by skulpt in this way throws the appropriate errors and converts the return value to the appropriate internal object. - `sq$length` called internally: `__len__` is called using `Sk.misceval.callsim(OrSuspend)Array`. - The result is checked to be an `int` and then converted to `number` since `sq$length` expects a `number`. - `tp$str` removed from some builtins as per Python 3.8 changes - If `tp$richcompare` is defined - wrapper functions `ob$eq` etc are created - this way `Sk.misceval.richCompareBool` need only check for the existence of an `ob$*` slot. - in fact - the existence of these slots is guaranteed since they are inherited from `Sk.builtin.object` - `tp$mro`/`tp$bases` are Js Arrays rather than `Sk.builtin.tuple` - `tp$str` and `$r` for errors were changed as per Cpython. - `nb$int_` -> `nb$int` - `nb$lng` -> `nb$long` - `nb$float_` -> `nb$float` - return values for certain slot functions have changed - `tp$hash` - should return a javascript number less than `Number.MAX_SAFE_INTEGER` can be postive or negative - `nb$index` - should return a javascript number or BigInt (older browsers should be a JSBI BigInt) - `tp$name` was removed from instances of `Sk.builtin.func` and `Sk.buitin.method` in favour of `$name` since it's `tp$name` should be the `type name` **flags - only relevant internally** - `sk$acceptable_as_base_class` used for some type objects - `sk$object` every skulpt object will have this flag. An easy way to determine if you have a skulpt object or a javascript object - `hp$type` all instance of `sk$klass` types - `sk$prototypical` do we need to walk up the MRO or can we just check the `prototype` - `sk$builtinBase` the most derived base which is a native skulpt class - `sk$baseClass` builtin classes that are direct children of `object` **other internal changes** - the use of `numPromoteFunc` was removed for performance improvements in the implementation of `Sk.asbtr.numberBinOp` - It was performance beneficial to leave the promoting to the respective `nb$` slots - `int` binop slots only deal with instance of `int` - `float` binop slots deal with instances of `float` and `int` - `complex` binop slots deal with instances of `complex`, `float` and `int` - since `long` was effectively removed when a number is larger than `Number.MAX_SAFE_INTEGER` it's `.v` value is a `BigInt`. if `BigInt` is not available in the browser then the `JSBI` library is used to replicate `BigInt` functionality. - `set` and `frozenset` now share much of their implementation - `collections` module rewritten using new api - `itertools` module rewritten using new api - these are now type objects rather than instances of `generator` - `operator` module rewritten using new api - `math` module adapted to the new api - `dict` and `set` throw errors if the objects change size during iteration as per Cpython. - fully tested - `Sk.builtin.check*` moved to `src/check.js` - `number.js` removed - `numtype.js` removed - `seqtype.js` removed - `mp$subscript` should *not* be called by a js object (see changes in `random.js`) - `quick$lookup` added to `dict.prototype` which is a fast way to lookup up `str` keys - `dict.prototype.entries` rather than has values that are `arrays` of key value pairs - `object.prototype.tp$hash` will no longer add `$savedHash_` to the object - instead it uses a javascript map and assigns objects to a random number less than `Number.MAX_SAFE_INTEGER` rather than incrementing the hash value each time. - `float.prototype.tp$hash` for integers this will be the same value as `Sk.builtin.int.prototype.tp$hash` for non integers this will be a random number less than `Number.MAX_SAFE_INTEGER`. Previously this was the number rounded down - but this creates a lot of collisions.

0.10.0

This latest release contains a lot of goodness. - You can now inherit from builtin types including Exceptions! - Major cleanup of numeric types - Bug fixes for iteration when using subclasses with our without `__getitem__` - Bug fixes and more completeness to lookups of dunder methods - complex type is added - brun command added to skulpt for easy access to in-browser debug - Many Many minor bug fixes.

{ "api_url": "https://api.github.com", "archived": false, "baseurl": "", "build_revision": "ac35c354ac53626818a976ec23f29b3212f2736e", "clone_url": "https://github.com/skulpt/skulpt.git", "contributors": [ { "login": "s-cork", "id": 36813890, "node_id": "MDQ6VXNlcjM2ODEzODkw", "avatar_url": "https://avatars.githubusercontent.com/u/36813890?v=4", "gravatar_id": "", "url": "https://api.github.com/users/s-cork", "html_url": "https://github.com/s-cork", "followers_url": "https://api.github.com/users/s-cork/followers", "following_url": "https://api.github.com/users/s-cork/following{/other_user}", "gists_url": "https://api.github.com/users/s-cork/gists{/gist_id}", "starred_url": "https://api.github.com/users/s-cork/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/s-cork/subscriptions", "organizations_url": "https://api.github.com/users/s-cork/orgs", "repos_url": "https://api.github.com/users/s-cork/repos", "events_url": "https://api.github.com/users/s-cork/events{/privacy}", "received_events_url": "https://api.github.com/users/s-cork/received_events", "type": "User", "site_admin": false, "contributions": 1076 }, { "login": "bnmnetp", "id": 51115, "node_id": "MDQ6VXNlcjUxMTE1", "avatar_url": "https://avatars.githubusercontent.com/u/51115?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bnmnetp", "html_url": "https://github.com/bnmnetp", "followers_url": "https://api.github.com/users/bnmnetp/followers", "following_url": "https://api.github.com/users/bnmnetp/following{/other_user}", "gists_url": "https://api.github.com/users/bnmnetp/gists{/gist_id}", "starred_url": "https://api.github.com/users/bnmnetp/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bnmnetp/subscriptions", "organizations_url": "https://api.github.com/users/bnmnetp/orgs", "repos_url": "https://api.github.com/users/bnmnetp/repos", "events_url": "https://api.github.com/users/bnmnetp/events{/privacy}", "received_events_url": "https://api.github.com/users/bnmnetp/received_events", "type": "User", "site_admin": false, "contributions": 801 }, { "login": "rixner", "id": 1915454, "node_id": "MDQ6VXNlcjE5MTU0NTQ=", "avatar_url": "https://avatars.githubusercontent.com/u/1915454?v=4", "gravatar_id": "", "url": "https://api.github.com/users/rixner", "html_url": "https://github.com/rixner", "followers_url": "https://api.github.com/users/rixner/followers", "following_url": "https://api.github.com/users/rixner/following{/other_user}", "gists_url": "https://api.github.com/users/rixner/gists{/gist_id}", "starred_url": "https://api.github.com/users/rixner/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/rixner/subscriptions", "organizations_url": "https://api.github.com/users/rixner/orgs", "repos_url": "https://api.github.com/users/rixner/repos", "events_url": "https://api.github.com/users/rixner/events{/privacy}", "received_events_url": "https://api.github.com/users/rixner/received_events", "type": "User", "site_admin": false, "contributions": 523 }, { "login": "albertjan", "id": 301791, "node_id": "MDQ6VXNlcjMwMTc5MQ==", "avatar_url": "https://avatars.githubusercontent.com/u/301791?v=4", "gravatar_id": "", "url": "https://api.github.com/users/albertjan", "html_url": "https://github.com/albertjan", "followers_url": "https://api.github.com/users/albertjan/followers", "following_url": "https://api.github.com/users/albertjan/following{/other_user}", "gists_url": "https://api.github.com/users/albertjan/gists{/gist_id}", "starred_url": "https://api.github.com/users/albertjan/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/albertjan/subscriptions", "organizations_url": "https://api.github.com/users/albertjan/orgs", "repos_url": "https://api.github.com/users/albertjan/repos", "events_url": "https://api.github.com/users/albertjan/events{/privacy}", "received_events_url": "https://api.github.com/users/albertjan/received_events", "type": "User", "site_admin": false, "contributions": 433 }, { "login": "meredydd", "id": 126110, "node_id": "MDQ6VXNlcjEyNjExMA==", "avatar_url": "https://avatars.githubusercontent.com/u/126110?v=4", "gravatar_id": "", "url": "https://api.github.com/users/meredydd", "html_url": "https://github.com/meredydd", "followers_url": "https://api.github.com/users/meredydd/followers", "following_url": "https://api.github.com/users/meredydd/following{/other_user}", "gists_url": "https://api.github.com/users/meredydd/gists{/gist_id}", "starred_url": "https://api.github.com/users/meredydd/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/meredydd/subscriptions", "organizations_url": "https://api.github.com/users/meredydd/orgs", "repos_url": "https://api.github.com/users/meredydd/repos", "events_url": "https://api.github.com/users/meredydd/events{/privacy}", "received_events_url": "https://api.github.com/users/meredydd/received_events", "type": "User", "site_admin": false, "contributions": 277 }, { "login": "mariechatfield", "id": 4974085, "node_id": "MDQ6VXNlcjQ5NzQwODU=", "avatar_url": "https://avatars.githubusercontent.com/u/4974085?v=4", "gravatar_id": "", "url": "https://api.github.com/users/mariechatfield", "html_url": "https://github.com/mariechatfield", "followers_url": "https://api.github.com/users/mariechatfield/followers", "following_url": "https://api.github.com/users/mariechatfield/following{/other_user}", "gists_url": "https://api.github.com/users/mariechatfield/gists{/gist_id}", "starred_url": "https://api.github.com/users/mariechatfield/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mariechatfield/subscriptions", "organizations_url": "https://api.github.com/users/mariechatfield/orgs", "repos_url": "https://api.github.com/users/mariechatfield/repos", "events_url": "https://api.github.com/users/mariechatfield/events{/privacy}", "received_events_url": "https://api.github.com/users/mariechatfield/received_events", "type": "User", "site_admin": false, "contributions": 242 }, { "login": "alexwenbj", "id": 12047524, "node_id": "MDQ6VXNlcjEyMDQ3NTI0", "avatar_url": "https://avatars.githubusercontent.com/u/12047524?v=4", "gravatar_id": "", "url": "https://api.github.com/users/alexwenbj", "html_url": "https://github.com/alexwenbj", "followers_url": "https://api.github.com/users/alexwenbj/followers", "following_url": "https://api.github.com/users/alexwenbj/following{/other_user}", "gists_url": "https://api.github.com/users/alexwenbj/gists{/gist_id}", "starred_url": "https://api.github.com/users/alexwenbj/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/alexwenbj/subscriptions", "organizations_url": "https://api.github.com/users/alexwenbj/orgs", "repos_url": "https://api.github.com/users/alexwenbj/repos", "events_url": "https://api.github.com/users/alexwenbj/events{/privacy}", "received_events_url": "https://api.github.com/users/alexwenbj/received_events", "type": "User", "site_admin": false, "contributions": 98 }, { "login": "bzwheeler", "id": 1641097, "node_id": "MDQ6VXNlcjE2NDEwOTc=", "avatar_url": "https://avatars.githubusercontent.com/u/1641097?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bzwheeler", "html_url": "https://github.com/bzwheeler", "followers_url": "https://api.github.com/users/bzwheeler/followers", "following_url": "https://api.github.com/users/bzwheeler/following{/other_user}", "gists_url": "https://api.github.com/users/bzwheeler/gists{/gist_id}", "starred_url": "https://api.github.com/users/bzwheeler/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bzwheeler/subscriptions", "organizations_url": "https://api.github.com/users/bzwheeler/orgs", "repos_url": "https://api.github.com/users/bzwheeler/repos", "events_url": "https://api.github.com/users/bzwheeler/events{/privacy}", "received_events_url": "https://api.github.com/users/bzwheeler/received_events", "type": "User", "site_admin": false, "contributions": 98 }, { "login": "graceynichols", "id": 54552569, "node_id": "MDQ6VXNlcjU0NTUyNTY5", "avatar_url": "https://avatars.githubusercontent.com/u/54552569?v=4", "gravatar_id": "", "url": "https://api.github.com/users/graceynichols", "html_url": "https://github.com/graceynichols", "followers_url": "https://api.github.com/users/graceynichols/followers", "following_url": "https://api.github.com/users/graceynichols/following{/other_user}", "gists_url": "https://api.github.com/users/graceynichols/gists{/gist_id}", "starred_url": "https://api.github.com/users/graceynichols/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/graceynichols/subscriptions", "organizations_url": "https://api.github.com/users/graceynichols/orgs", "repos_url": "https://api.github.com/users/graceynichols/repos", "events_url": "https://api.github.com/users/graceynichols/events{/privacy}", "received_events_url": "https://api.github.com/users/graceynichols/received_events", "type": "User", "site_admin": false, "contributions": 77 }, { "login": "eah13", "id": 1702745, "node_id": "MDQ6VXNlcjE3MDI3NDU=", "avatar_url": "https://avatars.githubusercontent.com/u/1702745?v=4", "gravatar_id": "", "url": "https://api.github.com/users/eah13", "html_url": "https://github.com/eah13", "followers_url": "https://api.github.com/users/eah13/followers", "following_url": "https://api.github.com/users/eah13/following{/other_user}", "gists_url": "https://api.github.com/users/eah13/gists{/gist_id}", "starred_url": "https://api.github.com/users/eah13/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/eah13/subscriptions", "organizations_url": "https://api.github.com/users/eah13/orgs", "repos_url": "https://api.github.com/users/eah13/repos", "events_url": "https://api.github.com/users/eah13/events{/privacy}", "received_events_url": "https://api.github.com/users/eah13/received_events", "type": "User", "site_admin": false, "contributions": 76 }, { "login": "ebertmi", "id": 1634468, "node_id": "MDQ6VXNlcjE2MzQ0Njg=", "avatar_url": "https://avatars.githubusercontent.com/u/1634468?v=4", "gravatar_id": "", "url": "https://api.github.com/users/ebertmi", "html_url": "https://github.com/ebertmi", "followers_url": "https://api.github.com/users/ebertmi/followers", "following_url": "https://api.github.com/users/ebertmi/following{/other_user}", "gists_url": "https://api.github.com/users/ebertmi/gists{/gist_id}", "starred_url": "https://api.github.com/users/ebertmi/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/ebertmi/subscriptions", "organizations_url": "https://api.github.com/users/ebertmi/orgs", "repos_url": "https://api.github.com/users/ebertmi/repos", "events_url": "https://api.github.com/users/ebertmi/events{/privacy}", "received_events_url": "https://api.github.com/users/ebertmi/received_events", "type": "User", "site_admin": false, "contributions": 58 }, { "login": "ssarangi", "id": 239816, "node_id": "MDQ6VXNlcjIzOTgxNg==", "avatar_url": "https://avatars.githubusercontent.com/u/239816?v=4", "gravatar_id": "", "url": "https://api.github.com/users/ssarangi", "html_url": "https://github.com/ssarangi", "followers_url": "https://api.github.com/users/ssarangi/followers", "following_url": "https://api.github.com/users/ssarangi/following{/other_user}", "gists_url": "https://api.github.com/users/ssarangi/gists{/gist_id}", "starred_url": "https://api.github.com/users/ssarangi/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/ssarangi/subscriptions", "organizations_url": "https://api.github.com/users/ssarangi/orgs", "repos_url": "https://api.github.com/users/ssarangi/repos", "events_url": "https://api.github.com/users/ssarangi/events{/privacy}", "received_events_url": "https://api.github.com/users/ssarangi/received_events", "type": "User", "site_admin": false, "contributions": 51 }, { "login": "brianpmarks", "id": 688178, "node_id": "MDQ6VXNlcjY4ODE3OA==", "avatar_url": "https://avatars.githubusercontent.com/u/688178?v=4", "gravatar_id": "", "url": "https://api.github.com/users/brianpmarks", "html_url": "https://github.com/brianpmarks", "followers_url": "https://api.github.com/users/brianpmarks/followers", "following_url": "https://api.github.com/users/brianpmarks/following{/other_user}", "gists_url": "https://api.github.com/users/brianpmarks/gists{/gist_id}", "starred_url": "https://api.github.com/users/brianpmarks/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/brianpmarks/subscriptions", "organizations_url": "https://api.github.com/users/brianpmarks/orgs", "repos_url": "https://api.github.com/users/brianpmarks/repos", "events_url": "https://api.github.com/users/brianpmarks/events{/privacy}", "received_events_url": "https://api.github.com/users/brianpmarks/received_events", "type": "User", "site_admin": false, "contributions": 45 }, { "login": "gerbal", "id": 5278092, "node_id": "MDQ6VXNlcjUyNzgwOTI=", "avatar_url": "https://avatars.githubusercontent.com/u/5278092?v=4", "gravatar_id": "", "url": "https://api.github.com/users/gerbal", "html_url": "https://github.com/gerbal", "followers_url": "https://api.github.com/users/gerbal/followers", "following_url": "https://api.github.com/users/gerbal/following{/other_user}", "gists_url": "https://api.github.com/users/gerbal/gists{/gist_id}", "starred_url": "https://api.github.com/users/gerbal/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/gerbal/subscriptions", "organizations_url": "https://api.github.com/users/gerbal/orgs", "repos_url": "https://api.github.com/users/gerbal/repos", "events_url": "https://api.github.com/users/gerbal/events{/privacy}", "received_events_url": "https://api.github.com/users/gerbal/received_events", "type": "User", "site_admin": false, "contributions": 32 }, { "login": "LeszekSwirski", "id": 593597, "node_id": "MDQ6VXNlcjU5MzU5Nw==", "avatar_url": "https://avatars.githubusercontent.com/u/593597?v=4", "gravatar_id": "", "url": "https://api.github.com/users/LeszekSwirski", "html_url": "https://github.com/LeszekSwirski", "followers_url": "https://api.github.com/users/LeszekSwirski/followers", "following_url": "https://api.github.com/users/LeszekSwirski/following{/other_user}", "gists_url": "https://api.github.com/users/LeszekSwirski/gists{/gist_id}", "starred_url": "https://api.github.com/users/LeszekSwirski/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/LeszekSwirski/subscriptions", "organizations_url": "https://api.github.com/users/LeszekSwirski/orgs", "repos_url": "https://api.github.com/users/LeszekSwirski/repos", "events_url": "https://api.github.com/users/LeszekSwirski/events{/privacy}", "received_events_url": "https://api.github.com/users/LeszekSwirski/received_events", "type": "User", "site_admin": false, "contributions": 29 }, { "login": "SophiaJefferson", "id": 25080600, "node_id": "MDQ6VXNlcjI1MDgwNjAw", "avatar_url": "https://avatars.githubusercontent.com/u/25080600?v=4", "gravatar_id": "", "url": "https://api.github.com/users/SophiaJefferson", "html_url": "https://github.com/SophiaJefferson", "followers_url": "https://api.github.com/users/SophiaJefferson/followers", "following_url": "https://api.github.com/users/SophiaJefferson/following{/other_user}", "gists_url": "https://api.github.com/users/SophiaJefferson/gists{/gist_id}", "starred_url": "https://api.github.com/users/SophiaJefferson/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/SophiaJefferson/subscriptions", "organizations_url": "https://api.github.com/users/SophiaJefferson/orgs", "repos_url": "https://api.github.com/users/SophiaJefferson/repos", "events_url": "https://api.github.com/users/SophiaJefferson/events{/privacy}", "received_events_url": "https://api.github.com/users/SophiaJefferson/received_events", "type": "User", "site_admin": false, "contributions": 28 }, { "login": "Jacco", "id": 1318341, "node_id": "MDQ6VXNlcjEzMTgzNDE=", "avatar_url": "https://avatars.githubusercontent.com/u/1318341?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Jacco", "html_url": "https://github.com/Jacco", "followers_url": "https://api.github.com/users/Jacco/followers", "following_url": "https://api.github.com/users/Jacco/following{/other_user}", "gists_url": "https://api.github.com/users/Jacco/gists{/gist_id}", "starred_url": "https://api.github.com/users/Jacco/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Jacco/subscriptions", "organizations_url": "https://api.github.com/users/Jacco/orgs", "repos_url": "https://api.github.com/users/Jacco/repos", "events_url": "https://api.github.com/users/Jacco/events{/privacy}", "received_events_url": "https://api.github.com/users/Jacco/received_events", "type": "User", "site_admin": false, "contributions": 23 }, { "login": "bennorth", "id": 9059396, "node_id": "MDQ6VXNlcjkwNTkzOTY=", "avatar_url": "https://avatars.githubusercontent.com/u/9059396?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bennorth", "html_url": "https://github.com/bennorth", "followers_url": "https://api.github.com/users/bennorth/followers", "following_url": "https://api.github.com/users/bennorth/following{/other_user}", "gists_url": "https://api.github.com/users/bennorth/gists{/gist_id}", "starred_url": "https://api.github.com/users/bennorth/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bennorth/subscriptions", "organizations_url": "https://api.github.com/users/bennorth/orgs", "repos_url": "https://api.github.com/users/bennorth/repos", "events_url": "https://api.github.com/users/bennorth/events{/privacy}", "received_events_url": "https://api.github.com/users/bennorth/received_events", "type": "User", "site_admin": false, "contributions": 22 }, { "login": "isaacdontjelindell", "id": 3758290, "node_id": "MDQ6VXNlcjM3NTgyOTA=", "avatar_url": "https://avatars.githubusercontent.com/u/3758290?v=4", "gravatar_id": "", "url": "https://api.github.com/users/isaacdontjelindell", "html_url": "https://github.com/isaacdontjelindell", "followers_url": "https://api.github.com/users/isaacdontjelindell/followers", "following_url": "https://api.github.com/users/isaacdontjelindell/following{/other_user}", "gists_url": "https://api.github.com/users/isaacdontjelindell/gists{/gist_id}", "starred_url": "https://api.github.com/users/isaacdontjelindell/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/isaacdontjelindell/subscriptions", "organizations_url": "https://api.github.com/users/isaacdontjelindell/orgs", "repos_url": "https://api.github.com/users/isaacdontjelindell/repos", "events_url": "https://api.github.com/users/isaacdontjelindell/events{/privacy}", "received_events_url": "https://api.github.com/users/isaacdontjelindell/received_events", "type": "User", "site_admin": false, "contributions": 19 }, { "login": "prescod", "id": 22091, "node_id": "MDQ6VXNlcjIyMDkx", "avatar_url": "https://avatars.githubusercontent.com/u/22091?v=4", "gravatar_id": "", "url": "https://api.github.com/users/prescod", "html_url": "https://github.com/prescod", "followers_url": "https://api.github.com/users/prescod/followers", "following_url": "https://api.github.com/users/prescod/following{/other_user}", "gists_url": "https://api.github.com/users/prescod/gists{/gist_id}", "starred_url": "https://api.github.com/users/prescod/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/prescod/subscriptions", "organizations_url": "https://api.github.com/users/prescod/orgs", "repos_url": "https://api.github.com/users/prescod/repos", "events_url": "https://api.github.com/users/prescod/events{/privacy}", "received_events_url": "https://api.github.com/users/prescod/received_events", "type": "User", "site_admin": false, "contributions": 16 }, { "login": "blacatena", "id": 508059, "node_id": "MDQ6VXNlcjUwODA1OQ==", "avatar_url": "https://avatars.githubusercontent.com/u/508059?v=4", "gravatar_id": "", "url": "https://api.github.com/users/blacatena", "html_url": "https://github.com/blacatena", "followers_url": "https://api.github.com/users/blacatena/followers", "following_url": "https://api.github.com/users/blacatena/following{/other_user}", "gists_url": "https://api.github.com/users/blacatena/gists{/gist_id}", "starred_url": "https://api.github.com/users/blacatena/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/blacatena/subscriptions", "organizations_url": "https://api.github.com/users/blacatena/orgs", "repos_url": "https://api.github.com/users/blacatena/repos", "events_url": "https://api.github.com/users/blacatena/events{/privacy}", "received_events_url": "https://api.github.com/users/blacatena/received_events", "type": "User", "site_admin": false, "contributions": 15 }, { "login": "PeterJCLaw", "id": 336212, "node_id": "MDQ6VXNlcjMzNjIxMg==", "avatar_url": "https://avatars.githubusercontent.com/u/336212?v=4", "gravatar_id": "", "url": "https://api.github.com/users/PeterJCLaw", "html_url": "https://github.com/PeterJCLaw", "followers_url": "https://api.github.com/users/PeterJCLaw/followers", "following_url": "https://api.github.com/users/PeterJCLaw/following{/other_user}", "gists_url": "https://api.github.com/users/PeterJCLaw/gists{/gist_id}", "starred_url": "https://api.github.com/users/PeterJCLaw/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/PeterJCLaw/subscriptions", "organizations_url": "https://api.github.com/users/PeterJCLaw/orgs", "repos_url": "https://api.github.com/users/PeterJCLaw/repos", "events_url": "https://api.github.com/users/PeterJCLaw/events{/privacy}", "received_events_url": "https://api.github.com/users/PeterJCLaw/received_events", "type": "User", "site_admin": false, "contributions": 15 }, { "login": "aajanki", "id": 353043, "node_id": "MDQ6VXNlcjM1MzA0Mw==", "avatar_url": "https://avatars.githubusercontent.com/u/353043?v=4", "gravatar_id": "", "url": "https://api.github.com/users/aajanki", "html_url": "https://github.com/aajanki", "followers_url": "https://api.github.com/users/aajanki/followers", "following_url": "https://api.github.com/users/aajanki/following{/other_user}", "gists_url": "https://api.github.com/users/aajanki/gists{/gist_id}", "starred_url": "https://api.github.com/users/aajanki/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/aajanki/subscriptions", "organizations_url": "https://api.github.com/users/aajanki/orgs", "repos_url": "https://api.github.com/users/aajanki/repos", "events_url": "https://api.github.com/users/aajanki/events{/privacy}", "received_events_url": "https://api.github.com/users/aajanki/received_events", "type": "User", "site_admin": false, "contributions": 14 }, { "login": "shreyasminocha", "id": 11537232, "node_id": "MDQ6VXNlcjExNTM3MjMy", "avatar_url": "https://avatars.githubusercontent.com/u/11537232?v=4", "gravatar_id": "", "url": "https://api.github.com/users/shreyasminocha", "html_url": "https://github.com/shreyasminocha", "followers_url": "https://api.github.com/users/shreyasminocha/followers", "following_url": "https://api.github.com/users/shreyasminocha/following{/other_user}", "gists_url": "https://api.github.com/users/shreyasminocha/gists{/gist_id}", "starred_url": "https://api.github.com/users/shreyasminocha/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/shreyasminocha/subscriptions", "organizations_url": "https://api.github.com/users/shreyasminocha/orgs", "repos_url": "https://api.github.com/users/shreyasminocha/repos", "events_url": "https://api.github.com/users/shreyasminocha/events{/privacy}", "received_events_url": "https://api.github.com/users/shreyasminocha/received_events", "type": "User", "site_admin": false, "contributions": 14 }, { "login": "Dustyposa", "id": 27180793, "node_id": "MDQ6VXNlcjI3MTgwNzkz", "avatar_url": "https://avatars.githubusercontent.com/u/27180793?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Dustyposa", "html_url": "https://github.com/Dustyposa", "followers_url": "https://api.github.com/users/Dustyposa/followers", "following_url": "https://api.github.com/users/Dustyposa/following{/other_user}", "gists_url": "https://api.github.com/users/Dustyposa/gists{/gist_id}", "starred_url": "https://api.github.com/users/Dustyposa/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Dustyposa/subscriptions", "organizations_url": "https://api.github.com/users/Dustyposa/orgs", "repos_url": "https://api.github.com/users/Dustyposa/repos", "events_url": "https://api.github.com/users/Dustyposa/events{/privacy}", "received_events_url": "https://api.github.com/users/Dustyposa/received_events", "type": "User", "site_admin": false, "contributions": 12 }, { "login": "csev", "id": 1197222, "node_id": "MDQ6VXNlcjExOTcyMjI=", "avatar_url": "https://avatars.githubusercontent.com/u/1197222?v=4", "gravatar_id": "", "url": "https://api.github.com/users/csev", "html_url": "https://github.com/csev", "followers_url": "https://api.github.com/users/csev/followers", "following_url": "https://api.github.com/users/csev/following{/other_user}", "gists_url": "https://api.github.com/users/csev/gists{/gist_id}", "starred_url": "https://api.github.com/users/csev/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/csev/subscriptions", "organizations_url": "https://api.github.com/users/csev/orgs", "repos_url": "https://api.github.com/users/csev/repos", "events_url": "https://api.github.com/users/csev/events{/privacy}", "received_events_url": "https://api.github.com/users/csev/received_events", "type": "User", "site_admin": false, "contributions": 11 }, { "login": "david-geo-holmes", "id": 558095, "node_id": "MDQ6VXNlcjU1ODA5NQ==", "avatar_url": "https://avatars.githubusercontent.com/u/558095?v=4", "gravatar_id": "", "url": "https://api.github.com/users/david-geo-holmes", "html_url": "https://github.com/david-geo-holmes", "followers_url": "https://api.github.com/users/david-geo-holmes/followers", "following_url": "https://api.github.com/users/david-geo-holmes/following{/other_user}", "gists_url": "https://api.github.com/users/david-geo-holmes/gists{/gist_id}", "starred_url": "https://api.github.com/users/david-geo-holmes/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/david-geo-holmes/subscriptions", "organizations_url": "https://api.github.com/users/david-geo-holmes/orgs", "repos_url": "https://api.github.com/users/david-geo-holmes/repos", "events_url": "https://api.github.com/users/david-geo-holmes/events{/privacy}", "received_events_url": "https://api.github.com/users/david-geo-holmes/received_events", "type": "User", "site_admin": false, "contributions": 10 }, { "login": "bofeng", "id": 3884670, "node_id": "MDQ6VXNlcjM4ODQ2NzA=", "avatar_url": "https://avatars.githubusercontent.com/u/3884670?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bofeng", "html_url": "https://github.com/bofeng", "followers_url": "https://api.github.com/users/bofeng/followers", "following_url": "https://api.github.com/users/bofeng/following{/other_user}", "gists_url": "https://api.github.com/users/bofeng/gists{/gist_id}", "starred_url": "https://api.github.com/users/bofeng/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bofeng/subscriptions", "organizations_url": "https://api.github.com/users/bofeng/orgs", "repos_url": "https://api.github.com/users/bofeng/repos", "events_url": "https://api.github.com/users/bofeng/events{/privacy}", "received_events_url": "https://api.github.com/users/bofeng/received_events", "type": "User", "site_admin": false, "contributions": 10 }, { "login": "robyntorregrosa", "id": 20244117, "node_id": "MDQ6VXNlcjIwMjQ0MTE3", "avatar_url": "https://avatars.githubusercontent.com/u/20244117?v=4", "gravatar_id": "", "url": "https://api.github.com/users/robyntorregrosa", "html_url": "https://github.com/robyntorregrosa", "followers_url": "https://api.github.com/users/robyntorregrosa/followers", "following_url": "https://api.github.com/users/robyntorregrosa/following{/other_user}", "gists_url": "https://api.github.com/users/robyntorregrosa/gists{/gist_id}", "starred_url": "https://api.github.com/users/robyntorregrosa/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/robyntorregrosa/subscriptions", "organizations_url": "https://api.github.com/users/robyntorregrosa/orgs", "repos_url": "https://api.github.com/users/robyntorregrosa/repos", "events_url": "https://api.github.com/users/robyntorregrosa/events{/privacy}", "received_events_url": "https://api.github.com/users/robyntorregrosa/received_events", "type": "User", "site_admin": false, "contributions": 9 }, { "login": "archibate", "id": 20640597, "node_id": "MDQ6VXNlcjIwNjQwNTk3", "avatar_url": "https://avatars.githubusercontent.com/u/20640597?v=4", "gravatar_id": "", "url": "https://api.github.com/users/archibate", "html_url": "https://github.com/archibate", "followers_url": "https://api.github.com/users/archibate/followers", "following_url": "https://api.github.com/users/archibate/following{/other_user}", "gists_url": "https://api.github.com/users/archibate/gists{/gist_id}", "starred_url": "https://api.github.com/users/archibate/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/archibate/subscriptions", "organizations_url": "https://api.github.com/users/archibate/orgs", "repos_url": "https://api.github.com/users/archibate/repos", "events_url": "https://api.github.com/users/archibate/events{/privacy}", "received_events_url": "https://api.github.com/users/archibate/received_events", "type": "User", "site_admin": false, "contributions": 9 }, { "login": "j-f1", "id": 25517624, "node_id": "MDQ6VXNlcjI1NTE3NjI0", "avatar_url": "https://avatars.githubusercontent.com/u/25517624?v=4", "gravatar_id": "", "url": "https://api.github.com/users/j-f1", "html_url": "https://github.com/j-f1", "followers_url": "https://api.github.com/users/j-f1/followers", "following_url": "https://api.github.com/users/j-f1/following{/other_user}", "gists_url": "https://api.github.com/users/j-f1/gists{/gist_id}", "starred_url": "https://api.github.com/users/j-f1/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/j-f1/subscriptions", "organizations_url": "https://api.github.com/users/j-f1/orgs", "repos_url": "https://api.github.com/users/j-f1/repos", "events_url": "https://api.github.com/users/j-f1/events{/privacy}", "received_events_url": "https://api.github.com/users/j-f1/received_events", "type": "User", "site_admin": false, "contributions": 7 }, { "login": "ahuhn", "id": 2177162, "node_id": "MDQ6VXNlcjIxNzcxNjI=", "avatar_url": "https://avatars.githubusercontent.com/u/2177162?v=4", "gravatar_id": "", "url": "https://api.github.com/users/ahuhn", "html_url": "https://github.com/ahuhn", "followers_url": "https://api.github.com/users/ahuhn/followers", "following_url": "https://api.github.com/users/ahuhn/following{/other_user}", "gists_url": "https://api.github.com/users/ahuhn/gists{/gist_id}", "starred_url": "https://api.github.com/users/ahuhn/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/ahuhn/subscriptions", "organizations_url": "https://api.github.com/users/ahuhn/orgs", "repos_url": "https://api.github.com/users/ahuhn/repos", "events_url": "https://api.github.com/users/ahuhn/events{/privacy}", "received_events_url": "https://api.github.com/users/ahuhn/received_events", "type": "User", "site_admin": false, "contributions": 7 }, { "login": "acbart", "id": 897227, "node_id": "MDQ6VXNlcjg5NzIyNw==", "avatar_url": "https://avatars.githubusercontent.com/u/897227?v=4", "gravatar_id": "", "url": "https://api.github.com/users/acbart", "html_url": "https://github.com/acbart", "followers_url": "https://api.github.com/users/acbart/followers", "following_url": "https://api.github.com/users/acbart/following{/other_user}", "gists_url": "https://api.github.com/users/acbart/gists{/gist_id}", "starred_url": "https://api.github.com/users/acbart/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/acbart/subscriptions", "organizations_url": "https://api.github.com/users/acbart/orgs", "repos_url": "https://api.github.com/users/acbart/repos", "events_url": "https://api.github.com/users/acbart/events{/privacy}", "received_events_url": "https://api.github.com/users/acbart/received_events", "type": "User", "site_admin": false, "contributions": 6 }, { "login": "davidscz", "id": 6633754, "node_id": "MDQ6VXNlcjY2MzM3NTQ=", "avatar_url": "https://avatars.githubusercontent.com/u/6633754?v=4", "gravatar_id": "", "url": "https://api.github.com/users/davidscz", "html_url": "https://github.com/davidscz", "followers_url": "https://api.github.com/users/davidscz/followers", "following_url": "https://api.github.com/users/davidscz/following{/other_user}", "gists_url": "https://api.github.com/users/davidscz/gists{/gist_id}", "starred_url": "https://api.github.com/users/davidscz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/davidscz/subscriptions", "organizations_url": "https://api.github.com/users/davidscz/orgs", "repos_url": "https://api.github.com/users/davidscz/repos", "events_url": "https://api.github.com/users/davidscz/events{/privacy}", "received_events_url": "https://api.github.com/users/davidscz/received_events", "type": "User", "site_admin": false, "contributions": 5 }, { "login": "amr66", "id": 10866105, "node_id": "MDQ6VXNlcjEwODY2MTA1", "avatar_url": "https://avatars.githubusercontent.com/u/10866105?v=4", "gravatar_id": "", "url": "https://api.github.com/users/amr66", "html_url": "https://github.com/amr66", "followers_url": "https://api.github.com/users/amr66/followers", "following_url": "https://api.github.com/users/amr66/following{/other_user}", "gists_url": "https://api.github.com/users/amr66/gists{/gist_id}", "starred_url": "https://api.github.com/users/amr66/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/amr66/subscriptions", "organizations_url": "https://api.github.com/users/amr66/orgs", "repos_url": "https://api.github.com/users/amr66/repos", "events_url": "https://api.github.com/users/amr66/events{/privacy}", "received_events_url": "https://api.github.com/users/amr66/received_events", "type": "User", "site_admin": false, "contributions": 4 }, { "login": "jmaroeder", "id": 1402944, "node_id": "MDQ6VXNlcjE0MDI5NDQ=", "avatar_url": "https://avatars.githubusercontent.com/u/1402944?v=4", "gravatar_id": "", "url": "https://api.github.com/users/jmaroeder", "html_url": "https://github.com/jmaroeder", "followers_url": "https://api.github.com/users/jmaroeder/followers", "following_url": "https://api.github.com/users/jmaroeder/following{/other_user}", "gists_url": "https://api.github.com/users/jmaroeder/gists{/gist_id}", "starred_url": "https://api.github.com/users/jmaroeder/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/jmaroeder/subscriptions", "organizations_url": "https://api.github.com/users/jmaroeder/orgs", "repos_url": "https://api.github.com/users/jmaroeder/repos", "events_url": "https://api.github.com/users/jmaroeder/events{/privacy}", "received_events_url": "https://api.github.com/users/jmaroeder/received_events", "type": "User", "site_admin": false, "contributions": 4 }, { "login": "jaspervdg", "id": 3264193, "node_id": "MDQ6VXNlcjMyNjQxOTM=", "avatar_url": "https://avatars.githubusercontent.com/u/3264193?v=4", "gravatar_id": "", "url": "https://api.github.com/users/jaspervdg", "html_url": "https://github.com/jaspervdg", "followers_url": "https://api.github.com/users/jaspervdg/followers", "following_url": "https://api.github.com/users/jaspervdg/following{/other_user}", "gists_url": "https://api.github.com/users/jaspervdg/gists{/gist_id}", "starred_url": "https://api.github.com/users/jaspervdg/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/jaspervdg/subscriptions", "organizations_url": "https://api.github.com/users/jaspervdg/orgs", "repos_url": "https://api.github.com/users/jaspervdg/repos", "events_url": "https://api.github.com/users/jaspervdg/events{/privacy}", "received_events_url": "https://api.github.com/users/jaspervdg/received_events", "type": "User", "site_admin": false, "contributions": 4 }, { "login": "timmartin", "id": 56920, "node_id": "MDQ6VXNlcjU2OTIw", "avatar_url": "https://avatars.githubusercontent.com/u/56920?v=4", "gravatar_id": "", "url": "https://api.github.com/users/timmartin", "html_url": "https://github.com/timmartin", "followers_url": "https://api.github.com/users/timmartin/followers", "following_url": "https://api.github.com/users/timmartin/following{/other_user}", "gists_url": "https://api.github.com/users/timmartin/gists{/gist_id}", "starred_url": "https://api.github.com/users/timmartin/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/timmartin/subscriptions", "organizations_url": "https://api.github.com/users/timmartin/orgs", "repos_url": "https://api.github.com/users/timmartin/repos", "events_url": "https://api.github.com/users/timmartin/events{/privacy}", "received_events_url": "https://api.github.com/users/timmartin/received_events", "type": "User", "site_admin": false, "contributions": 4 }, { "login": "cgibin", "id": 17925418, "node_id": "MDQ6VXNlcjE3OTI1NDE4", "avatar_url": "https://avatars.githubusercontent.com/u/17925418?v=4", "gravatar_id": "", "url": "https://api.github.com/users/cgibin", "html_url": "https://github.com/cgibin", "followers_url": "https://api.github.com/users/cgibin/followers", "following_url": "https://api.github.com/users/cgibin/following{/other_user}", "gists_url": "https://api.github.com/users/cgibin/gists{/gist_id}", "starred_url": "https://api.github.com/users/cgibin/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/cgibin/subscriptions", "organizations_url": "https://api.github.com/users/cgibin/orgs", "repos_url": "https://api.github.com/users/cgibin/repos", "events_url": "https://api.github.com/users/cgibin/events{/privacy}", "received_events_url": "https://api.github.com/users/cgibin/received_events", "type": "User", "site_admin": false, "contributions": 4 }, { "login": "Lanzaa", "id": 240881, "node_id": "MDQ6VXNlcjI0MDg4MQ==", "avatar_url": "https://avatars.githubusercontent.com/u/240881?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Lanzaa", "html_url": "https://github.com/Lanzaa", "followers_url": "https://api.github.com/users/Lanzaa/followers", "following_url": "https://api.github.com/users/Lanzaa/following{/other_user}", "gists_url": "https://api.github.com/users/Lanzaa/gists{/gist_id}", "starred_url": "https://api.github.com/users/Lanzaa/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Lanzaa/subscriptions", "organizations_url": "https://api.github.com/users/Lanzaa/orgs", "repos_url": "https://api.github.com/users/Lanzaa/repos", "events_url": "https://api.github.com/users/Lanzaa/events{/privacy}", "received_events_url": "https://api.github.com/users/Lanzaa/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "Dandandan", "id": 163737, "node_id": "MDQ6VXNlcjE2MzczNw==", "avatar_url": "https://avatars.githubusercontent.com/u/163737?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Dandandan", "html_url": "https://github.com/Dandandan", "followers_url": "https://api.github.com/users/Dandandan/followers", "following_url": "https://api.github.com/users/Dandandan/following{/other_user}", "gists_url": "https://api.github.com/users/Dandandan/gists{/gist_id}", "starred_url": "https://api.github.com/users/Dandandan/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Dandandan/subscriptions", "organizations_url": "https://api.github.com/users/Dandandan/orgs", "repos_url": "https://api.github.com/users/Dandandan/repos", "events_url": "https://api.github.com/users/Dandandan/events{/privacy}", "received_events_url": "https://api.github.com/users/Dandandan/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "Lalaland", "id": 342233, "node_id": "MDQ6VXNlcjM0MjIzMw==", "avatar_url": "https://avatars.githubusercontent.com/u/342233?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Lalaland", "html_url": "https://github.com/Lalaland", "followers_url": "https://api.github.com/users/Lalaland/followers", "following_url": "https://api.github.com/users/Lalaland/following{/other_user}", "gists_url": "https://api.github.com/users/Lalaland/gists{/gist_id}", "starred_url": "https://api.github.com/users/Lalaland/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Lalaland/subscriptions", "organizations_url": "https://api.github.com/users/Lalaland/orgs", "repos_url": "https://api.github.com/users/Lalaland/repos", "events_url": "https://api.github.com/users/Lalaland/events{/privacy}", "received_events_url": "https://api.github.com/users/Lalaland/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "harsh183", "id": 7780198, "node_id": "MDQ6VXNlcjc3ODAxOTg=", "avatar_url": "https://avatars.githubusercontent.com/u/7780198?v=4", "gravatar_id": "", "url": "https://api.github.com/users/harsh183", "html_url": "https://github.com/harsh183", "followers_url": "https://api.github.com/users/harsh183/followers", "following_url": "https://api.github.com/users/harsh183/following{/other_user}", "gists_url": "https://api.github.com/users/harsh183/gists{/gist_id}", "starred_url": "https://api.github.com/users/harsh183/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/harsh183/subscriptions", "organizations_url": "https://api.github.com/users/harsh183/orgs", "repos_url": "https://api.github.com/users/harsh183/repos", "events_url": "https://api.github.com/users/harsh183/events{/privacy}", "received_events_url": "https://api.github.com/users/harsh183/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "srdan-bozovic-msft", "id": 5732116, "node_id": "MDQ6VXNlcjU3MzIxMTY=", "avatar_url": "https://avatars.githubusercontent.com/u/5732116?v=4", "gravatar_id": "", "url": "https://api.github.com/users/srdan-bozovic-msft", "html_url": "https://github.com/srdan-bozovic-msft", "followers_url": "https://api.github.com/users/srdan-bozovic-msft/followers", "following_url": "https://api.github.com/users/srdan-bozovic-msft/following{/other_user}", "gists_url": "https://api.github.com/users/srdan-bozovic-msft/gists{/gist_id}", "starred_url": "https://api.github.com/users/srdan-bozovic-msft/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/srdan-bozovic-msft/subscriptions", "organizations_url": "https://api.github.com/users/srdan-bozovic-msft/orgs", "repos_url": "https://api.github.com/users/srdan-bozovic-msft/repos", "events_url": "https://api.github.com/users/srdan-bozovic-msft/events{/privacy}", "received_events_url": "https://api.github.com/users/srdan-bozovic-msft/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "mrshu", "id": 461491, "node_id": "MDQ6VXNlcjQ2MTQ5MQ==", "avatar_url": "https://avatars.githubusercontent.com/u/461491?v=4", "gravatar_id": "", "url": "https://api.github.com/users/mrshu", "html_url": "https://github.com/mrshu", "followers_url": "https://api.github.com/users/mrshu/followers", "following_url": "https://api.github.com/users/mrshu/following{/other_user}", "gists_url": "https://api.github.com/users/mrshu/gists{/gist_id}", "starred_url": "https://api.github.com/users/mrshu/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mrshu/subscriptions", "organizations_url": "https://api.github.com/users/mrshu/orgs", "repos_url": "https://api.github.com/users/mrshu/repos", "events_url": "https://api.github.com/users/mrshu/events{/privacy}", "received_events_url": "https://api.github.com/users/mrshu/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "Jeff-Tian", "id": 3367820, "node_id": "MDQ6VXNlcjMzNjc4MjA=", "avatar_url": "https://avatars.githubusercontent.com/u/3367820?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Jeff-Tian", "html_url": "https://github.com/Jeff-Tian", "followers_url": "https://api.github.com/users/Jeff-Tian/followers", "following_url": "https://api.github.com/users/Jeff-Tian/following{/other_user}", "gists_url": "https://api.github.com/users/Jeff-Tian/gists{/gist_id}", "starred_url": "https://api.github.com/users/Jeff-Tian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Jeff-Tian/subscriptions", "organizations_url": "https://api.github.com/users/Jeff-Tian/orgs", "repos_url": "https://api.github.com/users/Jeff-Tian/repos", "events_url": "https://api.github.com/users/Jeff-Tian/events{/privacy}", "received_events_url": "https://api.github.com/users/Jeff-Tian/received_events", "type": "User", "site_admin": false, "contributions": 3 }, { "login": "bjpirt", "id": 186499, "node_id": "MDQ6VXNlcjE4NjQ5OQ==", "avatar_url": "https://avatars.githubusercontent.com/u/186499?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bjpirt", "html_url": "https://github.com/bjpirt", "followers_url": "https://api.github.com/users/bjpirt/followers", "following_url": "https://api.github.com/users/bjpirt/following{/other_user}", "gists_url": "https://api.github.com/users/bjpirt/gists{/gist_id}", "starred_url": "https://api.github.com/users/bjpirt/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bjpirt/subscriptions", "organizations_url": "https://api.github.com/users/bjpirt/orgs", "repos_url": "https://api.github.com/users/bjpirt/repos", "events_url": "https://api.github.com/users/bjpirt/events{/privacy}", "received_events_url": "https://api.github.com/users/bjpirt/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "pinkfoot", "id": 3594765, "node_id": "MDQ6VXNlcjM1OTQ3NjU=", "avatar_url": "https://avatars.githubusercontent.com/u/3594765?v=4", "gravatar_id": "", "url": "https://api.github.com/users/pinkfoot", "html_url": "https://github.com/pinkfoot", "followers_url": "https://api.github.com/users/pinkfoot/followers", "following_url": "https://api.github.com/users/pinkfoot/following{/other_user}", "gists_url": "https://api.github.com/users/pinkfoot/gists{/gist_id}", "starred_url": "https://api.github.com/users/pinkfoot/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/pinkfoot/subscriptions", "organizations_url": "https://api.github.com/users/pinkfoot/orgs", "repos_url": "https://api.github.com/users/pinkfoot/repos", "events_url": "https://api.github.com/users/pinkfoot/events{/privacy}", "received_events_url": "https://api.github.com/users/pinkfoot/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "bnmtest", "id": 9487990, "node_id": "MDQ6VXNlcjk0ODc5OTA=", "avatar_url": "https://avatars.githubusercontent.com/u/9487990?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bnmtest", "html_url": "https://github.com/bnmtest", "followers_url": "https://api.github.com/users/bnmtest/followers", "following_url": "https://api.github.com/users/bnmtest/following{/other_user}", "gists_url": "https://api.github.com/users/bnmtest/gists{/gist_id}", "starred_url": "https://api.github.com/users/bnmtest/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bnmtest/subscriptions", "organizations_url": "https://api.github.com/users/bnmtest/orgs", "repos_url": "https://api.github.com/users/bnmtest/repos", "events_url": "https://api.github.com/users/bnmtest/events{/privacy}", "received_events_url": "https://api.github.com/users/bnmtest/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "schellenberg", "id": 227656, "node_id": "MDQ6VXNlcjIyNzY1Ng==", "avatar_url": "https://avatars.githubusercontent.com/u/227656?v=4", "gravatar_id": "", "url": "https://api.github.com/users/schellenberg", "html_url": "https://github.com/schellenberg", "followers_url": "https://api.github.com/users/schellenberg/followers", "following_url": "https://api.github.com/users/schellenberg/following{/other_user}", "gists_url": "https://api.github.com/users/schellenberg/gists{/gist_id}", "starred_url": "https://api.github.com/users/schellenberg/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/schellenberg/subscriptions", "organizations_url": "https://api.github.com/users/schellenberg/orgs", "repos_url": "https://api.github.com/users/schellenberg/repos", "events_url": "https://api.github.com/users/schellenberg/events{/privacy}", "received_events_url": "https://api.github.com/users/schellenberg/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "dsblank", "id": 168568, "node_id": "MDQ6VXNlcjE2ODU2OA==", "avatar_url": "https://avatars.githubusercontent.com/u/168568?v=4", "gravatar_id": "", "url": "https://api.github.com/users/dsblank", "html_url": "https://github.com/dsblank", "followers_url": "https://api.github.com/users/dsblank/followers", "following_url": "https://api.github.com/users/dsblank/following{/other_user}", "gists_url": "https://api.github.com/users/dsblank/gists{/gist_id}", "starred_url": "https://api.github.com/users/dsblank/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/dsblank/subscriptions", "organizations_url": "https://api.github.com/users/dsblank/orgs", "repos_url": "https://api.github.com/users/dsblank/repos", "events_url": "https://api.github.com/users/dsblank/events{/privacy}", "received_events_url": "https://api.github.com/users/dsblank/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "fsladkey", "id": 12353283, "node_id": "MDQ6VXNlcjEyMzUzMjgz", "avatar_url": "https://avatars.githubusercontent.com/u/12353283?v=4", "gravatar_id": "", "url": "https://api.github.com/users/fsladkey", "html_url": "https://github.com/fsladkey", "followers_url": "https://api.github.com/users/fsladkey/followers", "following_url": "https://api.github.com/users/fsladkey/following{/other_user}", "gists_url": "https://api.github.com/users/fsladkey/gists{/gist_id}", "starred_url": "https://api.github.com/users/fsladkey/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/fsladkey/subscriptions", "organizations_url": "https://api.github.com/users/fsladkey/orgs", "repos_url": "https://api.github.com/users/fsladkey/repos", "events_url": "https://api.github.com/users/fsladkey/events{/privacy}", "received_events_url": "https://api.github.com/users/fsladkey/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "iblech", "id": 3661115, "node_id": "MDQ6VXNlcjM2NjExMTU=", "avatar_url": "https://avatars.githubusercontent.com/u/3661115?v=4", "gravatar_id": "", "url": "https://api.github.com/users/iblech", "html_url": "https://github.com/iblech", "followers_url": "https://api.github.com/users/iblech/followers", "following_url": "https://api.github.com/users/iblech/following{/other_user}", "gists_url": "https://api.github.com/users/iblech/gists{/gist_id}", "starred_url": "https://api.github.com/users/iblech/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/iblech/subscriptions", "organizations_url": "https://api.github.com/users/iblech/orgs", "repos_url": "https://api.github.com/users/iblech/repos", "events_url": "https://api.github.com/users/iblech/events{/privacy}", "received_events_url": "https://api.github.com/users/iblech/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "jedevc", "id": 7352848, "node_id": "MDQ6VXNlcjczNTI4NDg=", "avatar_url": "https://avatars.githubusercontent.com/u/7352848?v=4", "gravatar_id": "", "url": "https://api.github.com/users/jedevc", "html_url": "https://github.com/jedevc", "followers_url": "https://api.github.com/users/jedevc/followers", "following_url": "https://api.github.com/users/jedevc/following{/other_user}", "gists_url": "https://api.github.com/users/jedevc/gists{/gist_id}", "starred_url": "https://api.github.com/users/jedevc/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/jedevc/subscriptions", "organizations_url": "https://api.github.com/users/jedevc/orgs", "repos_url": "https://api.github.com/users/jedevc/repos", "events_url": "https://api.github.com/users/jedevc/events{/privacy}", "received_events_url": "https://api.github.com/users/jedevc/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "pbharrin", "id": 490809, "node_id": "MDQ6VXNlcjQ5MDgwOQ==", "avatar_url": "https://avatars.githubusercontent.com/u/490809?v=4", "gravatar_id": "", "url": "https://api.github.com/users/pbharrin", "html_url": "https://github.com/pbharrin", "followers_url": "https://api.github.com/users/pbharrin/followers", "following_url": "https://api.github.com/users/pbharrin/following{/other_user}", "gists_url": "https://api.github.com/users/pbharrin/gists{/gist_id}", "starred_url": "https://api.github.com/users/pbharrin/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/pbharrin/subscriptions", "organizations_url": "https://api.github.com/users/pbharrin/orgs", "repos_url": "https://api.github.com/users/pbharrin/repos", "events_url": "https://api.github.com/users/pbharrin/events{/privacy}", "received_events_url": "https://api.github.com/users/pbharrin/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "d4rkb1ue", "id": 7615326, "node_id": "MDQ6VXNlcjc2MTUzMjY=", "avatar_url": "https://avatars.githubusercontent.com/u/7615326?v=4", "gravatar_id": "", "url": "https://api.github.com/users/d4rkb1ue", "html_url": "https://github.com/d4rkb1ue", "followers_url": "https://api.github.com/users/d4rkb1ue/followers", "following_url": "https://api.github.com/users/d4rkb1ue/following{/other_user}", "gists_url": "https://api.github.com/users/d4rkb1ue/gists{/gist_id}", "starred_url": "https://api.github.com/users/d4rkb1ue/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/d4rkb1ue/subscriptions", "organizations_url": "https://api.github.com/users/d4rkb1ue/orgs", "repos_url": "https://api.github.com/users/d4rkb1ue/repos", "events_url": "https://api.github.com/users/d4rkb1ue/events{/privacy}", "received_events_url": "https://api.github.com/users/d4rkb1ue/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "danbornside", "id": 163600, "node_id": "MDQ6VXNlcjE2MzYwMA==", "avatar_url": "https://avatars.githubusercontent.com/u/163600?v=4", "gravatar_id": "", "url": "https://api.github.com/users/danbornside", "html_url": "https://github.com/danbornside", "followers_url": "https://api.github.com/users/danbornside/followers", "following_url": "https://api.github.com/users/danbornside/following{/other_user}", "gists_url": "https://api.github.com/users/danbornside/gists{/gist_id}", "starred_url": "https://api.github.com/users/danbornside/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/danbornside/subscriptions", "organizations_url": "https://api.github.com/users/danbornside/orgs", "repos_url": "https://api.github.com/users/danbornside/repos", "events_url": "https://api.github.com/users/danbornside/events{/privacy}", "received_events_url": "https://api.github.com/users/danbornside/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "ericsonga", "id": 1844609, "node_id": "MDQ6VXNlcjE4NDQ2MDk=", "avatar_url": "https://avatars.githubusercontent.com/u/1844609?v=4", "gravatar_id": "", "url": "https://api.github.com/users/ericsonga", "html_url": "https://github.com/ericsonga", "followers_url": "https://api.github.com/users/ericsonga/followers", "following_url": "https://api.github.com/users/ericsonga/following{/other_user}", "gists_url": "https://api.github.com/users/ericsonga/gists{/gist_id}", "starred_url": "https://api.github.com/users/ericsonga/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/ericsonga/subscriptions", "organizations_url": "https://api.github.com/users/ericsonga/orgs", "repos_url": "https://api.github.com/users/ericsonga/repos", "events_url": "https://api.github.com/users/ericsonga/events{/privacy}", "received_events_url": "https://api.github.com/users/ericsonga/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "daviesian", "id": 488684, "node_id": "MDQ6VXNlcjQ4ODY4NA==", "avatar_url": "https://avatars.githubusercontent.com/u/488684?v=4", "gravatar_id": "", "url": "https://api.github.com/users/daviesian", "html_url": "https://github.com/daviesian", "followers_url": "https://api.github.com/users/daviesian/followers", "following_url": "https://api.github.com/users/daviesian/following{/other_user}", "gists_url": "https://api.github.com/users/daviesian/gists{/gist_id}", "starred_url": "https://api.github.com/users/daviesian/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/daviesian/subscriptions", "organizations_url": "https://api.github.com/users/daviesian/orgs", "repos_url": "https://api.github.com/users/daviesian/repos", "events_url": "https://api.github.com/users/daviesian/events{/privacy}", "received_events_url": "https://api.github.com/users/daviesian/received_events", "type": "User", "site_admin": false, "contributions": 2 }, { "login": "chhabrakadabra", "id": 773452, "node_id": "MDQ6VXNlcjc3MzQ1Mg==", "avatar_url": "https://avatars.githubusercontent.com/u/773452?v=4", "gravatar_id": "", "url": "https://api.github.com/users/chhabrakadabra", "html_url": "https://github.com/chhabrakadabra", "followers_url": "https://api.github.com/users/chhabrakadabra/followers", "following_url": "https://api.github.com/users/chhabrakadabra/following{/other_user}", "gists_url": "https://api.github.com/users/chhabrakadabra/gists{/gist_id}", "starred_url": "https://api.github.com/users/chhabrakadabra/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/chhabrakadabra/subscriptions", "organizations_url": "https://api.github.com/users/chhabrakadabra/orgs", "repos_url": "https://api.github.com/users/chhabrakadabra/repos", "events_url": "https://api.github.com/users/chhabrakadabra/events{/privacy}", "received_events_url": "https://api.github.com/users/chhabrakadabra/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "amasad", "id": 587518, "node_id": "MDQ6VXNlcjU4NzUxOA==", "avatar_url": "https://avatars.githubusercontent.com/u/587518?v=4", "gravatar_id": "", "url": "https://api.github.com/users/amasad", "html_url": "https://github.com/amasad", "followers_url": "https://api.github.com/users/amasad/followers", "following_url": "https://api.github.com/users/amasad/following{/other_user}", "gists_url": "https://api.github.com/users/amasad/gists{/gist_id}", "starred_url": "https://api.github.com/users/amasad/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/amasad/subscriptions", "organizations_url": "https://api.github.com/users/amasad/orgs", "repos_url": "https://api.github.com/users/amasad/repos", "events_url": "https://api.github.com/users/amasad/events{/privacy}", "received_events_url": "https://api.github.com/users/amasad/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "bhavayAnand9", "id": 34943807, "node_id": "MDQ6VXNlcjM0OTQzODA3", "avatar_url": "https://avatars.githubusercontent.com/u/34943807?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bhavayAnand9", "html_url": "https://github.com/bhavayAnand9", "followers_url": "https://api.github.com/users/bhavayAnand9/followers", "following_url": "https://api.github.com/users/bhavayAnand9/following{/other_user}", "gists_url": "https://api.github.com/users/bhavayAnand9/gists{/gist_id}", "starred_url": "https://api.github.com/users/bhavayAnand9/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bhavayAnand9/subscriptions", "organizations_url": "https://api.github.com/users/bhavayAnand9/orgs", "repos_url": "https://api.github.com/users/bhavayAnand9/repos", "events_url": "https://api.github.com/users/bhavayAnand9/events{/privacy}", "received_events_url": "https://api.github.com/users/bhavayAnand9/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "Rosuav", "id": 640535, "node_id": "MDQ6VXNlcjY0MDUzNQ==", "avatar_url": "https://avatars.githubusercontent.com/u/640535?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Rosuav", "html_url": "https://github.com/Rosuav", "followers_url": "https://api.github.com/users/Rosuav/followers", "following_url": "https://api.github.com/users/Rosuav/following{/other_user}", "gists_url": "https://api.github.com/users/Rosuav/gists{/gist_id}", "starred_url": "https://api.github.com/users/Rosuav/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Rosuav/subscriptions", "organizations_url": "https://api.github.com/users/Rosuav/orgs", "repos_url": "https://api.github.com/users/Rosuav/repos", "events_url": "https://api.github.com/users/Rosuav/events{/privacy}", "received_events_url": "https://api.github.com/users/Rosuav/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "cskau-g", "id": 8520548, "node_id": "MDQ6VXNlcjg1MjA1NDg=", "avatar_url": "https://avatars.githubusercontent.com/u/8520548?v=4", "gravatar_id": "", "url": "https://api.github.com/users/cskau-g", "html_url": "https://github.com/cskau-g", "followers_url": "https://api.github.com/users/cskau-g/followers", "following_url": "https://api.github.com/users/cskau-g/following{/other_user}", "gists_url": "https://api.github.com/users/cskau-g/gists{/gist_id}", "starred_url": "https://api.github.com/users/cskau-g/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/cskau-g/subscriptions", "organizations_url": "https://api.github.com/users/cskau-g/orgs", "repos_url": "https://api.github.com/users/cskau-g/repos", "events_url": "https://api.github.com/users/cskau-g/events{/privacy}", "received_events_url": "https://api.github.com/users/cskau-g/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "dmaciejak", "id": 2658335, "node_id": "MDQ6VXNlcjI2NTgzMzU=", "avatar_url": "https://avatars.githubusercontent.com/u/2658335?v=4", "gravatar_id": "", "url": "https://api.github.com/users/dmaciejak", "html_url": "https://github.com/dmaciejak", "followers_url": "https://api.github.com/users/dmaciejak/followers", "following_url": "https://api.github.com/users/dmaciejak/following{/other_user}", "gists_url": "https://api.github.com/users/dmaciejak/gists{/gist_id}", "starred_url": "https://api.github.com/users/dmaciejak/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/dmaciejak/subscriptions", "organizations_url": "https://api.github.com/users/dmaciejak/orgs", "repos_url": "https://api.github.com/users/dmaciejak/repos", "events_url": "https://api.github.com/users/dmaciejak/events{/privacy}", "received_events_url": "https://api.github.com/users/dmaciejak/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "hjiawei", "id": 7075046, "node_id": "MDQ6VXNlcjcwNzUwNDY=", "avatar_url": "https://avatars.githubusercontent.com/u/7075046?v=4", "gravatar_id": "", "url": "https://api.github.com/users/hjiawei", "html_url": "https://github.com/hjiawei", "followers_url": "https://api.github.com/users/hjiawei/followers", "following_url": "https://api.github.com/users/hjiawei/following{/other_user}", "gists_url": "https://api.github.com/users/hjiawei/gists{/gist_id}", "starred_url": "https://api.github.com/users/hjiawei/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/hjiawei/subscriptions", "organizations_url": "https://api.github.com/users/hjiawei/orgs", "repos_url": "https://api.github.com/users/hjiawei/repos", "events_url": "https://api.github.com/users/hjiawei/events{/privacy}", "received_events_url": "https://api.github.com/users/hjiawei/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "Lifan1998", "id": 34120416, "node_id": "MDQ6VXNlcjM0MTIwNDE2", "avatar_url": "https://avatars.githubusercontent.com/u/34120416?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Lifan1998", "html_url": "https://github.com/Lifan1998", "followers_url": "https://api.github.com/users/Lifan1998/followers", "following_url": "https://api.github.com/users/Lifan1998/following{/other_user}", "gists_url": "https://api.github.com/users/Lifan1998/gists{/gist_id}", "starred_url": "https://api.github.com/users/Lifan1998/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Lifan1998/subscriptions", "organizations_url": "https://api.github.com/users/Lifan1998/orgs", "repos_url": "https://api.github.com/users/Lifan1998/repos", "events_url": "https://api.github.com/users/Lifan1998/events{/privacy}", "received_events_url": "https://api.github.com/users/Lifan1998/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "ludwiktrammer", "id": 5337669, "node_id": "MDQ6VXNlcjUzMzc2Njk=", "avatar_url": "https://avatars.githubusercontent.com/u/5337669?v=4", "gravatar_id": "", "url": "https://api.github.com/users/ludwiktrammer", "html_url": "https://github.com/ludwiktrammer", "followers_url": "https://api.github.com/users/ludwiktrammer/followers", "following_url": "https://api.github.com/users/ludwiktrammer/following{/other_user}", "gists_url": "https://api.github.com/users/ludwiktrammer/gists{/gist_id}", "starred_url": "https://api.github.com/users/ludwiktrammer/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/ludwiktrammer/subscriptions", "organizations_url": "https://api.github.com/users/ludwiktrammer/orgs", "repos_url": "https://api.github.com/users/ludwiktrammer/repos", "events_url": "https://api.github.com/users/ludwiktrammer/events{/privacy}", "received_events_url": "https://api.github.com/users/ludwiktrammer/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "Kaworru", "id": 1611601, "node_id": "MDQ6VXNlcjE2MTE2MDE=", "avatar_url": "https://avatars.githubusercontent.com/u/1611601?v=4", "gravatar_id": "", "url": "https://api.github.com/users/Kaworru", "html_url": "https://github.com/Kaworru", "followers_url": "https://api.github.com/users/Kaworru/followers", "following_url": "https://api.github.com/users/Kaworru/following{/other_user}", "gists_url": "https://api.github.com/users/Kaworru/gists{/gist_id}", "starred_url": "https://api.github.com/users/Kaworru/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/Kaworru/subscriptions", "organizations_url": "https://api.github.com/users/Kaworru/orgs", "repos_url": "https://api.github.com/users/Kaworru/repos", "events_url": "https://api.github.com/users/Kaworru/events{/privacy}", "received_events_url": "https://api.github.com/users/Kaworru/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "mblockelet", "id": 11016337, "node_id": "MDQ6VXNlcjExMDE2MzM3", "avatar_url": "https://avatars.githubusercontent.com/u/11016337?v=4", "gravatar_id": "", "url": "https://api.github.com/users/mblockelet", "html_url": "https://github.com/mblockelet", "followers_url": "https://api.github.com/users/mblockelet/followers", "following_url": "https://api.github.com/users/mblockelet/following{/other_user}", "gists_url": "https://api.github.com/users/mblockelet/gists{/gist_id}", "starred_url": "https://api.github.com/users/mblockelet/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/mblockelet/subscriptions", "organizations_url": "https://api.github.com/users/mblockelet/orgs", "repos_url": "https://api.github.com/users/mblockelet/repos", "events_url": "https://api.github.com/users/mblockelet/events{/privacy}", "received_events_url": "https://api.github.com/users/mblockelet/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "vasiljevic", "id": 10418572, "node_id": "MDQ6VXNlcjEwNDE4NTcy", "avatar_url": "https://avatars.githubusercontent.com/u/10418572?v=4", "gravatar_id": "", "url": "https://api.github.com/users/vasiljevic", "html_url": "https://github.com/vasiljevic", "followers_url": "https://api.github.com/users/vasiljevic/followers", "following_url": "https://api.github.com/users/vasiljevic/following{/other_user}", "gists_url": "https://api.github.com/users/vasiljevic/gists{/gist_id}", "starred_url": "https://api.github.com/users/vasiljevic/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/vasiljevic/subscriptions", "organizations_url": "https://api.github.com/users/vasiljevic/orgs", "repos_url": "https://api.github.com/users/vasiljevic/repos", "events_url": "https://api.github.com/users/vasiljevic/events{/privacy}", "received_events_url": "https://api.github.com/users/vasiljevic/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "oliver-ni", "id": 20295134, "node_id": "MDQ6VXNlcjIwMjk1MTM0", "avatar_url": "https://avatars.githubusercontent.com/u/20295134?v=4", "gravatar_id": "", "url": "https://api.github.com/users/oliver-ni", "html_url": "https://github.com/oliver-ni", "followers_url": "https://api.github.com/users/oliver-ni/followers", "following_url": "https://api.github.com/users/oliver-ni/following{/other_user}", "gists_url": "https://api.github.com/users/oliver-ni/gists{/gist_id}", "starred_url": "https://api.github.com/users/oliver-ni/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/oliver-ni/subscriptions", "organizations_url": "https://api.github.com/users/oliver-ni/orgs", "repos_url": "https://api.github.com/users/oliver-ni/repos", "events_url": "https://api.github.com/users/oliver-ni/events{/privacy}", "received_events_url": "https://api.github.com/users/oliver-ni/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "orionz", "id": 15224, "node_id": "MDQ6VXNlcjE1MjI0", "avatar_url": "https://avatars.githubusercontent.com/u/15224?v=4", "gravatar_id": "", "url": "https://api.github.com/users/orionz", "html_url": "https://github.com/orionz", "followers_url": "https://api.github.com/users/orionz/followers", "following_url": "https://api.github.com/users/orionz/following{/other_user}", "gists_url": "https://api.github.com/users/orionz/gists{/gist_id}", "starred_url": "https://api.github.com/users/orionz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/orionz/subscriptions", "organizations_url": "https://api.github.com/users/orionz/orgs", "repos_url": "https://api.github.com/users/orionz/repos", "events_url": "https://api.github.com/users/orionz/events{/privacy}", "received_events_url": "https://api.github.com/users/orionz/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "paulmasson", "id": 3289562, "node_id": "MDQ6VXNlcjMyODk1NjI=", "avatar_url": "https://avatars.githubusercontent.com/u/3289562?v=4", "gravatar_id": "", "url": "https://api.github.com/users/paulmasson", "html_url": "https://github.com/paulmasson", "followers_url": "https://api.github.com/users/paulmasson/followers", "following_url": "https://api.github.com/users/paulmasson/following{/other_user}", "gists_url": "https://api.github.com/users/paulmasson/gists{/gist_id}", "starred_url": "https://api.github.com/users/paulmasson/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/paulmasson/subscriptions", "organizations_url": "https://api.github.com/users/paulmasson/orgs", "repos_url": "https://api.github.com/users/paulmasson/repos", "events_url": "https://api.github.com/users/paulmasson/events{/privacy}", "received_events_url": "https://api.github.com/users/paulmasson/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "sgraham", "id": 1822, "node_id": "MDQ6VXNlcjE4MjI=", "avatar_url": "https://avatars.githubusercontent.com/u/1822?v=4", "gravatar_id": "", "url": "https://api.github.com/users/sgraham", "html_url": "https://github.com/sgraham", "followers_url": "https://api.github.com/users/sgraham/followers", "following_url": "https://api.github.com/users/sgraham/following{/other_user}", "gists_url": "https://api.github.com/users/sgraham/gists{/gist_id}", "starred_url": "https://api.github.com/users/sgraham/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/sgraham/subscriptions", "organizations_url": "https://api.github.com/users/sgraham/orgs", "repos_url": "https://api.github.com/users/sgraham/repos", "events_url": "https://api.github.com/users/sgraham/events{/privacy}", "received_events_url": "https://api.github.com/users/sgraham/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "tarjeiba", "id": 6142182, "node_id": "MDQ6VXNlcjYxNDIxODI=", "avatar_url": "https://avatars.githubusercontent.com/u/6142182?v=4", "gravatar_id": "", "url": "https://api.github.com/users/tarjeiba", "html_url": "https://github.com/tarjeiba", "followers_url": "https://api.github.com/users/tarjeiba/followers", "following_url": "https://api.github.com/users/tarjeiba/following{/other_user}", "gists_url": "https://api.github.com/users/tarjeiba/gists{/gist_id}", "starred_url": "https://api.github.com/users/tarjeiba/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tarjeiba/subscriptions", "organizations_url": "https://api.github.com/users/tarjeiba/orgs", "repos_url": "https://api.github.com/users/tarjeiba/repos", "events_url": "https://api.github.com/users/tarjeiba/events{/privacy}", "received_events_url": "https://api.github.com/users/tarjeiba/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "tahteche", "id": 6853998, "node_id": "MDQ6VXNlcjY4NTM5OTg=", "avatar_url": "https://avatars.githubusercontent.com/u/6853998?v=4", "gravatar_id": "", "url": "https://api.github.com/users/tahteche", "html_url": "https://github.com/tahteche", "followers_url": "https://api.github.com/users/tahteche/followers", "following_url": "https://api.github.com/users/tahteche/following{/other_user}", "gists_url": "https://api.github.com/users/tahteche/gists{/gist_id}", "starred_url": "https://api.github.com/users/tahteche/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tahteche/subscriptions", "organizations_url": "https://api.github.com/users/tahteche/orgs", "repos_url": "https://api.github.com/users/tahteche/repos", "events_url": "https://api.github.com/users/tahteche/events{/privacy}", "received_events_url": "https://api.github.com/users/tahteche/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "gitter-badger", "id": 8518239, "node_id": "MDQ6VXNlcjg1MTgyMzk=", "avatar_url": "https://avatars.githubusercontent.com/u/8518239?v=4", "gravatar_id": "", "url": "https://api.github.com/users/gitter-badger", "html_url": "https://github.com/gitter-badger", "followers_url": "https://api.github.com/users/gitter-badger/followers", "following_url": "https://api.github.com/users/gitter-badger/following{/other_user}", "gists_url": "https://api.github.com/users/gitter-badger/gists{/gist_id}", "starred_url": "https://api.github.com/users/gitter-badger/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/gitter-badger/subscriptions", "organizations_url": "https://api.github.com/users/gitter-badger/orgs", "repos_url": "https://api.github.com/users/gitter-badger/repos", "events_url": "https://api.github.com/users/gitter-badger/events{/privacy}", "received_events_url": "https://api.github.com/users/gitter-badger/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "torenord", "id": 395169, "node_id": "MDQ6VXNlcjM5NTE2OQ==", "avatar_url": "https://avatars.githubusercontent.com/u/395169?v=4", "gravatar_id": "", "url": "https://api.github.com/users/torenord", "html_url": "https://github.com/torenord", "followers_url": "https://api.github.com/users/torenord/followers", "following_url": "https://api.github.com/users/torenord/following{/other_user}", "gists_url": "https://api.github.com/users/torenord/gists{/gist_id}", "starred_url": "https://api.github.com/users/torenord/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/torenord/subscriptions", "organizations_url": "https://api.github.com/users/torenord/orgs", "repos_url": "https://api.github.com/users/torenord/repos", "events_url": "https://api.github.com/users/torenord/events{/privacy}", "received_events_url": "https://api.github.com/users/torenord/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "zacklukem", "id": 8787486, "node_id": "MDQ6VXNlcjg3ODc0ODY=", "avatar_url": "https://avatars.githubusercontent.com/u/8787486?v=4", "gravatar_id": "", "url": "https://api.github.com/users/zacklukem", "html_url": "https://github.com/zacklukem", "followers_url": "https://api.github.com/users/zacklukem/followers", "following_url": "https://api.github.com/users/zacklukem/following{/other_user}", "gists_url": "https://api.github.com/users/zacklukem/gists{/gist_id}", "starred_url": "https://api.github.com/users/zacklukem/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/zacklukem/subscriptions", "organizations_url": "https://api.github.com/users/zacklukem/orgs", "repos_url": "https://api.github.com/users/zacklukem/repos", "events_url": "https://api.github.com/users/zacklukem/events{/privacy}", "received_events_url": "https://api.github.com/users/zacklukem/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "gruns", "id": 1041265, "node_id": "MDQ6VXNlcjEwNDEyNjU=", "avatar_url": "https://avatars.githubusercontent.com/u/1041265?v=4", "gravatar_id": "", "url": "https://api.github.com/users/gruns", "html_url": "https://github.com/gruns", "followers_url": "https://api.github.com/users/gruns/followers", "following_url": "https://api.github.com/users/gruns/following{/other_user}", "gists_url": "https://api.github.com/users/gruns/gists{/gist_id}", "starred_url": "https://api.github.com/users/gruns/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/gruns/subscriptions", "organizations_url": "https://api.github.com/users/gruns/orgs", "repos_url": "https://api.github.com/users/gruns/repos", "events_url": "https://api.github.com/users/gruns/events{/privacy}", "received_events_url": "https://api.github.com/users/gruns/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "libremente", "id": 25111463, "node_id": "MDQ6VXNlcjI1MTExNDYz", "avatar_url": "https://avatars.githubusercontent.com/u/25111463?v=4", "gravatar_id": "", "url": "https://api.github.com/users/libremente", "html_url": "https://github.com/libremente", "followers_url": "https://api.github.com/users/libremente/followers", "following_url": "https://api.github.com/users/libremente/following{/other_user}", "gists_url": "https://api.github.com/users/libremente/gists{/gist_id}", "starred_url": "https://api.github.com/users/libremente/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/libremente/subscriptions", "organizations_url": "https://api.github.com/users/libremente/orgs", "repos_url": "https://api.github.com/users/libremente/repos", "events_url": "https://api.github.com/users/libremente/events{/privacy}", "received_events_url": "https://api.github.com/users/libremente/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "masterkni666", "id": 19353314, "node_id": "MDQ6VXNlcjE5MzUzMzE0", "avatar_url": "https://avatars.githubusercontent.com/u/19353314?v=4", "gravatar_id": "", "url": "https://api.github.com/users/masterkni666", "html_url": "https://github.com/masterkni666", "followers_url": "https://api.github.com/users/masterkni666/followers", "following_url": "https://api.github.com/users/masterkni666/following{/other_user}", "gists_url": "https://api.github.com/users/masterkni666/gists{/gist_id}", "starred_url": "https://api.github.com/users/masterkni666/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/masterkni666/subscriptions", "organizations_url": "https://api.github.com/users/masterkni666/orgs", "repos_url": "https://api.github.com/users/masterkni666/repos", "events_url": "https://api.github.com/users/masterkni666/events{/privacy}", "received_events_url": "https://api.github.com/users/masterkni666/received_events", "type": "User", "site_admin": false, "contributions": 1 }, { "login": "slobber", "id": 1853799, "node_id": "MDQ6VXNlcjE4NTM3OTk=", "avatar_url": "https://avatars.githubusercontent.com/u/1853799?v=4", "gravatar_id": "", "url": "https://api.github.com/users/slobber", "html_url": "https://github.com/slobber", "followers_url": "https://api.github.com/users/slobber/followers", "following_url": "https://api.github.com/users/slobber/following{/other_user}", "gists_url": "https://api.github.com/users/slobber/gists{/gist_id}", "starred_url": "https://api.github.com/users/slobber/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/slobber/subscriptions", "organizations_url": "https://api.github.com/users/slobber/orgs", "repos_url": "https://api.github.com/users/slobber/repos", "events_url": "https://api.github.com/users/slobber/events{/privacy}", "received_events_url": "https://api.github.com/users/slobber/received_events", "type": "User", "site_admin": false, "contributions": 1 } ], "disabled": false, "environment": "dotcom", "help_url": "https://docs.github.com", "hostname": "github.com", "is_project_page": true, "is_user_page": false, "issues_url": "https://github.com/skulpt/skulpt/issues", "language": "Python", "latest_release": { "url": "https://api.github.com/repos/skulpt/skulpt/releases/38207356", "assets_url": "https://api.github.com/repos/skulpt/skulpt/releases/38207356/assets", "upload_url": "https://uploads.github.com/repos/skulpt/skulpt/releases/38207356/assets{?name,label}", "html_url": "https://github.com/skulpt/skulpt/releases/tag/1.3.0", "id": 38207356, "author": { "login": "s-cork", "id": 36813890, "node_id": "MDQ6VXNlcjM2ODEzODkw", "avatar_url": "https://avatars.githubusercontent.com/u/36813890?v=4", "gravatar_id": "", "url": "https://api.github.com/users/s-cork", "html_url": "https://github.com/s-cork", "followers_url": "https://api.github.com/users/s-cork/followers", "following_url": "https://api.github.com/users/s-cork/following{/other_user}", "gists_url": "https://api.github.com/users/s-cork/gists{/gist_id}", "starred_url": "https://api.github.com/users/s-cork/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/s-cork/subscriptions", "organizations_url": "https://api.github.com/users/s-cork/orgs", "repos_url": "https://api.github.com/users/s-cork/repos", "events_url": "https://api.github.com/users/s-cork/events{/privacy}", "received_events_url": "https://api.github.com/users/s-cork/received_events", "type": "User", "site_admin": false }, "node_id": "MDc6UmVsZWFzZTM4MjA3MzU2", "tag_name": "1.3.0", "target_commitish": "master", "name": "Internal updates and breaking changes", "draft": false, "prerelease": false, "created_at": "2021-02-23 18:56:55 UTC", "published_at": "2021-02-28 13:19:08 UTC", "assets": [ ], "tarball_url": "https://api.github.com/repos/skulpt/skulpt/tarball/1.3.0", "zipball_url": "https://api.github.com/repos/skulpt/skulpt/zipball/1.3.0", "body": "This is a list of changes implemented with this version. Some are internal and others are part of the skulpt API (if we had one 🙂 ).\r\n\r\n\r\n**python 2 incorrectness: (for those still using python 2 in production)**\r\n- `long`\r\n - when adding two long objects the result is likely to be an `int`\r\n- `method`\r\n - unbound methods are no longer supported\r\n- The `base` class for all type objects will be `object` even if the base class is not specified\r\n\r\n\r\n**skulpt api**\r\n- `Sk.builtin.object.prototype.genericGetAttr` -> `Sk.generic.getAttr`\r\n- `Sk.builtin.object.prototype.genericSetAttr` -> `Sk.generic.setAttr`\r\n- `Sk.builtin.type.typeLookup` removed and replaced by `Sk.abstr.typeLookup`\r\n- `biginter.js` replaced by the [jsbi](https://github.com/GoogleChromeLabs/jsbi) library\r\n- `Sk.abstr.inherits` removed - inheritance exclusively dealt with by `Sk.abstr.setUpInheritance`\r\n- `Sk.misceval.objectRepr` returns a js string (previously `Sk.builtin.str`)\r\n- `Sk.__future__.python3` becomes the default. Those wishing to use `python2` must define this in the `Sk.configure` object. \r\n- `Sk.abstr.binary_op_`, `Sk.abstr.binary_iop_`, `Sk.abstr.unary_op_` removed - use `Sk.abstr.numberBinOp`, `Sk.abstr.numberInplaceBinOp`, `Sk.abstr.numberUnaryOp` instead. \r\n\r\n\r\n\r\n**call signatures of builtins**\r\n- `new` is required for (almost) all builtin types\r\n - 3 exceptions - `Sk.builtin.bool`, `Sk.builtin.none`, `Sk.builtin.NotImplemented`\r\n - These 3 will always return their respective constant(s) and are thus not required to be used as constructors. \r\n- Restricted parameters for directly accessing a constructor of an `Sk.builtin` type\r\n- assertion failures raised in dev mode if `new` is not used - if using in production these error will not be raised. This may be a gotcha for anyone using this version.\r\n\r\n\r\n\r\n| type | params | notes |\r\n|---|---|---|\r\n| `Sk.builtin.int_` | `number, JSBI (bigint), string, undefined}` | can also be called with a python object that has `nb$int` defined |\r\n| `Sk.builtin.float_` | `number, undefined` | can also be called with a python object that has `nb$float` defined |\r\n| `Sk.builtin.complex` | `number, number` | |\r\n| `Sk.builtin.list` | `{Array=}` | Array of py objects or can be called with a python iterable|\r\n| `Sk.builtin.tuple` | `{Array=}` | Array of py objects can be called with a python iterable|\r\n| `Sk.builtin.set` | `{Array=}` | Array of py objects or can be called with a python iterable|\r\n| `Sk.builtin.dict` | `{Array=}` | key/value pairs - only python objects |\r\n| `Sk.builtin.str` | `{*}` | |\r\n| `Sk.builtin.bool` | `{*}` | |\r\n\r\nNote that you should only pass a number to the `int` javascript constructor if it's absolute value is less than `Number.MAX_SAFE_INTEGER`. Similarly you should only pass a `JSBI (bigint)` to the int constructor if it's absolute value is larger than `Number.MAX_SAFE_INTEGER`.\r\n\r\n\r\n\r\n\r\n**Major changes**\r\n- All type objects are now callable using their respective `tp$call` methods inherited from `Sk.builtin.type`\r\n- All native type objects will require a `tp$new` and `tp$init` method (maybe inherited by `Sk.builtin.object`)\r\n- All type objects are javascript instances of `Sk.builtin.type`\r\n- All single inherited objects follow javascript inheritance\r\n- All native type objects now have the following and replaces the use of `Sk.builtin.func` for all dunder function/methods.\r\n - `wrapper_descriptors` aka `slot_wrappers`\r\n - `method_descriptors` \r\n - `classmethod_descriptors`\r\n - `getset_descriptors` aka `attributes`/`member_descriptors`\r\n- `Sk.builtin.sk_method` is an alternative to `Sk.builtin.func` and is used by the above `descriptor` types\r\n- mangled names are never passed to the user but instead are an attribute on `Sk.builtin.str` instances as `$mangled`\r\n- `mappingproxy` added\r\n- `$d` removed on all type objects.\r\n- `attributes` of a type object now only appear on the `prototype`. Previously these appeared on both the `type` object and the `prototype`\r\n\r\n\r\n\r\n**Additions**\r\n- `dict`, `set`, `tuple` are suspendible\r\n- `map`, `filter`, `zip`, `reversed`, `enumerate` are suspendible\r\n- `classmethod`, `property`, `staticmethod` have native skulpt implementations\r\n- `super` can now be unbound [see this explanation](https://stackoverflow.com/questions/30190185/how-can-i-use-super-with-one-argument-in-python/30190341#30190341)\r\n- `Sk.builtin.func` objects gain a `qualname` in compile code\r\n- API for building native types \r\n - `Sk.abstr.buildNativeClass`\r\n- `range_iterator` class added\r\n- `reverse` iterators added for `list`, `dict_views`, `range`\r\n- `|` operator valid for `dict`, `dict_keys`, `dict_items`\r\n- `Counter` has number slots added\r\n- python docstrings now work\r\n\r\n**`Sk.abstr.`**\r\n- `objectHash`\r\n- `buildNativeClass`\r\n- `buildIteratorClass`\r\n- `setUpBuiltinMro`\r\n- `setUpMethods`\r\n- `setUpGetSets`\r\n- `setUpSlots`\r\n- `setUpClassMethod`\r\n- `setUpBaseInheritance`\r\n- `setUpModuleMethod`\r\n- `checkNoKwargs`\r\n- `checkNoArgs`\r\n- `checkOneArg`\r\n- `checkArgsLen` \r\n- `copyKeywordsToNamedArgs`\r\n\r\n\r\n**`Sk.generic.`**\r\n- `getAttr`\r\n- `setAttr`\r\n- `new` \r\n- `newMethodDef`\r\n- `iterNextWithArray`\r\n- `iterNextWithArrayCheckSize`\r\n- `iterLengthHintWithArrayMethodDef`\r\n- `iterReverseLengthHintMethodDef`\r\n- `getSetDict`\r\n\r\n**`Sk.misceval.`**\r\n- `asIndex` - will return the internal representation of the integer - or undefined if not indexable - could be a number or a bigint (JSBI) \r\n- `asIndexOrThrow` - does `asIndex` but throws an error if the number is not indexable - with an optional message parameter.\r\n- `asIndexSized` - throws an error if the object is not indexable, returns a Number always, Option to throw an error if the index is larger than `Number.MAX_SAFE_INTEGER`. This is the goto method for most builtins now. \r\n- `Iterator` - a python class that easily wraps an iterator\r\n- `arrayFromIterable` - optional canSuspend implementation that returns an array from a python iterator\r\n- `iterArray` - like `iterFor` but with an array rather than a python iterator\r\n\r\n**`slotdefs.js`**\r\n- contains all the information about mapping slots to dunders and vice versa.\r\n\r\n\r\n\r\n**slot changes**\r\n*only relevant for those developers and those writing slot functions directly - hopefully very few users*\r\n- `mp$length` replaced by `sq$length` in the codebase\r\n- `sq$ass_item`/`sq$ass_slice` replaced with `mp$ass_subscript`\r\n- `nb$nonzero` replaced with `nb$bool` and switch version to py2/py3 takes care of mapping the appropriate dunder method.\r\n- `mp$del_subscript` replaced by `mp$ass_subscript` (as per Cpython)\r\n - deleting vs setting an item is based on the call signature\r\n - `mp$ass_subscript(key, value)` -> set item\r\n - `mp$ass_subscript(key)` -> delete item\r\n- If a dunder func is defined on a user defined class then the slot function is guaranteed. \r\n - e.g. `__len__` defined guarantees `sq$length`. \r\n - A slot function defined by skulpt in this way throws the appropriate errors and converts the return value to the appropriate internal object. \r\n - `sq$length` called internally: `__len__` is called using `Sk.misceval.callsim(OrSuspend)Array`. \r\n - The result is checked to be an `int` and then converted to `number` since `sq$length` expects a `number`.\r\n- `tp$str` removed from some builtins as per Python 3.8 changes\r\n- If `tp$richcompare` is defined - wrapper functions `ob$eq` etc are created - this way `Sk.misceval.richCompareBool` need only check for the existence of an `ob$*` slot. \r\n - in fact - the existence of these slots is guaranteed since they are inherited from `Sk.builtin.object`\r\n- `tp$mro`/`tp$bases` are Js Arrays rather than `Sk.builtin.tuple`\r\n- `tp$str` and `$r` for errors were changed as per Cpython.\r\n- `nb$int_` -> `nb$int`\r\n- `nb$lng` -> `nb$long`\r\n- `nb$float_` -> `nb$float`\r\n- return values for certain slot functions have changed\r\n - `tp$hash` - should return a javascript number less than `Number.MAX_SAFE_INTEGER` can be postive or negative\r\n - `nb$index` - should return a javascript number or BigInt (older browsers should be a JSBI BigInt)\r\n- `tp$name` was removed from instances of `Sk.builtin.func` and `Sk.buitin.method` in favour of `$name` since it's `tp$name` should be the `type name`\r\n\r\n\r\n**flags - only relevant internally**\r\n- `sk$acceptable_as_base_class` used for some type objects\r\n- `sk$object` every skulpt object will have this flag. An easy way to determine if you have a skulpt object or a javascript object\r\n- `hp$type` all instance of `sk$klass` types\r\n- `sk$prototypical` do we need to walk up the MRO or can we just check the `prototype`\r\n- `sk$builtinBase` the most derived base which is a native skulpt class\r\n- `sk$baseClass` builtin classes that are direct children of `object`\r\n\r\n\r\n\r\n\r\n**other internal changes**\r\n- the use of `numPromoteFunc` was removed for performance improvements in the implementation of `Sk.asbtr.numberBinOp`\r\n - It was performance beneficial to leave the promoting to the respective `nb$` slots\r\n - `int` binop slots only deal with instance of `int`\r\n - `float` binop slots deal with instances of `float` and `int`\r\n - `complex` binop slots deal with instances of `complex`, `float` and `int`\r\n- since `long` was effectively removed when a number is larger than `Number.MAX_SAFE_INTEGER` it's `.v` value is a `BigInt`. if `BigInt` is not available in the browser then the `JSBI` library is used to replicate `BigInt` functionality. \r\n- `set` and `frozenset` now share much of their implementation\r\n- `collections` module rewritten using new api\r\n- `itertools` module rewritten using new api - these are now type objects rather than instances of `generator`\r\n- `operator` module rewritten using new api\r\n- `math` module adapted to the new api\r\n- `dict` and `set` throw errors if the objects change size during iteration as per Cpython.\r\n - fully tested\r\n- `Sk.builtin.check*` moved to `src/check.js`\r\n- `number.js` removed\r\n- `numtype.js` removed\r\n- `seqtype.js` removed\r\n- `mp$subscript` should *not* be called by a js object (see changes in `random.js`)\r\n- `quick$lookup` added to `dict.prototype` which is a fast way to lookup up `str` keys\r\n- `dict.prototype.entries` rather than has values that are `arrays` of key value pairs\r\n- `object.prototype.tp$hash` will no longer add `$savedHash_` to the object - instead it uses a javascript map and assigns objects to a random number less than `Number.MAX_SAFE_INTEGER` rather than incrementing the hash value each time. \r\n- `float.prototype.tp$hash` for integers this will be the same value as `Sk.builtin.int.prototype.tp$hash` for non integers this will be a random number less than `Number.MAX_SAFE_INTEGER`. Previously this was the number rounded down - but this creates a lot of collisions. \r\n\r\n" }, "license": { "key": "other", "name": "Other", "spdx_id": "NOASSERTION", "url": null, "node_id": "MDc6TGljZW5zZTA=" }, "organization_members": [ { "login": "albertjan", "id": 301791, "node_id": "MDQ6VXNlcjMwMTc5MQ==", "avatar_url": "https://avatars.githubusercontent.com/u/301791?v=4", "gravatar_id": "", "url": "https://api.github.com/users/albertjan", "html_url": "https://github.com/albertjan", "followers_url": "https://api.github.com/users/albertjan/followers", "following_url": "https://api.github.com/users/albertjan/following{/other_user}", "gists_url": "https://api.github.com/users/albertjan/gists{/gist_id}", "starred_url": "https://api.github.com/users/albertjan/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/albertjan/subscriptions", "organizations_url": "https://api.github.com/users/albertjan/orgs", "repos_url": "https://api.github.com/users/albertjan/repos", "events_url": "https://api.github.com/users/albertjan/events{/privacy}", "received_events_url": "https://api.github.com/users/albertjan/received_events", "type": "User", "site_admin": false } ], "owner": { "avatar_url": "https://avatars.githubusercontent.com/u/5229490?v=4", "bio": null, "blog": null, "collaborators": null, "company": null, "created_at": "2013-08-14 12:14:41 UTC", "description": "A Javascript implementation of Python in the browser for education", "email": null, "followers": 0, "following": 0, "has_organization_projects": true, "has_repository_projects": true, "hireable": null, "html_url": "https://github.com/skulpt", "id": 5229490, "is_verified": false, "location": null, "login": "skulpt", "name": "Skulpt", "node_id": "MDEyOk9yZ2FuaXphdGlvbjUyMjk0OTA=", "public_gists": 0, "public_repos": 2, "type": "Organization", "updated_at": "2015-05-07 07:31:42 UTC" }, "owner_gravatar_url": "https://github.com/skulpt.png", "owner_name": "skulpt", "owner_url": "https://github.com/skulpt", "pages_env": "dotcom", "pages_hostname": "github.io", "private": false, "project_tagline": "Skulpt is a Javascript implementation of the Python programming language", "project_title": "skulpt", "public_repositories": [ { "id": 4512368, "node_id": "MDEwOlJlcG9zaXRvcnk0NTEyMzY4", "name": "skulpt", "full_name": "skulpt/skulpt", "private": false, "owner": { "login": "skulpt", "id": 5229490, "node_id": "MDEyOk9yZ2FuaXphdGlvbjUyMjk0OTA=", "avatar_url": "https://avatars.githubusercontent.com/u/5229490?v=4", "gravatar_id": "", "url": "https://api.github.com/users/skulpt", "html_url": "https://github.com/skulpt", "followers_url": "https://api.github.com/users/skulpt/followers", "following_url": "https://api.github.com/users/skulpt/following{/other_user}", "gists_url": "https://api.github.com/users/skulpt/gists{/gist_id}", "starred_url": "https://api.github.com/users/skulpt/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/skulpt/subscriptions", "organizations_url": "https://api.github.com/users/skulpt/orgs", "repos_url": "https://api.github.com/users/skulpt/repos", "events_url": "https://api.github.com/users/skulpt/events{/privacy}", "received_events_url": "https://api.github.com/users/skulpt/received_events", "type": "Organization", "site_admin": false }, "html_url": "https://github.com/skulpt/skulpt", "description": "Skulpt is a Javascript implementation of the Python programming language", "fork": false, "url": "https://api.github.com/repos/skulpt/skulpt", "forks_url": "https://api.github.com/repos/skulpt/skulpt/forks", "keys_url": "https://api.github.com/repos/skulpt/skulpt/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/skulpt/skulpt/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/skulpt/skulpt/teams", "hooks_url": "https://api.github.com/repos/skulpt/skulpt/hooks", "issue_events_url": "https://api.github.com/repos/skulpt/skulpt/issues/events{/number}", "events_url": "https://api.github.com/repos/skulpt/skulpt/events", "assignees_url": "https://api.github.com/repos/skulpt/skulpt/assignees{/user}", "branches_url": "https://api.github.com/repos/skulpt/skulpt/branches{/branch}", "tags_url": "https://api.github.com/repos/skulpt/skulpt/tags", "blobs_url": "https://api.github.com/repos/skulpt/skulpt/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/skulpt/skulpt/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/skulpt/skulpt/git/refs{/sha}", "trees_url": "https://api.github.com/repos/skulpt/skulpt/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/skulpt/skulpt/statuses/{sha}", "languages_url": "https://api.github.com/repos/skulpt/skulpt/languages", "stargazers_url": "https://api.github.com/repos/skulpt/skulpt/stargazers", "contributors_url": "https://api.github.com/repos/skulpt/skulpt/contributors", "subscribers_url": "https://api.github.com/repos/skulpt/skulpt/subscribers", "subscription_url": "https://api.github.com/repos/skulpt/skulpt/subscription", "commits_url": "https://api.github.com/repos/skulpt/skulpt/commits{/sha}", "git_commits_url": "https://api.github.com/repos/skulpt/skulpt/git/commits{/sha}", "comments_url": "https://api.github.com/repos/skulpt/skulpt/comments{/number}", "issue_comment_url": "https://api.github.com/repos/skulpt/skulpt/issues/comments{/number}", "contents_url": "https://api.github.com/repos/skulpt/skulpt/contents/{+path}", "compare_url": "https://api.github.com/repos/skulpt/skulpt/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/skulpt/skulpt/merges", "archive_url": "https://api.github.com/repos/skulpt/skulpt/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/skulpt/skulpt/downloads", "issues_url": "https://api.github.com/repos/skulpt/skulpt/issues{/number}", "pulls_url": "https://api.github.com/repos/skulpt/skulpt/pulls{/number}", "milestones_url": "https://api.github.com/repos/skulpt/skulpt/milestones{/number}", "notifications_url": "https://api.github.com/repos/skulpt/skulpt/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/skulpt/skulpt/labels{/name}", "releases_url": "https://api.github.com/repos/skulpt/skulpt/releases{/id}", "deployments_url": "https://api.github.com/repos/skulpt/skulpt/deployments", "created_at": "2012-05-31 20:13:13 UTC", "updated_at": "2021-05-16 13:23:01 UTC", "pushed_at": "2021-05-17 12:14:41 UTC", "git_url": "git://github.com/skulpt/skulpt.git", "ssh_url": "git@github.com:skulpt/skulpt.git", "clone_url": "https://github.com/skulpt/skulpt.git", "svn_url": "https://github.com/skulpt/skulpt", "homepage": null, "size": 89098, "stargazers_count": 2990, "watchers_count": 2990, "language": "Python", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": true, "forks_count": 838, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 239, "license": { "key": "other", "name": "Other", "spdx_id": "NOASSERTION", "url": null, "node_id": "MDc6TGljZW5zZTA=" }, "topics": [ ], "forks": 838, "open_issues": 239, "watchers": 2990, "default_branch": "master", "permissions": { "admin": false, "push": false, "pull": false } }, { "id": 12197356, "node_id": "MDEwOlJlcG9zaXRvcnkxMjE5NzM1Ng==", "name": "skulpt-dist", "full_name": "skulpt/skulpt-dist", "private": false, "owner": { "login": "skulpt", "id": 5229490, "node_id": "MDEyOk9yZ2FuaXphdGlvbjUyMjk0OTA=", "avatar_url": "https://avatars.githubusercontent.com/u/5229490?v=4", "gravatar_id": "", "url": "https://api.github.com/users/skulpt", "html_url": "https://github.com/skulpt", "followers_url": "https://api.github.com/users/skulpt/followers", "following_url": "https://api.github.com/users/skulpt/following{/other_user}", "gists_url": "https://api.github.com/users/skulpt/gists{/gist_id}", "starred_url": "https://api.github.com/users/skulpt/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/skulpt/subscriptions", "organizations_url": "https://api.github.com/users/skulpt/orgs", "repos_url": "https://api.github.com/users/skulpt/repos", "events_url": "https://api.github.com/users/skulpt/events{/privacy}", "received_events_url": "https://api.github.com/users/skulpt/received_events", "type": "Organization", "site_admin": false }, "html_url": "https://github.com/skulpt/skulpt-dist", "description": "Skulpt repository to facilitate bower integration.", "fork": false, "url": "https://api.github.com/repos/skulpt/skulpt-dist", "forks_url": "https://api.github.com/repos/skulpt/skulpt-dist/forks", "keys_url": "https://api.github.com/repos/skulpt/skulpt-dist/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/skulpt/skulpt-dist/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/skulpt/skulpt-dist/teams", "hooks_url": "https://api.github.com/repos/skulpt/skulpt-dist/hooks", "issue_events_url": "https://api.github.com/repos/skulpt/skulpt-dist/issues/events{/number}", "events_url": "https://api.github.com/repos/skulpt/skulpt-dist/events", "assignees_url": "https://api.github.com/repos/skulpt/skulpt-dist/assignees{/user}", "branches_url": "https://api.github.com/repos/skulpt/skulpt-dist/branches{/branch}", "tags_url": "https://api.github.com/repos/skulpt/skulpt-dist/tags", "blobs_url": "https://api.github.com/repos/skulpt/skulpt-dist/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/skulpt/skulpt-dist/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/skulpt/skulpt-dist/git/refs{/sha}", "trees_url": "https://api.github.com/repos/skulpt/skulpt-dist/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/skulpt/skulpt-dist/statuses/{sha}", "languages_url": "https://api.github.com/repos/skulpt/skulpt-dist/languages", "stargazers_url": "https://api.github.com/repos/skulpt/skulpt-dist/stargazers", "contributors_url": "https://api.github.com/repos/skulpt/skulpt-dist/contributors", "subscribers_url": "https://api.github.com/repos/skulpt/skulpt-dist/subscribers", "subscription_url": "https://api.github.com/repos/skulpt/skulpt-dist/subscription", "commits_url": "https://api.github.com/repos/skulpt/skulpt-dist/commits{/sha}", "git_commits_url": "https://api.github.com/repos/skulpt/skulpt-dist/git/commits{/sha}", "comments_url": "https://api.github.com/repos/skulpt/skulpt-dist/comments{/number}", "issue_comment_url": "https://api.github.com/repos/skulpt/skulpt-dist/issues/comments{/number}", "contents_url": "https://api.github.com/repos/skulpt/skulpt-dist/contents/{+path}", "compare_url": "https://api.github.com/repos/skulpt/skulpt-dist/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/skulpt/skulpt-dist/merges", "archive_url": "https://api.github.com/repos/skulpt/skulpt-dist/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/skulpt/skulpt-dist/downloads", "issues_url": "https://api.github.com/repos/skulpt/skulpt-dist/issues{/number}", "pulls_url": "https://api.github.com/repos/skulpt/skulpt-dist/pulls{/number}", "milestones_url": "https://api.github.com/repos/skulpt/skulpt-dist/milestones{/number}", "notifications_url": "https://api.github.com/repos/skulpt/skulpt-dist/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/skulpt/skulpt-dist/labels{/name}", "releases_url": "https://api.github.com/repos/skulpt/skulpt-dist/releases{/id}", "deployments_url": "https://api.github.com/repos/skulpt/skulpt-dist/deployments", "created_at": "2013-08-18 15:39:41 UTC", "updated_at": "2021-04-03 00:07:18 UTC", "pushed_at": "2021-02-23 19:00:13 UTC", "git_url": "git://github.com/skulpt/skulpt-dist.git", "ssh_url": "git@github.com:skulpt/skulpt-dist.git", "clone_url": "https://github.com/skulpt/skulpt-dist.git", "svn_url": "https://github.com/skulpt/skulpt-dist", "homepage": null, "size": 25474, "stargazers_count": 18, "watchers_count": 18, "language": "JavaScript", "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 30, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 1, "license": null, "topics": [ ], "forks": 30, "open_issues": 1, "watchers": 18, "default_branch": "master", "permissions": { "admin": false, "push": false, "pull": false } } ], "releases": [ { "url": "https://api.github.com/repos/skulpt/skulpt/releases/38207356", "assets_url": "https://api.github.com/repos/skulpt/skulpt/releases/38207356/assets", "upload_url": "https://uploads.github.com/repos/skulpt/skulpt/releases/38207356/assets{?name,label}", "html_url": "https://github.com/skulpt/skulpt/releases/tag/1.3.0", "id": 38207356, "author": { "login": "s-cork", "id": 36813890, "node_id": "MDQ6VXNlcjM2ODEzODkw", "avatar_url": "https://avatars.githubusercontent.com/u/36813890?v=4", "gravatar_id": "", "url": "https://api.github.com/users/s-cork", "html_url": "https://github.com/s-cork", "followers_url": "https://api.github.com/users/s-cork/followers", "following_url": "https://api.github.com/users/s-cork/following{/other_user}", "gists_url": "https://api.github.com/users/s-cork/gists{/gist_id}", "starred_url": "https://api.github.com/users/s-cork/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/s-cork/subscriptions", "organizations_url": "https://api.github.com/users/s-cork/orgs", "repos_url": "https://api.github.com/users/s-cork/repos", "events_url": "https://api.github.com/users/s-cork/events{/privacy}", "received_events_url": "https://api.github.com/users/s-cork/received_events", "type": "User", "site_admin": false }, "node_id": "MDc6UmVsZWFzZTM4MjA3MzU2", "tag_name": "1.3.0", "target_commitish": "master", "name": "Internal updates and breaking changes", "draft": false, "prerelease": false, "created_at": "2021-02-23 18:56:55 UTC", "published_at": "2021-02-28 13:19:08 UTC", "assets": [ ], "tarball_url": "https://api.github.com/repos/skulpt/skulpt/tarball/1.3.0", "zipball_url": "https://api.github.com/repos/skulpt/skulpt/zipball/1.3.0", "body": "This is a list of changes implemented with this version. Some are internal and others are part of the skulpt API (if we had one 🙂 ).\r\n\r\n\r\n**python 2 incorrectness: (for those still using python 2 in production)**\r\n- `long`\r\n - when adding two long objects the result is likely to be an `int`\r\n- `method`\r\n - unbound methods are no longer supported\r\n- The `base` class for all type objects will be `object` even if the base class is not specified\r\n\r\n\r\n**skulpt api**\r\n- `Sk.builtin.object.prototype.genericGetAttr` -> `Sk.generic.getAttr`\r\n- `Sk.builtin.object.prototype.genericSetAttr` -> `Sk.generic.setAttr`\r\n- `Sk.builtin.type.typeLookup` removed and replaced by `Sk.abstr.typeLookup`\r\n- `biginter.js` replaced by the [jsbi](https://github.com/GoogleChromeLabs/jsbi) library\r\n- `Sk.abstr.inherits` removed - inheritance exclusively dealt with by `Sk.abstr.setUpInheritance`\r\n- `Sk.misceval.objectRepr` returns a js string (previously `Sk.builtin.str`)\r\n- `Sk.__future__.python3` becomes the default. Those wishing to use `python2` must define this in the `Sk.configure` object. \r\n- `Sk.abstr.binary_op_`, `Sk.abstr.binary_iop_`, `Sk.abstr.unary_op_` removed - use `Sk.abstr.numberBinOp`, `Sk.abstr.numberInplaceBinOp`, `Sk.abstr.numberUnaryOp` instead. \r\n\r\n\r\n\r\n**call signatures of builtins**\r\n- `new` is required for (almost) all builtin types\r\n - 3 exceptions - `Sk.builtin.bool`, `Sk.builtin.none`, `Sk.builtin.NotImplemented`\r\n - These 3 will always return their respective constant(s) and are thus not required to be used as constructors. \r\n- Restricted parameters for directly accessing a constructor of an `Sk.builtin` type\r\n- assertion failures raised in dev mode if `new` is not used - if using in production these error will not be raised. This may be a gotcha for anyone using this version.\r\n\r\n\r\n\r\n| type | params | notes |\r\n|---|---|---|\r\n| `Sk.builtin.int_` | `number, JSBI (bigint), string, undefined}` | can also be called with a python object that has `nb$int` defined |\r\n| `Sk.builtin.float_` | `number, undefined` | can also be called with a python object that has `nb$float` defined |\r\n| `Sk.builtin.complex` | `number, number` | |\r\n| `Sk.builtin.list` | `{Array=}` | Array of py objects or can be called with a python iterable|\r\n| `Sk.builtin.tuple` | `{Array=}` | Array of py objects can be called with a python iterable|\r\n| `Sk.builtin.set` | `{Array=}` | Array of py objects or can be called with a python iterable|\r\n| `Sk.builtin.dict` | `{Array=}` | key/value pairs - only python objects |\r\n| `Sk.builtin.str` | `{*}` | |\r\n| `Sk.builtin.bool` | `{*}` | |\r\n\r\nNote that you should only pass a number to the `int` javascript constructor if it's absolute value is less than `Number.MAX_SAFE_INTEGER`. Similarly you should only pass a `JSBI (bigint)` to the int constructor if it's absolute value is larger than `Number.MAX_SAFE_INTEGER`.\r\n\r\n\r\n\r\n\r\n**Major changes**\r\n- All type objects are now callable using their respective `tp$call` methods inherited from `Sk.builtin.type`\r\n- All native type objects will require a `tp$new` and `tp$init` method (maybe inherited by `Sk.builtin.object`)\r\n- All type objects are javascript instances of `Sk.builtin.type`\r\n- All single inherited objects follow javascript inheritance\r\n- All native type objects now have the following and replaces the use of `Sk.builtin.func` for all dunder function/methods.\r\n - `wrapper_descriptors` aka `slot_wrappers`\r\n - `method_descriptors` \r\n - `classmethod_descriptors`\r\n - `getset_descriptors` aka `attributes`/`member_descriptors`\r\n- `Sk.builtin.sk_method` is an alternative to `Sk.builtin.func` and is used by the above `descriptor` types\r\n- mangled names are never passed to the user but instead are an attribute on `Sk.builtin.str` instances as `$mangled`\r\n- `mappingproxy` added\r\n- `$d` removed on all type objects.\r\n- `attributes` of a type object now only appear on the `prototype`. Previously these appeared on both the `type` object and the `prototype`\r\n\r\n\r\n\r\n**Additions**\r\n- `dict`, `set`, `tuple` are suspendible\r\n- `map`, `filter`, `zip`, `reversed`, `enumerate` are suspendible\r\n- `classmethod`, `property`, `staticmethod` have native skulpt implementations\r\n- `super` can now be unbound [see this explanation](https://stackoverflow.com/questions/30190185/how-can-i-use-super-with-one-argument-in-python/30190341#30190341)\r\n- `Sk.builtin.func` objects gain a `qualname` in compile code\r\n- API for building native types \r\n - `Sk.abstr.buildNativeClass`\r\n- `range_iterator` class added\r\n- `reverse` iterators added for `list`, `dict_views`, `range`\r\n- `|` operator valid for `dict`, `dict_keys`, `dict_items`\r\n- `Counter` has number slots added\r\n- python docstrings now work\r\n\r\n**`Sk.abstr.`**\r\n- `objectHash`\r\n- `buildNativeClass`\r\n- `buildIteratorClass`\r\n- `setUpBuiltinMro`\r\n- `setUpMethods`\r\n- `setUpGetSets`\r\n- `setUpSlots`\r\n- `setUpClassMethod`\r\n- `setUpBaseInheritance`\r\n- `setUpModuleMethod`\r\n- `checkNoKwargs`\r\n- `checkNoArgs`\r\n- `checkOneArg`\r\n- `checkArgsLen` \r\n- `copyKeywordsToNamedArgs`\r\n\r\n\r\n**`Sk.generic.`**\r\n- `getAttr`\r\n- `setAttr`\r\n- `new` \r\n- `newMethodDef`\r\n- `iterNextWithArray`\r\n- `iterNextWithArrayCheckSize`\r\n- `iterLengthHintWithArrayMethodDef`\r\n- `iterReverseLengthHintMethodDef`\r\n- `getSetDict`\r\n\r\n**`Sk.misceval.`**\r\n- `asIndex` - will return the internal representation of the integer - or undefined if not indexable - could be a number or a bigint (JSBI) \r\n- `asIndexOrThrow` - does `asIndex` but throws an error if the number is not indexable - with an optional message parameter.\r\n- `asIndexSized` - throws an error if the object is not indexable, returns a Number always, Option to throw an error if the index is larger than `Number.MAX_SAFE_INTEGER`. This is the goto method for most builtins now. \r\n- `Iterator` - a python class that easily wraps an iterator\r\n- `arrayFromIterable` - optional canSuspend implementation that returns an array from a python iterator\r\n- `iterArray` - like `iterFor` but with an array rather than a python iterator\r\n\r\n**`slotdefs.js`**\r\n- contains all the information about mapping slots to dunders and vice versa.\r\n\r\n\r\n\r\n**slot changes**\r\n*only relevant for those developers and those writing slot functions directly - hopefully very few users*\r\n- `mp$length` replaced by `sq$length` in the codebase\r\n- `sq$ass_item`/`sq$ass_slice` replaced with `mp$ass_subscript`\r\n- `nb$nonzero` replaced with `nb$bool` and switch version to py2/py3 takes care of mapping the appropriate dunder method.\r\n- `mp$del_subscript` replaced by `mp$ass_subscript` (as per Cpython)\r\n - deleting vs setting an item is based on the call signature\r\n - `mp$ass_subscript(key, value)` -> set item\r\n - `mp$ass_subscript(key)` -> delete item\r\n- If a dunder func is defined on a user defined class then the slot function is guaranteed. \r\n - e.g. `__len__` defined guarantees `sq$length`. \r\n - A slot function defined by skulpt in this way throws the appropriate errors and converts the return value to the appropriate internal object. \r\n - `sq$length` called internally: `__len__` is called using `Sk.misceval.callsim(OrSuspend)Array`. \r\n - The result is checked to be an `int` and then converted to `number` since `sq$length` expects a `number`.\r\n- `tp$str` removed from some builtins as per Python 3.8 changes\r\n- If `tp$richcompare` is defined - wrapper functions `ob$eq` etc are created - this way `Sk.misceval.richCompareBool` need only check for the existence of an `ob$*` slot. \r\n - in fact - the existence of these slots is guaranteed since they are inherited from `Sk.builtin.object`\r\n- `tp$mro`/`tp$bases` are Js Arrays rather than `Sk.builtin.tuple`\r\n- `tp$str` and `$r` for errors were changed as per Cpython.\r\n- `nb$int_` -> `nb$int`\r\n- `nb$lng` -> `nb$long`\r\n- `nb$float_` -> `nb$float`\r\n- return values for certain slot functions have changed\r\n - `tp$hash` - should return a javascript number less than `Number.MAX_SAFE_INTEGER` can be postive or negative\r\n - `nb$index` - should return a javascript number or BigInt (older browsers should be a JSBI BigInt)\r\n- `tp$name` was removed from instances of `Sk.builtin.func` and `Sk.buitin.method` in favour of `$name` since it's `tp$name` should be the `type name`\r\n\r\n\r\n**flags - only relevant internally**\r\n- `sk$acceptable_as_base_class` used for some type objects\r\n- `sk$object` every skulpt object will have this flag. An easy way to determine if you have a skulpt object or a javascript object\r\n- `hp$type` all instance of `sk$klass` types\r\n- `sk$prototypical` do we need to walk up the MRO or can we just check the `prototype`\r\n- `sk$builtinBase` the most derived base which is a native skulpt class\r\n- `sk$baseClass` builtin classes that are direct children of `object`\r\n\r\n\r\n\r\n\r\n**other internal changes**\r\n- the use of `numPromoteFunc` was removed for performance improvements in the implementation of `Sk.asbtr.numberBinOp`\r\n - It was performance beneficial to leave the promoting to the respective `nb$` slots\r\n - `int` binop slots only deal with instance of `int`\r\n - `float` binop slots deal with instances of `float` and `int`\r\n - `complex` binop slots deal with instances of `complex`, `float` and `int`\r\n- since `long` was effectively removed when a number is larger than `Number.MAX_SAFE_INTEGER` it's `.v` value is a `BigInt`. if `BigInt` is not available in the browser then the `JSBI` library is used to replicate `BigInt` functionality. \r\n- `set` and `frozenset` now share much of their implementation\r\n- `collections` module rewritten using new api\r\n- `itertools` module rewritten using new api - these are now type objects rather than instances of `generator`\r\n- `operator` module rewritten using new api\r\n- `math` module adapted to the new api\r\n- `dict` and `set` throw errors if the objects change size during iteration as per Cpython.\r\n - fully tested\r\n- `Sk.builtin.check*` moved to `src/check.js`\r\n- `number.js` removed\r\n- `numtype.js` removed\r\n- `seqtype.js` removed\r\n- `mp$subscript` should *not* be called by a js object (see changes in `random.js`)\r\n- `quick$lookup` added to `dict.prototype` which is a fast way to lookup up `str` keys\r\n- `dict.prototype.entries` rather than has values that are `arrays` of key value pairs\r\n- `object.prototype.tp$hash` will no longer add `$savedHash_` to the object - instead it uses a javascript map and assigns objects to a random number less than `Number.MAX_SAFE_INTEGER` rather than incrementing the hash value each time. \r\n- `float.prototype.tp$hash` for integers this will be the same value as `Sk.builtin.int.prototype.tp$hash` for non integers this will be a random number less than `Number.MAX_SAFE_INTEGER`. Previously this was the number rounded down - but this creates a lot of collisions. \r\n\r\n" }, { "url": "https://api.github.com/repos/skulpt/skulpt/releases/1480498", "assets_url": "https://api.github.com/repos/skulpt/skulpt/releases/1480498/assets", "upload_url": "https://uploads.github.com/repos/skulpt/skulpt/releases/1480498/assets{?name,label}", "html_url": "https://github.com/skulpt/skulpt/releases/tag/0.10.0", "id": 1480498, "author": { "login": "bnmnetp", "id": 51115, "node_id": "MDQ6VXNlcjUxMTE1", "avatar_url": "https://avatars.githubusercontent.com/u/51115?v=4", "gravatar_id": "", "url": "https://api.github.com/users/bnmnetp", "html_url": "https://github.com/bnmnetp", "followers_url": "https://api.github.com/users/bnmnetp/followers", "following_url": "https://api.github.com/users/bnmnetp/following{/other_user}", "gists_url": "https://api.github.com/users/bnmnetp/gists{/gist_id}", "starred_url": "https://api.github.com/users/bnmnetp/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/bnmnetp/subscriptions", "organizations_url": "https://api.github.com/users/bnmnetp/orgs", "repos_url": "https://api.github.com/users/bnmnetp/repos", "events_url": "https://api.github.com/users/bnmnetp/events{/privacy}", "received_events_url": "https://api.github.com/users/bnmnetp/received_events", "type": "User", "site_admin": false }, "node_id": "MDc6UmVsZWFzZTE0ODA0OTg=", "tag_name": "0.10.0", "target_commitish": "master", "name": "Inherit from builtins", "draft": false, "prerelease": false, "created_at": "2015-06-30 20:24:23 UTC", "published_at": "2015-06-30 20:38:34 UTC", "assets": [ ], "tarball_url": "https://api.github.com/repos/skulpt/skulpt/tarball/0.10.0", "zipball_url": "https://api.github.com/repos/skulpt/skulpt/zipball/0.10.0", "body": "This latest release contains a lot of goodness.\n- You can now inherit from builtin types including Exceptions!\n- Major cleanup of numeric types\n- Bug fixes for iteration when using subclasses with our without `__getitem__`\n- Bug fixes and more completeness to lookups of dunder methods\n- complex type is added\n- brun command added to skulpt for easy access to in-browser debug\n- Many Many minor bug fixes.\n" }, { "url": "https://api.github.com/repos/skulpt/skulpt/releases/1362206", "assets_url": "https://api.github.com/repos/skulpt/skulpt/releases/1362206/assets", "upload_url": "https://uploads.github.com/repos/skulpt/skulpt/releases/1362206/assets{?name,label}", "html_url": "https://github.com/skulpt/skulpt/releases/tag/0.9.10", "id": 1362206, "author": { "login": "eah13", "id": 1702745, "node_id": "MDQ6VXNlcjE3MDI3NDU=", "avatar_url": "https://avatars.githubusercontent.com/u/1702745?v=4", "gravatar_id": "", "url": "https://api.github.com/users/eah13", "html_url": "https://github.com/eah13", "followers_url": "https://api.github.com/users/eah13/followers", "following_url": "https://api.github.com/users/eah13/following{/other_user}", "gists_url": "https://api.github.com/users/eah13/gists{/gist_id}", "starred_url": "https://api.github.com/users/eah13/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/eah13/subscriptions", "organizations_url": "https://api.github.com/users/eah13/orgs", "repos_url": "https://api.github.com/users/eah13/repos", "events_url": "https://api.github.com/users/eah13/events{/privacy}", "received_events_url": "https://api.github.com/users/eah13/received_events", "type": "User", "site_admin": false }, "node_id": "MDc6UmVsZWFzZTEzNjIyMDY=", "tag_name": "0.9.10", "target_commitish": "master", "name": "0.9.10", "draft": false, "prerelease": false, "created_at": "2015-05-06 04:57:49 UTC", "published_at": "2015-06-01 17:00:58 UTC", "assets": [ ], "tarball_url": "https://api.github.com/repos/skulpt/skulpt/tarball/0.9.10", "zipball_url": "https://api.github.com/repos/skulpt/skulpt/zipball/0.9.10", "body": "" } ], "releases_url": "https://github.com/skulpt/skulpt/releases", "repository_name": "skulpt", "repository_nwo": "skulpt/skulpt", "repository_url": "https://github.com/skulpt/skulpt", "show_downloads": true, "source": { "branch": "gh-pages", "path": "/" }, "tar_url": "https://github.com/skulpt/skulpt/tarball/gh-pages", "url": "http://skulpt.org", "versions": { "jekyll": "3.9.0", "jekyll-sass-converter": "1.5.2", "kramdown": "2.3.1", "kramdown-parser-gfm": "1.1.0", "jekyll-commonmark-ghpages": "0.1.6", "liquid": "4.0.3", "rouge": "3.26.0", "github-pages-health-check": "1.17.1", "jekyll-redirect-from": "0.16.0", "jekyll-sitemap": "1.4.0", "jekyll-feed": "0.15.1", "jekyll-gist": "1.5.0", "jekyll-paginate": "1.1.0", "jekyll-coffeescript": "1.1.1", "jekyll-seo-tag": "2.7.1", "jekyll-github-metadata": "2.13.0", "jekyll-avatar": "0.7.0", "jekyll-remote-theme": "0.4.3", "jemoji": "0.12.0", "jekyll-mentions": "1.6.0", "jekyll-relative-links": "0.6.1", "jekyll-optional-front-matter": "0.3.2", "jekyll-readme-index": "0.3.0", "jekyll-default-layout": "0.1.4", "jekyll-titles-from-headings": "0.5.3", "jekyll-swiss": "1.0.0", "minima": "2.5.1", "jekyll-theme-primer": "0.5.4", "jekyll-theme-architect": "0.1.1", "jekyll-theme-cayman": "0.1.1", "jekyll-theme-dinky": "0.1.1", "jekyll-theme-hacker": "0.1.2", "jekyll-theme-leap-day": "0.1.1", "jekyll-theme-merlot": "0.1.1", "jekyll-theme-midnight": "0.1.1", "jekyll-theme-minimal": "0.1.1", "jekyll-theme-modernist": "0.1.1", "jekyll-theme-slate": "0.1.1", "jekyll-theme-tactile": "0.1.1", "jekyll-theme-time-machine": "0.1.1", "ruby": "2.7.3", "github-pages": "214", "html-pipeline": "2.14.0", "sass": "3.7.4", "safe_yaml": "1.0.5", "nokogiri": "1.11.3" }, "wiki_url": "https://github.com/skulpt/skulpt/wiki", "zip_url": "https://github.com/skulpt/skulpt/zipball/gh-pages" }