# Contributing to jc We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: - Reporting a bug - Discussing the current state of the code - Submitting a fix - Proposing new features - Proposing a new parser ## We Develop with Github We use github to host code, to track issues and feature requests, as well as accept pull requests. ## We Use Github Flow, So All Code Changes Happen Through Pull Requests Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 1. Open an issue to discuss the new feature, bug fix, or parser before opening a pull request. For new parsers, it is important to agree upon a schema before developing the parser. 2. Fork the repo and create your branch from `dev`, if available, otherwise `master`. 3. For new parsers: - Templates: Use the [`jc/parsers/foo.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/foo.py) or [`jc/parsers/foo_s.py (streaming)`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/foo_s.py) parsers as a template to get started. - Local development: You can even place a new parser python module file in the [parser plugin directory](https://github.com/kellyjonbrazil/jc#parser-plugins) to get started right away with just a standard `jc` installation. - Parser registry: Add the parser name to the [jc/lib.py](https://github.com/kellyjonbrazil/jc/blob/master/jc/lib.py) file. 4. If you've added code that should be tested, add tests. All new parsers should have several sample outputs and tests. - Templates: Use the [tests/templates/_test_foo.py](https://github.com/kellyjonbrazil/jc/blob/master/tests/templates/_test_foo.py) or [tests/templates/_test_foo_s.py (streaming)](https://github.com/kellyjonbrazil/jc/tree/master/tests/templates) files as a template - Fixtures: Tests typically consist of an input file and an expected output JSON file. Add the data files to the appropriate folder under [tests/fixtures](https://github.com/kellyjonbrazil/jc/tree/master/tests/fixtures) 5. Documentation is auto-generated from docstrings, so ensure they are clear and accurate. 6. Ensure the test suite passes. (Note: "**America/Los_Angeles**" timezone should be configured on the test system) 7. Make sure your code lints. 8. Issue that pull request! ## Parser Schema Guidelines - Try to keep the schema as flat as possible - typically a list of flat dictionaries - Keys should be lowercase, contain no special characters, and spaces should be converted to underscores - Keys should be static, if possible. If they have to be dynamic, then they should not contain lists or dictionaries This will make it easier to use tools like `jq` without requiring escaping of special characters, encapsulating key names in [""], keeps paths predictable, and makes iterating and searching for values easier. **Examples** Bad: ```json { "Interface 1": [ "192.168.1.1", "172.16.1.1" ], "Wifi Interface 1": [ "10.1.1.1" ] } ``` Good: ```json [ { "interface": "Interface 1", "ip_addresses": [ "192.168.1.1", "172.16.1.1" ] }, { "interface": "Wifi Interface 1", "ip_addresses": [ "10.1.1.1" ] } ] ``` ## Tests It is essential to have good command output sample coverage and tests to keep the `jc` parser quality high. Many parsers include calculated timestamp fields using the `jc.utils.timestamp` class. Naive timestamps created with this class should be generated on a system configured with the "**America/Los_Angeles**" timezone on linux/macOS/unix and "**Pacific Standard Time**" timezone on Windows for tests to pass on the Github Actions CI tests. This timezone should be configured on your local system before running the tests locally, as well. ## Any contributions you make will be under the MIT Software License In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. ## Report bugs using Github's Issues We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/kellyjonbrazil/jc/issues); it's that easy! ## Write bug reports with detail, background, and sample code **Great Bug Reports** tend to have: - A quick summary and/or background - Steps to reproduce - Be specific! - Give sample code if you can. - What you expected would happen - What actually happens - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) ## Use a Consistent Coding Style * 4 spaces for indentation rather than tabs * Use a Python linter that will enforce PEP 8 and other best practices