├── media └── logo_proxycurl_artboard_1.png ├── Dockerfile ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ ├── pytest.yml │ └── pylint.yml ├── .gitignore ├── LICENSE ├── inb ├── tests │ ├── __init__.py │ ├── test_utils.py │ ├── test_settings.py │ ├── test_cookierepo.py │ └── test_invitation_status.py ├── api │ ├── utils │ │ ├── __init__.py │ │ └── utils.py │ ├── invitation │ │ ├── __init__.py │ │ └── status.py │ ├── __init__.py │ ├── exceptions.py │ ├── settings.py │ ├── cookierepo.py │ ├── client.py │ └── linkedin_api.py └── inb.py ├── requirements.txt ├── docs └── styleguide.md ├── DEVELOPERS.md ├── manage.sh ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md ├── README.md └── .pylintrc /media/logo_proxycurl_artboard_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshiayush/inb/HEAD/media/logo_proxycurl_artboard_1.png -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8 2 | 3 | WORKDIR /app 4 | 5 | COPY requirements.txt . 6 | RUN pip install --no-cache-dir -r requirements.txt 7 | 8 | COPY inb /app 9 | ENTRYPOINT [ "python", "inb.py" ] 10 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # These owners will be the default owners for everything in the repo. Unless a later match takes precedence, @joshiayush will be requested for review when someone opens a pull request. 2 | * @joshiayush 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # cache 2 | __pycache__ 3 | 4 | # pyinstaller 5 | *.spec 6 | dist/** 7 | build/** 8 | 9 | # virtual environment 10 | lib/** 11 | lib64 12 | include 13 | bin 14 | pyvenv.cfg 15 | share/ 16 | 17 | # visual studio code 18 | .vscode 19 | 20 | # log records 21 | logs 22 | 23 | # credentials 24 | credentials.json 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2018 The inb Authors. All Rights Reserved. 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /inb/tests/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | -------------------------------------------------------------------------------- /inb/api/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | -------------------------------------------------------------------------------- /inb/api/invitation/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | -------------------------------------------------------------------------------- /inb/api/__init__.py: -------------------------------------------------------------------------------- 1 | # pylint: disable=missing-module-docstring 2 | 3 | # Copyright 2023 The inb Authors. All Rights Reserved. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | __version__ = '1.0.0' 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | | Name | About | Title | Labels | Assignees | 2 | | --------------- | -------------------------------- | ----- | ------ | --------- | 3 | | Feature request | Suggest an idea for this project | Any | Any | Any | 4 | 5 | ## Is your feature request related to a problem? Please describe. 6 | 7 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 8 | 9 | ## Describe the solution you'd like 10 | 11 | A clear and succinct description of what you want to happen. 12 | 13 | ## Describe alternatives you've considered 14 | 15 | A clear and succinct description of any alternative solutions or features you've considered (if possible), otherwise delete the 16 | section entirely. 17 | 18 | ## Additional context 19 | 20 | Add any other context or screenshots (if possible) about the feature request here, otherwise delete the section entirely. 21 | -------------------------------------------------------------------------------- /inb/api/exceptions.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | """LinkedIn API exceptions.""" 16 | 17 | LinkedInChallengeException = type('LinkedInChallengeException', (Exception,), 18 | {}) 19 | 20 | LinkedInUnauthorizedException = type('LinkedInUnauthorizedException', 21 | (Exception,), {}) 22 | 23 | LinkedInSessionExpiredException = type('LinkedInSessionExpiredException', 24 | (Exception,), {}) 25 | 26 | LinkedInUnexpectedStatusException = type('LinkedInUnexpectedStatusException', 27 | (Exception,), {}) 28 | -------------------------------------------------------------------------------- /inb/api/utils/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | """Utility module for the LinkedIn API package.""" 16 | 17 | import base64 18 | import random 19 | 20 | 21 | def get_id_from_urn(urn: str) -> str: 22 | """Returns the last element from the profile urn string.""" 23 | return urn.split(':')[3] 24 | 25 | 26 | def generate_tracking_id() -> str: 27 | """Generates a tracking id to attach to the payload being sent to the voyager 28 | endpoints. 29 | 30 | Returns: 31 | Tracking id for a payload. 32 | """ 33 | return str( 34 | base64.b64encode(bytearray([random.randrange(256) for _ in range(16) 35 | ])))[2:-1] 36 | -------------------------------------------------------------------------------- /.github/workflows/pytest.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Pytest 16 | 17 | on: [push, pull_request] 18 | 19 | jobs: 20 | build: 21 | runs-on: ubuntu-latest 22 | 23 | steps: 24 | - uses: actions/checkout@v2 25 | 26 | - name: Set up Python 3.8 27 | uses: actions/setup-python@v2 28 | with: 29 | python-version: "3.8" 30 | 31 | - name: Install dependencies 32 | run: | 33 | python -m pip install --upgrade pip 34 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 35 | 36 | - name: Test with Pytest 37 | run: | 38 | pytest ${{github.workspace}}/inb/tests/ -v 39 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | altgraph==0.17 2 | astroid==2.9.0 3 | attrs==22.2.0 4 | beautifulsoup4==4.11.2 5 | bs4==0.0.1 6 | CacheControl==0.12.6 7 | cachetools==4.2.2 8 | certifi==2021.5.30 9 | cffi==1.14.5 10 | chardet==4.0.0 11 | click==8.0.3 12 | colorama==0.4.4 13 | commonmark==0.9.1 14 | configparser==5.0.2 15 | crayons==0.4.0 16 | cryptography==3.4.7 17 | exceptiongroup==1.1.0 18 | fernet==1.0.1 19 | grpcio==1.38.1 20 | httplib2==0.19.1 21 | idna==2.10 22 | importlib-metadata==4.5.0 23 | iniconfig==2.0.0 24 | isort==5.10.1 25 | lazy-object-proxy==1.6.0 26 | lxml==4.9.2 27 | mccabe==0.6.1 28 | msgpack==1.0.2 29 | nameparser==1.0.6 30 | packaging==20.9 31 | platformdirs==2.4.0 32 | pluggy==1.0.0 33 | proto-plus==1.18.1 34 | protobuf==3.17.3 35 | psutil==5.9.4 36 | pyaes==1.6.1 37 | pyasn1==0.4.8 38 | pyasn1-modules==0.2.8 39 | pycodestyle==2.7.0 40 | pycparser==2.20 41 | pyfiglet==0.8.post1 42 | Pygments==2.9.0 43 | pyinstaller-hooks-contrib==2021.4 44 | pylint==2.12.2 45 | pyparsing==2.4.7 46 | PySocks==1.7.1 47 | pytest==7.2.2 48 | pytest-mock==3.10.0 49 | python-dateutil==2.8.1 50 | pytz==2021.1 51 | requests==2.25.1 52 | rsa==4.7.2 53 | six==1.16.0 54 | smmap==4.0.0 55 | soupsieve==2.4 56 | toml==0.10.2 57 | tomli==2.0.1 58 | tqdm==4.62.3 59 | typed-ast==1.5.1 60 | typing-extensions==3.10.0.0 61 | uritemplate==3.0.1 62 | urllib3==1.26.5 63 | webdriver-manager==3.2.2 64 | wget==3.2 65 | wrapt==1.13.3 66 | yapf==0.32.0 67 | zipp==3.4.1 68 | -------------------------------------------------------------------------------- /.github/workflows/pylint.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | name: Pylint 16 | 17 | on: [push, pull_request] 18 | 19 | jobs: 20 | build: 21 | runs-on: ubuntu-latest 22 | 23 | strategy: 24 | matrix: 25 | python-version: ["3.8"] 26 | 27 | steps: 28 | - uses: actions/checkout@v2 29 | 30 | - name: Set up Python ${{ matrix.python-version }} 31 | uses: actions/setup-python@v2 32 | with: 33 | python-version: ${{ matrix.python-version }} 34 | 35 | - name: Install dependencies 36 | run: | 37 | python -m pip install --upgrade pip 38 | pip install pylint 39 | 40 | - name: Analysing the code with pylint 41 | run: | 42 | pylint --rcfile=.pylintrc $(find . -name "*.py" | xargs) 43 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | | Name | About | Labels | 2 | | ---------- | ---------------------------------- | ----------------------------------------------------------------------------- | 3 | | Bug report | Create a report to help us improve | "🛠 goal: fix, 🚦 status: awaiting triage, 💻 aspect: code, 🟧 priority: high" | 4 | 5 | ## Description 6 | 7 | Write a succinct bug description here. 8 | 9 | ## Reproduction 10 | 11 | Provide detailed steps to reproduce the bug. 12 | 13 | 1. Step 1 ... 14 | 2. Step 2 ... 15 | 3. Step 3 ... 16 | 4. See error. 17 | 18 | ## Expectation 19 | 20 | Succinctly describe what you expected to happen. 21 | 22 | ## Screenshots 23 | 24 | Add screenshots (if possible) to show the problem; or delete the section entirely. 25 | 26 | ## Environment 27 | 28 | Please complete this, unless you are certain the problem is not environment specific. 29 | 30 | - Device: (_eg._ laptop; PC) 31 | - OS: (_eg._ iOS 13.5; Fedora 32; Windows; Ubuntu; Kali Linux) 32 | - Interpreter: (_eg._ python; python3) 33 | - Other info: (_eg._ Chrome Driver version; Google Chrome Version) 34 | 35 | ## Additional context 36 | 37 | Add any other context about the problem here; or delete the section entirely. 38 | 39 | ## Resolution 40 | 41 | Replace the [ ] with [x] to check the box. 42 | 43 | - [ ] I would be interested in resolving this bug. 44 | -------------------------------------------------------------------------------- /inb/tests/test_utils.py: -------------------------------------------------------------------------------- 1 | # pylint: disable=missing-module-docstring 2 | 3 | # Copyright 2023 The inb Authors. All Rights Reserved. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | from api.utils import utils 18 | 19 | 20 | def test_get_id_from_urn(): 21 | urn = 'urn:li:fs_miniProfile:1234567890abcdef' 22 | assert utils.get_id_from_urn(urn) == '1234567890abcdef' 23 | 24 | urn = 'urn:li:fs_miniProfile:abc1234567890def' 25 | assert utils.get_id_from_urn(urn) == 'abc1234567890def' 26 | 27 | urn = 'urn:li:fs_miniProfile:12:34:56:78:90' 28 | assert utils.get_id_from_urn(urn) == '12' 29 | 30 | 31 | def test_generate_tracking_id(): 32 | tracking_id = utils.generate_tracking_id() 33 | assert len(tracking_id) == 24 34 | assert isinstance(tracking_id, str) 35 | 36 | for char in tracking_id: 37 | assert char.isalnum() or char in ['+', '/', '='] 38 | 39 | assert tracking_id != utils.generate_tracking_id() 40 | -------------------------------------------------------------------------------- /inb/api/settings.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 The inb Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | """A configuration file for all the directory paths and logging settings.""" 16 | 17 | import os 18 | import pathlib 19 | 20 | USER_HOME_DIR = pathlib.Path.home() 21 | INB_USER_DIR = USER_HOME_DIR / '.inb/' 22 | INB_COOKIE_DIR = INB_USER_DIR / 'cookies/' 23 | INB_LOG_DIR = INB_USER_DIR / 'logs' 24 | 25 | # Variable's value decides whether logging to stream is allowed 26 | # in the entire project. 27 | LOGGING_TO_STREAM_ENABLED = False 28 | 29 | # Create the required directories for storing bot related data. 30 | if not os.path.exists(INB_USER_DIR): 31 | os.makedirs(INB_USER_DIR) 32 | if not os.path.exists(INB_COOKIE_DIR): 33 | os.makedirs(INB_COOKIE_DIR) 34 | 35 | # We want to create the log directory if it does not exists 36 | # otherwise the file handlers for loggers used in other modules 37 | # will complain about its absence. 38 | if not os.path.exists(INB_LOG_DIR): 39 | os.makedirs(INB_LOG_DIR) 40 | 41 | LOG_FORMAT_STR = ( 42 | '%(asctime)s:%(name)s:%(levelname)s:%(funcName)s\n%(message)s') 43 | 44 | INB_VERSION = '1.0.0' 45 | -------------------------------------------------------------------------------- /docs/styleguide.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # Style Guide 4 | 5 | Use a consistent coding style provided by [Google Python Style guide](https://google.github.io/styleguide/pyguide.html) which I recommend reading because they also provide information on how to disable [pylint][_pylint] if that's a requirement. 6 | 7 | ## [`yapf`][_yapf] 8 | 9 | In order to be consistent with the rest of the coding style use [`yapf`][_yapf] (A Google Python code formatter). 10 | 11 | ### Installation 12 | 13 | ```shell 14 | python3 -m pip install yapf 15 | ``` 16 | 17 | ### Settings 18 | 19 | Use the following settings to configure [`yapf`][_yapf] for your workspace in [vscode](https://code.visualstudio.com/). 20 | 21 | ```json 22 | { 23 | "python.formatting.provider": "yapf", 24 | "python.formatting.yapfArgs": [ 25 | "--style={based_on_style: google, column_limit: 80, indent_width: 2}" 26 | ] 27 | } 28 | ``` 29 | 30 |
31 | 32 | 33 | ![Back to top][back_to_top] 34 | 35 | 36 |
37 | 38 | ## [`pylint`][_pylint] 39 | 40 | In addition to [`yapf`][_yapf] also install [`pylint`][_pylint] to find out bugs in your code, check the quality of your code and more. 41 | 42 | ### Installation 43 | 44 | ```shell 45 | python3 -m pip install pylint 46 | ``` 47 | 48 | ### Settings 49 | 50 | ```json 51 | { 52 | "python.linting.enabled": true, 53 | "python.linting.pylintPath": "pylint", 54 | "python.linting.pylintEnabled": true 55 | } 56 | ``` 57 | 58 |
59 | 60 | 61 | ![Back to top][back_to_top] 62 | 63 | 64 |
65 | 66 | 67 | 68 | [_yapf]: https://github.com/google/yapf 69 | [_pylint]: https://pypi.org/project/pylint/ 70 | 71 | 72 | 73 | [back_to_top]: https://img.shields.io/badge/-Back%20to%20top-lightgrey 74 | -------------------------------------------------------------------------------- /inb/tests/test_settings.py: -------------------------------------------------------------------------------- 1 | # pylint: disable=missing-module-docstring 2 | 3 | # Copyright 2023 The inb Authors. All Rights Reserved. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | from api import settings 18 | 19 | 20 | def test_user_home_dir(): 21 | assert settings.USER_HOME_DIR.is_dir() 22 | 23 | 24 | def test_inb_user_dir(): 25 | assert settings.INB_USER_DIR.is_dir() 26 | assert str(settings.INB_USER_DIR).startswith(str(settings.USER_HOME_DIR)) 27 | 28 | 29 | def test_inb_cookie_dir(): 30 | assert settings.INB_COOKIE_DIR.is_dir() 31 | assert str(settings.INB_COOKIE_DIR).startswith(str(settings.INB_USER_DIR)) 32 | assert str(settings.INB_COOKIE_DIR).endswith('/cookies') 33 | 34 | 35 | def test_inb_log_dir(): 36 | assert settings.INB_LOG_DIR.is_dir() 37 | assert str(settings.INB_LOG_DIR).startswith(str(settings.USER_HOME_DIR)) 38 | assert str(settings.INB_LOG_DIR).endswith('/.inb/logs') 39 | 40 | 41 | def test_logging_to_stream_enabled(): 42 | assert not settings.LOGGING_TO_STREAM_ENABLED 43 | 44 | 45 | def test_log_format_str(): 46 | assert 'asctime' in settings.LOG_FORMAT_STR 47 | assert 'name' in settings.LOG_FORMAT_STR 48 | assert 'levelname' in settings.LOG_FORMAT_STR 49 | assert 'funcName' in settings.LOG_FORMAT_STR 50 | assert 'message' in settings.LOG_FORMAT_STR 51 | 52 | assert settings.LOG_FORMAT_STR.startswith('%(asctime)s') 53 | assert settings.LOG_FORMAT_STR.endswith('%(message)s') 54 | 55 | 56 | def test_inb_version(): 57 | assert settings.INB_VERSION == '1.0.0' 58 | -------------------------------------------------------------------------------- /DEVELOPERS.md: -------------------------------------------------------------------------------- 1 | # Developing inb 2 | 3 | ## Git Commit Guidelines 4 | 5 | inb follows [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). This leads to **more readable messages** 6 | that are easy to follow when looking through the **project history**. Also, these git commit messages are used to **generate the [changelog](changelog)**. 7 | 8 | ### Commit Message Format 9 | 10 | Each commit message consists of a **header**, a **body** and a **footer**. The header has a special format that includes a **type**, a **scope** and a **subject**: 11 | 12 | ``` 13 | (): 14 | 15 | 16 | 17 |