This introduces a clear separation between test data and test binaries. Test data is moved into test/data, and the test binaries move into test/src. A new CMake script specific to building the tests is introduced in /test to slightly clean up the toplevel one. As well as tidying things up, this makes the next step trivial...
6.9 KiB
How to contribute
This project started as a little excuse to exercise some of the cool new C++11 features. Over time, people actually started to use the JSON library (yey!) and started to help improve it by proposing features, finding bugs, or even fixing my mistakes. I am really thankful for this and try to keep track of all the helpers.
To make it as easy as possible for you to contribute and for me to keep an overview, here are a few guidelines which should help us avoid all kinds of unnecessary work or disappointment. And of course, this document is subject to discussion, so please create an issue or a pull request if you find a way to improve it!
Prerequisites
Please create an issue, assuming one does not already exist, and describe your concern. Note you need a GitHub account for this.
If you want propose changes to the code, you need to download the re2c
tool.
Describe your issue
Clearly describe the issue:
- If it is a bug, please describe how to reproduce it. If possible, attach a complete example which demonstrates the error. Please also state what you expected to happen instead of the error.
- If you propose a change or addition, try to give an example how the improved code could look like or how to use it.
- If you found a compilation error, please tell us which compiler (version and operating system) you used and paste the (relevant part of) the error messages to the ticket.
Files to change
There are currently two files which need to be edited:
-
src/json.hpp.re2c
(note the.re2c
suffix) - This file contains a comment section which describes the JSON lexic. This section is translated byre2c
into filesrc/json.hpp
which is plain "vanilla" C++11 code. (In fact, the generated lexer consists of some hundred lines ofgoto
s, which is a hint you never want to edit this file...).If you only edit file
src/json.hpp
(without the.re2c
suffix), your changes will be overwritten as soon as the lexer is touched again. To generate thesrc/json.hpp
file which is actually used during compilation of the tests and all other code, please executemake re2c
To run
re2c
and generate/overwrite filesrc/json.hpp
with your changes in filesrc/json.hpp.re2c
. -
test/src/unit.cpp
- This contains the Catch unit tests which currently cover 100 % of the library's code.If you add or change a feature, please also add a unit test to this file. The unit tests can be compiled with
make
and can be executed with
./json_unit
The test cases are also executed with several different compilers on Travis once you open a pull request.
Please understand that I cannot accept pull requests changing only file src/json.hpp
.
Note
- If you open a pull request, the code will be automatically tested with Valgrind's Memcheck tool to detect memory leaks. Please be aware that the execution with Valgrind may in rare cases yield different behavior than running the code directly. This can result in failing unit tests which run successfully without Valgrind.
Please don't
- Only make changes to file
src/json.hpp
-- please read the paragraph above and understand whysrc/json.hpp.re2c
exists. - The C++11 support varies between different compilers and versions. Please note the list of supported compilers. Some compilers like GCC 4.8 (and earlier), Clang 3.3 (and earlier), or Microsoft Visual Studio 13.0 and earlier are known not to work due to missing or incomplete C++11 support. Please refrain from proposing changes that work around these compiler's limitations with
#ifdef
s or other means. - Specifically, I am aware of compilation problems with Microsoft Visual Studio (there even is an issue label for these kind of bugs). I understand that even in 2016, complete C++11 support isn't there yet. But please also understand that I do not want to drop features or uglify the code just to make Microsoft's sub-standard compiler happy. The past has shown that there are ways to express the functionality such that the code compiles with the most recent MSVC - unfortunately, this is not the main objective of the project.
- Please refrain from proposing changes that would break JSON conformance. If you propose a conformant extension of JSON to be supported by the library, please motivate this extension.
- Please do not open pull requests that address multiple issues.
Wanted
The following areas really need contribution:
- Getting the code to compile without errors with the latest Microsoft Visual Studio version. I am not using Windows, so I cannot debug code with MSVC myself. There is a job on AppVeyor though.
- Extending the continuous integration beyond Linux running some versions of GCC and Clang on Travis and Microsoft Visual Studio on AppVeyor. We have found a lot of bugs just because several compilers behave in a slightly different manner.
- Improving the efficiency of the JSON parser. The current parser is implemented as a naive recursive descent parser with hand coded string handling. More sophisticated approaches like LALR parsers would be really appreciated. That said, parser generators like Bison or ANTLR do not play nice with single-header files -- I really would like to keep the parser inside the
json.hpp
header, and I am not aware of approaches similar tore2c
for parsing. - Extending and updating existing benchmarks to include (the most recent version of) this library. Though efficiency is not everything, speed and memory consumption are very important characteristics for C++ developers, so having proper comparisons would be interesting.
- Check the code with Coverity.
- Make the code locale-independent. The library currently only works for a locale where
.
is the decimal point character.