You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			709 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			709 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Plaintext
		
	
Metadata-Version: 2.4
 | 
						|
Name: json5
 | 
						|
Version: 0.12.1
 | 
						|
Summary: A Python implementation of the JSON5 data format.
 | 
						|
Author-email: Dirk Pranke <dpranke@chromium.org>
 | 
						|
License: Files: Everything except for the benchmarks/*.json files.
 | 
						|
        
 | 
						|
        Apache License
 | 
						|
                                   Version 2.0, January 2004
 | 
						|
                                http://www.apache.org/licenses/
 | 
						|
        
 | 
						|
           TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
						|
        
 | 
						|
           1. Definitions.
 | 
						|
        
 | 
						|
              "License" shall mean the terms and conditions for use, reproduction,
 | 
						|
              and distribution as defined by Sections 1 through 9 of this document.
 | 
						|
        
 | 
						|
              "Licensor" shall mean the copyright owner or entity authorized by
 | 
						|
              the copyright owner that is granting the License.
 | 
						|
        
 | 
						|
              "Legal Entity" shall mean the union of the acting entity and all
 | 
						|
              other entities that control, are controlled by, or are under common
 | 
						|
              control with that entity. For the purposes of this definition,
 | 
						|
              "control" means (i) the power, direct or indirect, to cause the
 | 
						|
              direction or management of such entity, whether by contract or
 | 
						|
              otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
						|
              outstanding shares, or (iii) beneficial ownership of such entity.
 | 
						|
        
 | 
						|
              "You" (or "Your") shall mean an individual or Legal Entity
 | 
						|
              exercising permissions granted by this License.
 | 
						|
        
 | 
						|
              "Source" form shall mean the preferred form for making modifications,
 | 
						|
              including but not limited to software source code, documentation
 | 
						|
              source, and configuration files.
 | 
						|
        
 | 
						|
              "Object" form shall mean any form resulting from mechanical
 | 
						|
              transformation or translation of a Source form, including but
 | 
						|
              not limited to compiled object code, generated documentation,
 | 
						|
              and conversions to other media types.
 | 
						|
        
 | 
						|
              "Work" shall mean the work of authorship, whether in Source or
 | 
						|
              Object form, made available under the License, as indicated by a
 | 
						|
              copyright notice that is included in or attached to the work
 | 
						|
              (an example is provided in the Appendix below).
 | 
						|
        
 | 
						|
              "Derivative Works" shall mean any work, whether in Source or Object
 | 
						|
              form, that is based on (or derived from) the Work and for which the
 | 
						|
              editorial revisions, annotations, elaborations, or other modifications
 | 
						|
              represent, as a whole, an original work of authorship. For the purposes
 | 
						|
              of this License, Derivative Works shall not include works that remain
 | 
						|
              separable from, or merely link (or bind by name) to the interfaces of,
 | 
						|
              the Work and Derivative Works thereof.
 | 
						|
        
 | 
						|
              "Contribution" shall mean any work of authorship, including
 | 
						|
              the original version of the Work and any modifications or additions
 | 
						|
              to that Work or Derivative Works thereof, that is intentionally
 | 
						|
              submitted to Licensor for inclusion in the Work by the copyright owner
 | 
						|
              or by an individual or Legal Entity authorized to submit on behalf of
 | 
						|
              the copyright owner. For the purposes of this definition, "submitted"
 | 
						|
              means any form of electronic, verbal, or written communication sent
 | 
						|
              to the Licensor or its representatives, including but not limited to
 | 
						|
              communication on electronic mailing lists, source code control systems,
 | 
						|
              and issue tracking systems that are managed by, or on behalf of, the
 | 
						|
              Licensor for the purpose of discussing and improving the Work, but
 | 
						|
              excluding communication that is conspicuously marked or otherwise
 | 
						|
              designated in writing by the copyright owner as "Not a Contribution."
 | 
						|
        
 | 
						|
              "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
						|
              on behalf of whom a Contribution has been received by Licensor and
 | 
						|
              subsequently incorporated within the Work.
 | 
						|
        
 | 
						|
           2. Grant of Copyright License. Subject to the terms and conditions of
 | 
						|
              this License, each Contributor hereby grants to You a perpetual,
 | 
						|
              worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
						|
              copyright license to reproduce, prepare Derivative Works of,
 | 
						|
              publicly display, publicly perform, sublicense, and distribute the
 | 
						|
              Work and such Derivative Works in Source or Object form.
 | 
						|
        
 | 
						|
           3. Grant of Patent License. Subject to the terms and conditions of
 | 
						|
              this License, each Contributor hereby grants to You a perpetual,
 | 
						|
              worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
						|
              (except as stated in this section) patent license to make, have made,
 | 
						|
              use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
						|
              where such license applies only to those patent claims licensable
 | 
						|
              by such Contributor that are necessarily infringed by their
 | 
						|
              Contribution(s) alone or by combination of their Contribution(s)
 | 
						|
              with the Work to which such Contribution(s) was submitted. If You
 | 
						|
              institute patent litigation against any entity (including a
 | 
						|
              cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
						|
              or a Contribution incorporated within the Work constitutes direct
 | 
						|
              or contributory patent infringement, then any patent licenses
 | 
						|
              granted to You under this License for that Work shall terminate
 | 
						|
              as of the date such litigation is filed.
 | 
						|
        
 | 
						|
           4. Redistribution. You may reproduce and distribute copies of the
 | 
						|
              Work or Derivative Works thereof in any medium, with or without
 | 
						|
              modifications, and in Source or Object form, provided that You
 | 
						|
              meet the following conditions:
 | 
						|
        
 | 
						|
              (a) You must give any other recipients of the Work or
 | 
						|
                  Derivative Works a copy of this License; and
 | 
						|
        
 | 
						|
              (b) You must cause any modified files to carry prominent notices
 | 
						|
                  stating that You changed the files; and
 | 
						|
        
 | 
						|
              (c) You must retain, in the Source form of any Derivative Works
 | 
						|
                  that You distribute, all copyright, patent, trademark, and
 | 
						|
                  attribution notices from the Source form of the Work,
 | 
						|
                  excluding those notices that do not pertain to any part of
 | 
						|
                  the Derivative Works; and
 | 
						|
        
 | 
						|
              (d) If the Work includes a "NOTICE" text file as part of its
 | 
						|
                  distribution, then any Derivative Works that You distribute must
 | 
						|
                  include a readable copy of the attribution notices contained
 | 
						|
                  within such NOTICE file, excluding those notices that do not
 | 
						|
                  pertain to any part of the Derivative Works, in at least one
 | 
						|
                  of the following places: within a NOTICE text file distributed
 | 
						|
                  as part of the Derivative Works; within the Source form or
 | 
						|
                  documentation, if provided along with the Derivative Works; or,
 | 
						|
                  within a display generated by the Derivative Works, if and
 | 
						|
                  wherever such third-party notices normally appear. The contents
 | 
						|
                  of the NOTICE file are for informational purposes only and
 | 
						|
                  do not modify the License. You may add Your own attribution
 | 
						|
                  notices within Derivative Works that You distribute, alongside
 | 
						|
                  or as an addendum to the NOTICE text from the Work, provided
 | 
						|
                  that such additional attribution notices cannot be construed
 | 
						|
                  as modifying the License.
 | 
						|
        
 | 
						|
              You may add Your own copyright statement to Your modifications and
 | 
						|
              may provide additional or different license terms and conditions
 | 
						|
              for use, reproduction, or distribution of Your modifications, or
 | 
						|
              for any such Derivative Works as a whole, provided Your use,
 | 
						|
              reproduction, and distribution of the Work otherwise complies with
 | 
						|
              the conditions stated in this License.
 | 
						|
        
 | 
						|
           5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
						|
              any Contribution intentionally submitted for inclusion in the Work
 | 
						|
              by You to the Licensor shall be under the terms and conditions of
 | 
						|
              this License, without any additional terms or conditions.
 | 
						|
              Notwithstanding the above, nothing herein shall supersede or modify
 | 
						|
              the terms of any separate license agreement you may have executed
 | 
						|
              with Licensor regarding such Contributions.
 | 
						|
        
 | 
						|
           6. Trademarks. This License does not grant permission to use the trade
 | 
						|
              names, trademarks, service marks, or product names of the Licensor,
 | 
						|
              except as required for reasonable and customary use in describing the
 | 
						|
              origin of the Work and reproducing the content of the NOTICE file.
 | 
						|
        
 | 
						|
           7. Disclaimer of Warranty. Unless required by applicable law or
 | 
						|
              agreed to in writing, Licensor provides the Work (and each
 | 
						|
              Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
						|
              WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
						|
              implied, including, without limitation, any warranties or conditions
 | 
						|
              of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
						|
              PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
						|
              appropriateness of using or redistributing the Work and assume any
 | 
						|
              risks associated with Your exercise of permissions under this License.
 | 
						|
        
 | 
						|
           8. Limitation of Liability. In no event and under no legal theory,
 | 
						|
              whether in tort (including negligence), contract, or otherwise,
 | 
						|
              unless required by applicable law (such as deliberate and grossly
 | 
						|
              negligent acts) or agreed to in writing, shall any Contributor be
 | 
						|
              liable to You for damages, including any direct, indirect, special,
 | 
						|
              incidental, or consequential damages of any character arising as a
 | 
						|
              result of this License or out of the use or inability to use the
 | 
						|
              Work (including but not limited to damages for loss of goodwill,
 | 
						|
              work stoppage, computer failure or malfunction, or any and all
 | 
						|
              other commercial damages or losses), even if such Contributor
 | 
						|
              has been advised of the possibility of such damages.
 | 
						|
        
 | 
						|
           9. Accepting Warranty or Additional Liability. While redistributing
 | 
						|
              the Work or Derivative Works thereof, You may choose to offer,
 | 
						|
              and charge a fee for, acceptance of support, warranty, indemnity,
 | 
						|
              or other liability obligations and/or rights consistent with this
 | 
						|
              License. However, in accepting such obligations, You may act only
 | 
						|
              on Your own behalf and on Your sole responsibility, not on behalf
 | 
						|
              of any other Contributor, and only if You agree to indemnify,
 | 
						|
              defend, and hold each Contributor harmless for any liability
 | 
						|
              incurred by, or claims asserted against, such Contributor by reason
 | 
						|
              of your accepting any such warranty or additional liability.
 | 
						|
        
 | 
						|
           END OF TERMS AND CONDITIONS
 | 
						|
        
 | 
						|
           APPENDIX: How to apply the Apache License to your work.
 | 
						|
        
 | 
						|
              To apply the Apache License to your work, attach the following
 | 
						|
              boilerplate notice, with the fields enclosed by brackets "{}"
 | 
						|
              replaced with your own identifying information. (Don't include
 | 
						|
              the brackets!)  The text should be enclosed in the appropriate
 | 
						|
              comment syntax for the file format. We also recommend that a
 | 
						|
              file or class name and description of purpose be included on the
 | 
						|
              same "printed page" as the copyright notice for easier
 | 
						|
              identification within third-party archives.
 | 
						|
        
 | 
						|
           Copyright {yyyy} {name of copyright owner}
 | 
						|
        
 | 
						|
           Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
           you may not use this file except in compliance with the License.
 | 
						|
           You may obtain a copy of the License at
 | 
						|
        
 | 
						|
               http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
        
 | 
						|
           Unless required by applicable law or agreed to in writing, software
 | 
						|
           distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
           WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
           See the License for the specific language governing permissions and
 | 
						|
           limitations under the License.
 | 
						|
        
 | 
						|
        ---
 | 
						|
        
 | 
						|
        File: benchmarks/64KB-min.json
 | 
						|
        
 | 
						|
        MIT License
 | 
						|
        
 | 
						|
        Copyright (c) Microsoft Corporation.
 | 
						|
        
 | 
						|
        Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
        of this software and associated documentation files (the "Software"), to deal
 | 
						|
        in the Software without restriction, including without limitation the rights
 | 
						|
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
        copies of the Software, and to permit persons to whom the Software is
 | 
						|
        furnished to do so, subject to the following conditions:
 | 
						|
        
 | 
						|
        The above copyright notice and this permission notice shall be included in all
 | 
						|
        copies or substantial portions of the Software.
 | 
						|
        
 | 
						|
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
						|
        SOFTWARE
 | 
						|
        
 | 
						|
        ---
 | 
						|
        
 | 
						|
        File: benchmarks/bitly-usa-gov.json
 | 
						|
        
 | 
						|
        The MIT License (MIT)
 | 
						|
        
 | 
						|
        Copyright (c) 2017 Wes McKinney
 | 
						|
        
 | 
						|
        Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
        of this software and associated documentation files (the "Software"), to deal
 | 
						|
        in the Software without restriction, including without limitation the rights
 | 
						|
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
        copies of the Software, and to permit persons to whom the Software is
 | 
						|
        furnished to do so, subject to the following conditions:
 | 
						|
        
 | 
						|
        The above copyright notice and this permission notice shall be included in all
 | 
						|
        copies or substantial portions of the Software.
 | 
						|
        
 | 
						|
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
						|
        SOFTWARE.
 | 
						|
        
 | 
						|
        ---
 | 
						|
        
 | 
						|
        File: benchmarks/twitter.json
 | 
						|
        
 | 
						|
        The MIT License (MIT)
 | 
						|
        
 | 
						|
        Copyright (c) 2014 Milo Yip
 | 
						|
        
 | 
						|
        Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
        of this software and associated documentation files (the "Software"), to deal
 | 
						|
        in the Software without restriction, including without limitation the rights
 | 
						|
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
        copies of the Software, and to permit persons to whom the Software is
 | 
						|
        furnished to do so, subject to the following conditions:
 | 
						|
        
 | 
						|
        The above copyright notice and this permission notice shall be included in all
 | 
						|
        copies or substantial portions of the Software.
 | 
						|
        
 | 
						|
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
						|
        SOFTWARE.
 | 
						|
        
 | 
						|
Project-URL: Repository, https://github.com/dpranke/pyjson5
 | 
						|
Project-URL: Issues, https://github.com/dpranke/pyjson5/issues
 | 
						|
Project-URL: Changelog, https://github.com/dpranke/pyjson5/blob/master/README.md
 | 
						|
Keywords: json5
 | 
						|
Classifier: Development Status :: 5 - Production/Stable
 | 
						|
Classifier: Intended Audience :: Developers
 | 
						|
Classifier: License :: OSI Approved :: Apache Software License
 | 
						|
Classifier: Programming Language :: Python :: 3
 | 
						|
Classifier: Programming Language :: Python :: 3.8
 | 
						|
Classifier: Programming Language :: Python :: 3.9
 | 
						|
Classifier: Programming Language :: Python :: 3.10
 | 
						|
Classifier: Programming Language :: Python :: 3.11
 | 
						|
Classifier: Programming Language :: Python :: 3.12
 | 
						|
Classifier: Programming Language :: Python :: 3.13
 | 
						|
Requires-Python: >=3.8.0
 | 
						|
Description-Content-Type: text/markdown
 | 
						|
License-File: LICENSE
 | 
						|
Provides-Extra: dev
 | 
						|
Requires-Dist: build==1.2.2.post1; extra == "dev"
 | 
						|
Requires-Dist: coverage==7.5.4; python_version < "3.9" and extra == "dev"
 | 
						|
Requires-Dist: coverage==7.8.0; python_version >= "3.9" and extra == "dev"
 | 
						|
Requires-Dist: mypy==1.14.1; python_version < "3.9" and extra == "dev"
 | 
						|
Requires-Dist: mypy==1.15.0; python_version >= "3.9" and extra == "dev"
 | 
						|
Requires-Dist: pip==25.0.1; extra == "dev"
 | 
						|
Requires-Dist: pylint==3.2.7; python_version < "3.9" and extra == "dev"
 | 
						|
Requires-Dist: pylint==3.3.6; python_version >= "3.9" and extra == "dev"
 | 
						|
Requires-Dist: ruff==0.11.2; extra == "dev"
 | 
						|
Requires-Dist: twine==6.1.0; extra == "dev"
 | 
						|
Requires-Dist: uv==0.6.11; extra == "dev"
 | 
						|
Dynamic: license-file
 | 
						|
 | 
						|
# pyjson5
 | 
						|
 | 
						|
A Python implementation of the JSON5 data format.
 | 
						|
 | 
						|
[JSON5](https://json5.org) extends the
 | 
						|
[JSON](http://www.json.org) data interchange format to make it
 | 
						|
slightly more usable as a configuration language:
 | 
						|
 | 
						|
* JavaScript-style comments (both single and multi-line) are legal.
 | 
						|
 | 
						|
* Object keys may be unquoted if they are legal ECMAScript identifiers
 | 
						|
 | 
						|
* Objects and arrays may end with trailing commas.
 | 
						|
 | 
						|
* Strings can be single-quoted, and multi-line string literals are allowed.
 | 
						|
 | 
						|
There are a few other more minor extensions to JSON; see the above page for
 | 
						|
the full details.
 | 
						|
 | 
						|
This project implements a reader and writer implementation for Python;
 | 
						|
where possible, it mirrors the
 | 
						|
[standard Python JSON API](https://docs.python.org/library/json.html)
 | 
						|
package for ease of use.
 | 
						|
 | 
						|
There is one notable difference from the JSON api: the `load()` and
 | 
						|
`loads()` methods support optionally checking for (and rejecting) duplicate
 | 
						|
object keys; pass `allow_duplicate_keys=False` to do so (duplicates are
 | 
						|
allowed by default).
 | 
						|
 | 
						|
This is an early release. It has been reasonably well-tested, but it is
 | 
						|
**SLOW**. It can be 1000-6000x slower than the C-optimized JSON module,
 | 
						|
and is 200x slower (or more) than the pure Python JSON module.
 | 
						|
 | 
						|
**Please Note:** This library only handles JSON5 documents, it does not
 | 
						|
allow you to read arbitrary JavaScript. For example, bare integers can
 | 
						|
be legal object keys in JavaScript, but they aren't in JSON5.
 | 
						|
 | 
						|
## Known issues
 | 
						|
 | 
						|
* Did I mention that it is **SLOW**?
 | 
						|
 | 
						|
* The implementation follows Python3's `json` implementation where
 | 
						|
  possible. This means that the `encoding` method to `dump()` is
 | 
						|
  ignored, and unicode strings are always returned.
 | 
						|
 | 
						|
* The `cls` keyword argument that `json.load()`/`json.loads()` accepts
 | 
						|
  to specify a custom subclass of ``JSONDecoder`` is not and will not be
 | 
						|
  supported, because this implementation uses a completely different
 | 
						|
  approach to parsing strings and doesn't have anything like the
 | 
						|
  `JSONDecoder` class.
 | 
						|
 | 
						|
* The `cls` keyword argument that `json.dump()`/`json.dumps()` accepts
 | 
						|
  is also not supported, for consistency with `json5.load()`. The `default`
 | 
						|
  keyword *is* supported, though, and might be able to serve as a
 | 
						|
  workaround.
 | 
						|
 | 
						|
## Contributing
 | 
						|
 | 
						|
`json5` have no runtime dependencies and it is supported on Python version 3.8
 | 
						|
or later. However, in order to develop and build the package you need a
 | 
						|
bunch of extra tools and the latest versions of those tools may require 3.9
 | 
						|
or later. You can install the extra environment on 3.8 (and get older versions
 | 
						|
of the tools), but they may not run completely cleanly.
 | 
						|
 | 
						|
#### On Mac
 | 
						|
 | 
						|
The easiest thing to do is to install [`uv`](https://docs.astral.sh/uv) and
 | 
						|
use `uv` and the `//run` script to develop things. See `./run --help` for
 | 
						|
the various commands that are supported. `glop` is the parser generator
 | 
						|
tool used to generate a parser from the grammar in `json5/json5.g`.
 | 
						|
 | 
						|
```
 | 
						|
$ brew install uv
 | 
						|
$ git clone https://github.com/dpranke/pyjson5
 | 
						|
$ git clone https://github.com/dpranke/glop
 | 
						|
$ cd pyjson5
 | 
						|
$ source $(./run devenv)  # To activate a venv w/ all the needed dev tools.
 | 
						|
```
 | 
						|
 | 
						|
#### On other platforms
 | 
						|
 | 
						|
Install `uv` via whatever mechanism is appropriate.
 | 
						|
 | 
						|
### Create the venv
 | 
						|
 | 
						|
```
 | 
						|
$ ./run devenv
 | 
						|
```
 | 
						|
 | 
						|
(This calls `uv sync --extra dev`.)
 | 
						|
 | 
						|
### Running the tests
 | 
						|
 | 
						|
```
 | 
						|
$ ./run tests
 | 
						|
```
 | 
						|
 | 
						|
### Updating the packages
 | 
						|
 | 
						|
```
 | 
						|
# Update the version in json5/version.py to $VERSION, which should be of
 | 
						|
# the form X.Y.Z where X, Y, and Z are numbers.
 | 
						|
$ ./run regen
 | 
						|
$ ./run presubmit
 | 
						|
$ git commit -a -m "Bump the version to $VERSION"
 | 
						|
$ git tag "v$VERSION"
 | 
						|
$ ./run build
 | 
						|
$ ./run publish --prod
 | 
						|
$ git push origin
 | 
						|
$ git push --tags origin
 | 
						|
```
 | 
						|
 | 
						|
(Assuming you have upload privileges to PyPI and the GitHub repo, of course.)
 | 
						|
 | 
						|
## Version History / Release Notes
 | 
						|
 | 
						|
* v0.12.1 (2025-08-12)
 | 
						|
    * Fix [#94](https://github.com/dpranke/pyjson5/issues/94), where objects
 | 
						|
      returned from a custom encoder were not being indented properly.
 | 
						|
 | 
						|
* v0.12.0 (2025-04-03)
 | 
						|
    * Roll back pyproject.toml change for licensing so that we can still
 | 
						|
      build the package on 3.8.
 | 
						|
    * Upgrade devenv package dependencies to latest versions; they now need
 | 
						|
      Python 3.9 or newer, though json5 itself still supports 3.8.
 | 
						|
 | 
						|
* v0.11.0 (2025-04-01)
 | 
						|
    * Add a couple examples to the documentation and run doctest over
 | 
						|
      them.
 | 
						|
    * Fix a typing issue in dump and dumps with the `cls` argument; turns
 | 
						|
      out mypy was right and I was wrong and I didn't realize it :).
 | 
						|
    * Introduce a new `parse` method that can be used to iterate through
 | 
						|
      a string, extracting multiple values.
 | 
						|
    * Add a new `consume_trailing` parameter to `load`/`loads`/`parse`
 | 
						|
      that specifies whether to keep parsing after a valid object is
 | 
						|
      reached. By default, this is True and the string must only contain
 | 
						|
      trailing whitespace. If set to False, parsing will stop when a
 | 
						|
      valid object is reached.
 | 
						|
    * Add a new `start` parameter to `load`/`loads`/`parse` to specify
 | 
						|
      the zero-based offset to start parsing the string or file from.
 | 
						|
    * [GitHub issue #60](https://github.com/dpranke/pyjson5/issues/60).
 | 
						|
      Fix a bug where we were attempting to allow '--4' as a valid number.
 | 
						|
 | 
						|
* v0.10.0 (2024-11-25)
 | 
						|
    * [GitHub issue #57](https://github.com/dpranke/pyjson5/issues/57).
 | 
						|
      Added a `JSON5Encoder` class that can be overridden to do custom
 | 
						|
      encoding of values. This class is vaguely similar to the `JSONEncoder`
 | 
						|
      class in the standard `json` library, except that it has an
 | 
						|
      `encode()` method that can be overridden to customize *any*
 | 
						|
      value, not just ones the standard encoder doesn't know how to handle.
 | 
						|
      It does also support a `default()` method that can be used to
 | 
						|
      encode things not normally encodable, like the JSONEncoder class.
 | 
						|
      It does not support an `iterencode` method. One could probably
 | 
						|
      be added in the future, although exactly how that would work and
 | 
						|
      interact with `encode` is a little unclear.
 | 
						|
    * Restructured the code to use the new encoder class; doing so actually
 | 
						|
      allowed me to delete a bunch of tediously duplicative code.
 | 
						|
    * Added a new `quote_style` argument to `dump()`/`dumps()` to control
 | 
						|
      how strings are encoded by default. For compatibility with older
 | 
						|
      versions of the json5 library and the standard json library, it
 | 
						|
      uses `QuoteStyle.ALWAYS_DOUBLE` which encodes all strings with double
 | 
						|
      quotes all the time. You can also configure it to use single quotes
 | 
						|
      all the time (`ALWAYS_SINGLE`), and to switch between single and double
 | 
						|
      when doing so eliminates a need to escape quotes (`PREFER_SINGLE` and
 | 
						|
      `PREFER_DOUBLE`). This also adds a `--quote-style` argument to
 | 
						|
      `python -m json5`.
 | 
						|
    * This release has a fair number of changes, but is intended to be
 | 
						|
      completely backwards-compatible. Code without changes should run exactly
 | 
						|
      as it did before.
 | 
						|
* v0.9.28 (2024-11-11)
 | 
						|
    * Fix GitHub CI to install `uv` so `./run tests` works properly.
 | 
						|
    * Mark Python3.13 as supported in package metadata.
 | 
						|
    * Update dev package dependencies (note that the latest versions
 | 
						|
      of coverage and pylint no longer work w/ Python3.8)
 | 
						|
* v0.9.27 (2024-11-10)
 | 
						|
    * Fix typo in //README.md
 | 
						|
* v0.9.26 (2024-11-10)
 | 
						|
    * [GitHub issue #82](https://github.com/dpranke/pyjson5/issues/82)
 | 
						|
      Add support for the `strict` parameter to `load()`/`loads()`.
 | 
						|
    * Significantly rework the infra and the `run` script to be
 | 
						|
      contemporary.
 | 
						|
* v0.9.25 (2024-04-12)
 | 
						|
    * [GitHub issue #81](https://github.com/dpranke/pyjson5/issues/81)
 | 
						|
      Explicitly specify the directory to use for the package in
 | 
						|
      pyproject.toml.
 | 
						|
* v0.9.24 (2024-03-16)
 | 
						|
    * Update GitHub workflow config to remove unnecessary steps and
 | 
						|
      run on pull requests as well as commits.
 | 
						|
    * Added note about removing `hypothesize` in v0.9.23.
 | 
						|
    * No code changes.
 | 
						|
* v0.9.23 (2024-03-16)
 | 
						|
    * Lots of cleanup:
 | 
						|
      * Removed old code needed for Python2 compatibility.
 | 
						|
      * Removed tests using `hypothesize`. This ran model-based checks
 | 
						|
        and didn't really add anything useful in terms of coverage to
 | 
						|
        the test suite, and it introduced dependencies and slowed down
 | 
						|
        the tests significantly. It was a good experiment but I think
 | 
						|
        we're better off without it.
 | 
						|
      * Got everything linting cleanly with pylint 3.1 and `ruff check`
 | 
						|
        using ruff 0.3.3 (Note that commit message in 00d73a3 says pylint
 | 
						|
        3.11, which is a typo).
 | 
						|
      * Code reformatted with `ruff format`
 | 
						|
      * Added missing tests to bring coverage up to 100%.
 | 
						|
      * Lots of minor code changes as the result of linting and coverage
 | 
						|
        testing, but no intentional functional differences.
 | 
						|
* v0.9.22 (2024-03-06)
 | 
						|
    * Attempt to fix the GitHub CI configuration now that setup.py
 | 
						|
      is gone. Also, test on 3.12 instead of 3.11.
 | 
						|
    * No code changes.
 | 
						|
* v0.9.21 (2024-03-06)
 | 
						|
    * Moved the benchmarks/*.json data files' license information
 | 
						|
      to //LICENSE to (hopefully) make the Google linter happy.
 | 
						|
* v0.9.20 (2024-03-03)
 | 
						|
    * Added `json5.__version__` in addition to `json5.VERSION`.
 | 
						|
    * More packaging modernization (no more setup.{cfg,py} files).
 | 
						|
    * Mark Python3.12 as supported in project.classifiers.
 | 
						|
    * Updated the `//run` script to use python3.
 | 
						|
* v0.9.19 (2024-03-03)
 | 
						|
    * Replaced the benchmarking data files that came from chromium.org with
 | 
						|
      three files obtained from other datasets on GitHub. Since this repo
 | 
						|
      is vendored into the chromium/src repo it was occasionally confusing
 | 
						|
      people who thought the data was actually used for non-benchmarking
 | 
						|
      purposes and thus updating it for whatever reason.
 | 
						|
    * No code changes.
 | 
						|
* v0.9.18 (2024-02-29)
 | 
						|
    * Add typing information to the module. This is kind of a big change,
 | 
						|
      but there should be no functional differences.
 | 
						|
* v0.9.17 (2024-02-19)
 | 
						|
    * Move from `setup.py` to `pyproject.toml`.
 | 
						|
    * No code changes (other than the version increasing).
 | 
						|
* v0.9.16 (2024-02-19)
 | 
						|
    * Drop Python2 from `setup.py`
 | 
						|
    * Add minimal packaging instructions to `//README.md`.
 | 
						|
* v0.9.15 (2024-02-19)
 | 
						|
    * Merge in [Pull request #66](https://github.com/dpranke/pyjson5/pull/66)
 | 
						|
      to include the tests and sample file in a source distribution.
 | 
						|
* v0.9.14 (2023-05-14)
 | 
						|
    * [GitHub issue #63](https://github.com/dpranke/pyjson5/issues/63)
 | 
						|
      Handle `+Infinity` as well as `-Infinity` and `Infinity`.
 | 
						|
* v0.9.13 (2023-03-16)
 | 
						|
    * [GitHub PR #64](https://github.com/dpranke/pyjson5/pull/64)
 | 
						|
      Remove a field from one of the JSON benchmark files to
 | 
						|
      reduce confusion in Chromium.
 | 
						|
    * No code changes.
 | 
						|
* v0.9.12 (2023-01-02)
 | 
						|
    * Fix GitHub Actions config file to no longer test against
 | 
						|
      Python 3.6 or 3.7. For now we will only test against an
 | 
						|
      "oldest" release (3.8 in this case) and a "current"
 | 
						|
      release (3.11 in this case).
 | 
						|
* v0.9.11 (2023-01-02)
 | 
						|
    * [GitHub issue #60](https://github.com/dpranke/pyjson5/issues/60)
 | 
						|
      Fixed minor Python2 compatibility issue by referring to
 | 
						|
      `float("inf")` instead of `math.inf`.
 | 
						|
* v0.9.10 (2022-08-18)
 | 
						|
    * [GitHub issue #58](https://github.com/dpranke/pyjson5/issues/58)
 | 
						|
      Updated the //README.md to be clear that parsing arbitrary JS
 | 
						|
      code may not work.
 | 
						|
    * Otherwise, no code changes.
 | 
						|
* v0.9.9 (2022-08-01)
 | 
						|
    * [GitHub issue #57](https://github.com/dpranke/pyjson5/issues/57)
 | 
						|
      Fixed serialization for objects that subclass `int` or `float`:
 | 
						|
      Previously we would use the objects __str__ implementation, but
 | 
						|
      that might result in an illegal JSON5 value if the object had
 | 
						|
      customized __str__ to return something illegal. Instead,
 | 
						|
      we follow the lead of the `JSON` module and call `int.__repr__`
 | 
						|
      or `float.__repr__` directly.
 | 
						|
    * While I was at it, I added tests for dumps(-inf) and dumps(nan)
 | 
						|
      when those were supposed to be disallowed by `allow_nan=False`.
 | 
						|
* v0.9.8 (2022-05-08)
 | 
						|
    * [GitHub issue #47](https://github.com/dpranke/pyjson5/issues/47)
 | 
						|
      Fixed error reporting in some cases due to how parsing was handling
 | 
						|
      nested rules in the grammar - previously the reported location for
 | 
						|
      the error could be far away from the point where it actually happened.
 | 
						|
 | 
						|
* v0.9.7 (2022-05-06)
 | 
						|
    * [GitHub issue #52](https://github.com/dpranke/pyjson5/issues/52)
 | 
						|
      Fixed behavior of `default` fn in `dump` and `dumps`. Previously
 | 
						|
      we didn't require the function to return a string, and so we could
 | 
						|
      end up returning something that wasn't actually valid. This change
 | 
						|
      now matches the behavior in the `json` module. *Note: This is a
 | 
						|
      potentially breaking change.*
 | 
						|
* v0.9.6 (2021-06-21)
 | 
						|
    * Bump development status classifier to 5 - Production/Stable, which
 | 
						|
      the library feels like it is at this point. If I do end up significantly
 | 
						|
      reworking things to speed it up and/or to add round-trip editing,
 | 
						|
      that'll likely be a 2.0. If this version has no reported issues,
 | 
						|
      I'll likely promote it to 1.0.
 | 
						|
    * Also bump the tested Python versions to 2.7, 3.8 and 3.9, though
 | 
						|
      earlier Python3 versions will likely continue to work as well.
 | 
						|
    * [GitHub issue #46](https://github.com/dpranke/pyjson5/issues/36)
 | 
						|
      Fix incorrect serialization of custom subtypes
 | 
						|
    * Make it possible to run the tests if `hypothesis` isn't installed.
 | 
						|
 | 
						|
* v0.9.5 (2020-05-26)
 | 
						|
    * Miscellaneous non-source cleanups in the repo, including setting
 | 
						|
      up GitHub Actions for a CI system. No changes to the library from
 | 
						|
      v0.9.4, other than updating the version.
 | 
						|
 | 
						|
* v0.9.4 (2020-03-26)
 | 
						|
    * [GitHub pull #38](https://github.com/dpranke/pyjson5/pull/38)
 | 
						|
      Fix from fredrik@fornwall.net for dumps() crashing when passed
 | 
						|
      an empty string as a key in an object.
 | 
						|
 | 
						|
* v0.9.3 (2020-03-17)
 | 
						|
    * [GitHub pull #35](https://github.com/dpranke/pyjson5/pull/35)
 | 
						|
      Fix from pastelmind@ for dump() not passing the right args to dumps().
 | 
						|
    * Fix from p.skouzos@novafutur.com to remove the tests directory from
 | 
						|
      the setup call, making the package a bit smaller.
 | 
						|
 | 
						|
* v0.9.2 (2020-03-02)
 | 
						|
    * [GitHub pull #34](https://github.com/dpranke/pyjson5/pull/34)
 | 
						|
      Fix from roosephu@ for a badly formatted nested list.
 | 
						|
 | 
						|
* v0.9.1 (2020-02-09)
 | 
						|
    * [GitHub issue #33](https://github.com/dpranke/pyjson5/issues/33):
 | 
						|
       Fix stray trailing comma when dumping an object with an invalid key.
 | 
						|
 | 
						|
* v0.9.0 (2020-01-30)
 | 
						|
    * [GitHub issue #29](https://github.com/dpranke/pyjson5/issues/29):
 | 
						|
       Fix an issue where objects keys that started with a reserved
 | 
						|
       word were incorrectly quoted.
 | 
						|
    * [GitHub issue #30](https://github.com/dpranke/pyjson5/issues/30):
 | 
						|
       Fix an issue where dumps() incorrectly thought a data structure
 | 
						|
       was cyclic in some cases.
 | 
						|
    * [GitHub issue #32](https://github.com/dpranke/pyjson5/issues/32):
 | 
						|
       Allow for non-string keys in dicts passed to ``dump()``/``dumps()``.
 | 
						|
       Add an ``allow_duplicate_keys=False`` to prevent possible
 | 
						|
       ill-formed JSON that might result.
 | 
						|
 | 
						|
* v0.8.5 (2019-07-04)
 | 
						|
    * [GitHub issue #25](https://github.com/dpranke/pyjson5/issues/25):
 | 
						|
      Add LICENSE and README.md to the dist.
 | 
						|
    * [GitHub issue #26](https://github.com/dpranke/pyjson5/issues/26):
 | 
						|
      Fix printing of empty arrays and objects with indentation, fix
 | 
						|
      misreporting of the position on parse failures in some cases.
 | 
						|
 | 
						|
* v0.8.4 (2019-06-11)
 | 
						|
    * Updated the version history, too.
 | 
						|
 | 
						|
* v0.8.3 (2019-06-11)
 | 
						|
    * Tweaked the README, bumped the version, forgot to update the version
 | 
						|
      history :).
 | 
						|
 | 
						|
* v0.8.2 (2019-06-11)
 | 
						|
    * Actually bump the version properly, to 0.8.2.
 | 
						|
 | 
						|
* v0.8.1 (2019-06-11)
 | 
						|
    * Fix bug in setup.py that messed up the description. Unfortunately,
 | 
						|
      I forgot to bump the version for this, so this also identifies as 0.8.0.
 | 
						|
 | 
						|
* v0.8.0 (2019-06-11)
 | 
						|
    * Add `allow_duplicate_keys=True` as a default argument to
 | 
						|
      `json5.load()`/`json5.loads()`. If you set the key to `False`, duplicate
 | 
						|
      keys in a single dict will be rejected. The default is set to `True`
 | 
						|
      for compatibility with `json.load()`, earlier versions of json5, and
 | 
						|
      because it's simply not clear if people would want duplicate checking
 | 
						|
      enabled by default.
 | 
						|
 | 
						|
* v0.7 (2019-03-31)
 | 
						|
    * Changes dump()/dumps() to not quote object keys by default if they are
 | 
						|
      legal identifiers. Passing `quote_keys=True` will turn that off
 | 
						|
      and always quote object keys.
 | 
						|
    * Changes dump()/dumps() to insert trailing commas after the last item
 | 
						|
      in an array or an object if the object is printed across multiple lines
 | 
						|
      (i.e., if `indent` is not None). Passing `trailing_commas=False` will
 | 
						|
      turn that off.
 | 
						|
    * The `json5.tool` command line tool now supports the `--indent`,
 | 
						|
      `--[no-]quote-keys`, and `--[no-]trailing-commas` flags to allow
 | 
						|
      for more control over the output, in addition to the existing
 | 
						|
      `--as-json` flag.
 | 
						|
    * The `json5.tool` command line tool no longer supports reading from
 | 
						|
      multiple files, you can now only read from a single file or
 | 
						|
      from standard input.
 | 
						|
    * The implementation no longer relies on the standard `json` module
 | 
						|
      for anything. The output should still match the json module (except
 | 
						|
      as noted above) and discrepancies should be reported as bugs.
 | 
						|
 | 
						|
* v0.6.2 (2019-03-08)
 | 
						|
    * Fix [GitHub issue #23](https://github.com/dpranke/pyjson5/issues/23) and
 | 
						|
      pass through unrecognized escape sequences.
 | 
						|
 | 
						|
* v0.6.1 (2018-05-22)
 | 
						|
    * Cleaned up a couple minor nits in the package.
 | 
						|
 | 
						|
* v0.6.0 (2017-11-28)
 | 
						|
    * First implementation that attempted to implement 100% of the spec.
 | 
						|
 | 
						|
* v0.5.0 (2017-09-04)
 | 
						|
    * First implementation that supported the full set of kwargs that
 | 
						|
      the `json` module supports.
 |