├── .coveragerc
├── .editorconfig
├── .github
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── PULL_REQUEST_TEMPLATE.md
└── workflows
│ └── main.yml
├── .gitignore
├── .pylintrc
├── DEVELOPMENT.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── art
├── doge_spin.svg
├── halo.png
└── persist_spin.svg
├── examples
├── __init__.py
├── colored_text_spin.py
├── context_manager.py
├── custom_spins.py
├── doge_spin.py
├── loader_spin.py
├── long_text.py
├── notebook.ipynb
├── persist_spin.py
└── stream_change.py
├── halo
├── __init__.py
├── _utils.py
├── cursor.py
├── halo.py
└── halo_notebook.py
├── requirements-dev.txt
├── requirements.txt
├── setup.cfg
├── setup.py
├── tests
├── __init__.py
├── _utils.py
├── test_halo.py
└── test_halo_notebook.py
└── tox.ini
/.coveragerc:
--------------------------------------------------------------------------------
1 | [report]
2 | show_missing = True
3 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | end_of_line = lf
5 | insert_final_newline = true
6 | indent_style = space
7 | indent_size = 2
8 |
9 | [*.py]
10 | indent_size = 4
11 |
--------------------------------------------------------------------------------
/.github/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # How to contribute?
2 |
3 | ## Development Guidelines
4 |
5 | Please read [development guidelines](https://github.com/manrajgrover/halo/blob/master/DEVELOPMENT.md) inorder to setup dev environment and run tests.
6 |
7 | ## Steps to contribute
8 |
9 | * Look for a issue or open a new one in [project issues](https://github.com/manrajgrover/halo/issues)
10 | * Fork the project
11 | * Clone to your machine based on your forked project
12 | * Create a new branch with an intuitive name. Take a look in concept of [feature branch](https://martinfowler.com/bliki/FeatureBranch.html)
13 | * Code your change / fix / new feature
14 | * Run tests
15 | * When the tests pass you are free to commit and push
16 | * Open a Pull Request with a description and the issue reference
17 |
18 | ## Best Practices
19 |
20 | Let's try to keep the code as simple and clean as we can. Some good pratices to follow during the contributing process:
21 |
22 | - **Respect the PEP8**: don't forget to check the [PEP8](https://www.python.org/dev/peps/pep-0008/) complains;
23 | - **Write Tests**: **always** write tests for your code
24 | - **Keep the Cordiality**: be polite and kind; words like please and thank you are welcome :)
25 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 | ## Description
13 |
14 |
15 | ### System settings
16 |
17 | - Operating System:
18 | - Terminal in use:
19 | - Python version:
20 | - Halo version:
21 | - `pip freeze` output:
22 |
23 | ### Error
24 |
25 |
26 | ### Expected behaviour
27 |
28 |
29 | ## Steps to recreate
30 |
31 |
32 | ## People to notify
33 |
34 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
8 |
9 | ## Description of new feature, or changes
10 |
11 |
12 | ## Checklist
13 |
14 | - [ ] Your branch is up-to-date with the base branch
15 | - [ ] You've included at least one test if this is a new feature
16 | - [ ] All tests are passing
17 |
18 | ## Related Issues and Discussions
19 |
20 |
21 |
22 | ## People to notify
23 |
24 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: halo
2 |
3 | on:
4 | push:
5 | branches: [ "master" ]
6 | pull_request:
7 | branches: [ "master" ]
8 |
9 | jobs:
10 | test:
11 | name: Test with ${{ matrix.python-version }} on ${{ matrix.os }}
12 | runs-on: ${{ matrix.os }}
13 | strategy:
14 | fail-fast: false
15 | matrix:
16 | python-version:
17 | - "3.8"
18 | - "3.9"
19 | - "3.10"
20 | - "3.11"
21 | os:
22 | - ubuntu-latest
23 | - macos-latest
24 | - windows-latest
25 |
26 | steps:
27 | - uses: actions/checkout@v4
28 | - name: Setup python for test ${{ matrix.python-version }}
29 | uses: actions/setup-python@v3
30 | with:
31 | python-version: ${{ matrix.python-version }}
32 | - name: Install dependencies
33 | run: |
34 | python --version
35 | python -m pip install --upgrade pip setuptools wheel
36 | pip --version
37 | python -m pip install --upgrade tox tox-gh>=1.2
38 | tox --version
39 | - name: Run tox targets for ${{ matrix.python-version }}
40 | run: |
41 | python -m tox
42 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 |
49 | # Translations
50 | *.mo
51 | *.pot
52 |
53 | # Django stuff:
54 | *.log
55 | local_settings.py
56 |
57 | # Flask stuff:
58 | instance/
59 | .webassets-cache
60 |
61 | # Scrapy stuff:
62 | .scrapy
63 |
64 | # Sphinx documentation
65 | docs/_build/
66 |
67 | # PyBuilder
68 | target/
69 |
70 | # Jupyter Notebook
71 | .ipynb_checkpoints
72 |
73 | # pyenv
74 | .python-version
75 |
76 | # celery beat schedule file
77 | celerybeat-schedule
78 |
79 | # SageMath parsed files
80 | *.sage.py
81 |
82 | # dotenv
83 | .env
84 |
85 | # virtualenv
86 | .venv
87 | venv/
88 | ENV/
89 |
90 | # Spyder project settings
91 | .spyderproject
92 | .spyproject
93 |
94 | # Rope project settings
95 | .ropeproject
96 |
97 | # mkdocs documentation
98 | /site
99 |
100 | # mypy
101 | .mypy_cache/
102 |
103 | # Coverage
104 | cover/
105 |
106 | # tests
107 | tests/*.txt
108 | .pytest_cache
109 |
110 | # OS-specific files
111 | .DS_Store
112 |
113 | # IDE settings
114 | .vscode/
115 |
116 | # Idea
117 | .idea
--------------------------------------------------------------------------------
/.pylintrc:
--------------------------------------------------------------------------------
1 | [MAIN]
2 |
3 | # Python code to execute, usually for sys.path manipulation such as
4 | # pygtk.require().
5 | #init-hook=
6 |
7 | # Files or directories to be skipped. They should be base names, not
8 | # paths.
9 | ignore=CVS
10 |
11 | # Add files or directories matching the regex patterns to the ignore-list. The
12 | # regex matches against paths and can be in Posix or Windows format.
13 | ignore-paths=
14 |
15 | # Files or directories matching the regex patterns are skipped. The regex
16 | # matches against base names, not paths.
17 | ignore-patterns=^\.#
18 |
19 | # Pickle collected data for later comparisons.
20 | persistent=yes
21 |
22 | # List of plugins (as comma separated values of python modules names) to load,
23 | # usually to register additional checkers.
24 | load-plugins=
25 | pylint.extensions.check_elif,
26 | pylint.extensions.bad_builtin,
27 | pylint.extensions.docparams,
28 | pylint.extensions.for_any_all,
29 | pylint.extensions.set_membership,
30 | pylint.extensions.code_style,
31 | pylint.extensions.overlapping_exceptions,
32 | pylint.extensions.typing,
33 | pylint.extensions.redefined_variable_type,
34 | pylint.extensions.comparison_placement,
35 | pylint.extensions.broad_try_clause,
36 | pylint.extensions.dict_init_mutate,
37 | pylint.extensions.consider_refactoring_into_while_condition,
38 |
39 | # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
40 | # number of processors available to use.
41 | jobs=1
42 |
43 | # When enabled, pylint would attempt to guess common misconfiguration and emit
44 | # user-friendly hints instead of false-positive error messages.
45 | suggestion-mode=yes
46 |
47 | # Allow loading of arbitrary C extensions. Extensions are imported into the
48 | # active Python interpreter and may run arbitrary code.
49 | unsafe-load-any-extension=no
50 |
51 | # A comma-separated list of package or module names from where C extensions may
52 | # be loaded. Extensions are loading into the active Python interpreter and may
53 | # run arbitrary code
54 | extension-pkg-allow-list=
55 |
56 | # Minimum supported python version
57 | py-version = 3.8.0
58 |
59 | # Control the amount of potential inferred values when inferring a single
60 | # object. This can help the performance when dealing with large functions or
61 | # complex, nested conditions.
62 | limit-inference-results=100
63 |
64 | # Specify a score threshold under which the program will exit with error.
65 | fail-under=10.0
66 |
67 | # Return non-zero exit code if any of these messages/categories are detected,
68 | # even if score is above --fail-under value. Syntax same as enable. Messages
69 | # specified are enabled, while categories only check already-enabled messages.
70 | fail-on=
71 |
72 | # Clear in-memory caches upon conclusion of linting. Useful if running pylint in
73 | # a server-like mode.
74 | clear-cache-post-run=no
75 |
76 |
77 | [MESSAGES CONTROL]
78 |
79 | # Only show warnings with the listed confidence levels. Leave empty to show
80 | # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
81 | # confidence=
82 |
83 | # Enable the message, report, category or checker with the given id(s). You can
84 | # either give multiple identifier separated by comma (,) or put this option
85 | # multiple time (only on the command line, not in the configuration file where
86 | # it should appear only once). See also the "--disable" option for examples.
87 | enable=
88 | use-symbolic-message-instead,
89 | useless-suppression,
90 |
91 | # Disable the message, report, category or checker with the given id(s). You
92 | # can either give multiple identifiers separated by comma (,) or put this
93 | # option multiple times (only on the command line, not in the configuration
94 | # file where it should appear only once).You can also use "--disable=all" to
95 | # disable everything first and then re-enable specific checks. For example, if
96 | # you want to run only the similarities checker, you can use "--disable=all
97 | # --enable=similarities". If you want to run only the classes checker, but have
98 | # no Warning level messages displayed, use"--disable=all --enable=classes
99 | # --disable=W"
100 |
101 | disable=
102 | attribute-defined-outside-init,
103 | invalid-name,
104 | missing-docstring,
105 | protected-access,
106 | too-few-public-methods,
107 | # handled by black
108 | format,
109 | # We anticipate #3512 where it will become optional
110 | fixme,
111 | consider-using-assignment-expr,
112 |
113 |
114 | [REPORTS]
115 |
116 | # Set the output format. Available formats are text, parseable, colorized, msvs
117 | # (visual studio) and html. You can also give a reporter class, eg
118 | # mypackage.mymodule.MyReporterClass.
119 | output-format=text
120 |
121 | # Tells whether to display a full report or only the messages
122 | reports=no
123 |
124 | # Python expression which should return a note less than 10 (10 is the highest
125 | # note). You have access to the variables 'fatal', 'error', 'warning', 'refactor', 'convention'
126 | # and 'info', which contain the number of messages in each category, as
127 | # well as 'statement', which is the total number of statements analyzed. This
128 | # score is used by the global evaluation report (RP0004).
129 | evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
130 |
131 | # Template used to display messages. This is a python new-style format string
132 | # used to format the message information. See doc for all details
133 | #msg-template=
134 |
135 | # Activate the evaluation score.
136 | score=yes
137 |
138 |
139 | [LOGGING]
140 |
141 | # Logging modules to check that the string format arguments are in logging
142 | # function parameter format
143 | logging-modules=logging
144 |
145 | # The type of string formatting that logging methods do. `old` means using %
146 | # formatting, `new` is for `{}` formatting.
147 | logging-format-style=old
148 |
149 |
150 | [MISCELLANEOUS]
151 |
152 | # List of note tags to take in consideration, separated by a comma.
153 | notes=FIXME,XXX,TODO
154 |
155 | # Regular expression of note tags to take in consideration.
156 | #notes-rgx=
157 |
158 |
159 | [SIMILARITIES]
160 |
161 | # Minimum lines number of a similarity.
162 | min-similarity-lines=6
163 |
164 | # Ignore comments when computing similarities.
165 | ignore-comments=yes
166 |
167 | # Ignore docstrings when computing similarities.
168 | ignore-docstrings=yes
169 |
170 | # Ignore imports when computing similarities.
171 | ignore-imports=yes
172 |
173 | # Signatures are removed from the similarity computation
174 | ignore-signatures=yes
175 |
176 |
177 | [VARIABLES]
178 |
179 | # Tells whether we should check for unused import in __init__ files.
180 | init-import=no
181 |
182 | # List of additional names supposed to be defined in builtins. Remember that
183 | # you should avoid defining new builtins when possible.
184 | additional-builtins=
185 |
186 | # List of strings which can identify a callback function by name. A callback
187 | # name must start or end with one of those strings.
188 | callbacks=cb_,_cb
189 |
190 | # Tells whether unused global variables should be treated as a violation.
191 | allow-global-unused-variables=yes
192 |
193 | # List of names allowed to shadow builtins
194 | allowed-redefined-builtins=
195 |
196 | # List of qualified module names which can have objects that can redefine
197 | # builtins.
198 | redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
199 |
200 |
201 | [FORMAT]
202 |
203 | # Maximum number of characters on a single line.
204 | max-line-length=100
205 |
206 | # Regexp for a line that is allowed to be longer than the limit.
207 | ignore-long-lines=^\s*(# )??$
208 |
209 | # Allow the body of an if to be on the same line as the test if there is no
210 | # else.
211 | single-line-if-stmt=no
212 |
213 | # Allow the body of a class to be on the same line as the declaration if body
214 | # contains single statement.
215 | single-line-class-stmt=no
216 |
217 | # Maximum number of lines in a module
218 | max-module-lines=2000
219 |
220 | # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
221 | # tab).
222 | indent-string=' '
223 |
224 | # Number of spaces of indent required inside a hanging or continued line.
225 | indent-after-paren=4
226 |
227 | # Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
228 | expected-line-ending-format=
229 |
230 |
231 | [BASIC]
232 |
233 | # Good variable names which should always be accepted, separated by a comma
234 | good-names=i,j,k,ex,Run,_
235 |
236 | # Good variable names regexes, separated by a comma. If names match any regex,
237 | # they will always be accepted
238 | good-names-rgxs=
239 |
240 | # Bad variable names which should always be refused, separated by a comma
241 | bad-names=foo,bar,baz,toto,tutu,tata
242 |
243 | # Bad variable names regexes, separated by a comma. If names match any regex,
244 | # they will always be refused
245 | bad-names-rgxs=
246 |
247 | # Colon-delimited sets of names that determine each other's naming style when
248 | # the name regexes allow several styles.
249 | name-group=
250 |
251 | # Include a hint for the correct naming format with invalid-name
252 | include-naming-hint=no
253 |
254 | # Naming style matching correct function names.
255 | function-naming-style=snake_case
256 |
257 | # Regular expression matching correct function names
258 | function-rgx=[a-z_][a-z0-9_]{2,30}$
259 |
260 | # Naming style matching correct variable names.
261 | variable-naming-style=snake_case
262 |
263 | # Regular expression matching correct variable names
264 | variable-rgx=[a-z_][a-z0-9_]{2,30}$
265 |
266 | # Naming style matching correct constant names.
267 | const-naming-style=UPPER_CASE
268 |
269 | # Regular expression matching correct constant names
270 | const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
271 |
272 | # Naming style matching correct attribute names.
273 | attr-naming-style=snake_case
274 |
275 | # Regular expression matching correct attribute names
276 | attr-rgx=[a-z_][a-z0-9_]{2,}$
277 |
278 | # Naming style matching correct argument names.
279 | argument-naming-style=snake_case
280 |
281 | # Regular expression matching correct argument names
282 | argument-rgx=[a-z_][a-z0-9_]{2,30}$
283 |
284 | # Naming style matching correct class attribute names.
285 | class-attribute-naming-style=any
286 |
287 | # Regular expression matching correct class attribute names
288 | class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
289 |
290 | # Naming style matching correct class constant names.
291 | class-const-naming-style=UPPER_CASE
292 |
293 | # Regular expression matching correct class constant names. Overrides class-
294 | # const-naming-style.
295 | #class-const-rgx=
296 |
297 | # Naming style matching correct inline iteration names.
298 | inlinevar-naming-style=any
299 |
300 | # Regular expression matching correct inline iteration names
301 | inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
302 |
303 | # Naming style matching correct class names.
304 | class-naming-style=PascalCase
305 |
306 | # Regular expression matching correct class names
307 | class-rgx=[A-Z_][a-zA-Z0-9]+$
308 |
309 |
310 | # Naming style matching correct module names.
311 | module-naming-style=snake_case
312 |
313 | # Regular expression matching correct module names
314 | module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
315 |
316 |
317 | # Naming style matching correct method names.
318 | method-naming-style=snake_case
319 |
320 | # Regular expression matching correct method names
321 | method-rgx=[a-z_][a-z0-9_]{2,}$
322 |
323 | # Regular expression matching correct type variable names
324 | #typevar-rgx=
325 |
326 | # Regular expression which should only match function or class names that do
327 | # not require a docstring. Use ^(?!__init__$)_ to also check __init__.
328 | no-docstring-rgx=__.*__
329 |
330 | # Minimum line length for functions/classes that require docstrings, shorter
331 | # ones are exempt.
332 | docstring-min-length=-1
333 |
334 | # List of decorators that define properties, such as abc.abstractproperty.
335 | property-classes=abc.abstractproperty
336 |
337 |
338 | [TYPECHECK]
339 |
340 | # Regex pattern to define which classes are considered mixins if ignore-mixin-
341 | # members is set to 'yes'
342 | mixin-class-rgx=.*MixIn
343 |
344 | # List of module names for which member attributes should not be checked and
345 | # will not be imported (useful for modules/projects where namespaces are
346 | # manipulated during runtime and thus existing member attributes cannot be
347 | # deduced by static analysis). It supports qualified module names, as well
348 | # as Unix pattern matching.
349 | ignored-modules=
350 |
351 | # List of class names for which member attributes should not be checked (useful
352 | # for classes with dynamically set attributes). This supports the use of
353 | # qualified names.
354 | ignored-classes=SQLObject, optparse.Values, thread._local, _thread._local
355 |
356 | # List of members which are set dynamically and missed by pylint inference
357 | # system, and so shouldn't trigger E1101 when accessed. Python regular
358 | # expressions are accepted.
359 | generated-members=REQUEST,acl_users,aq_parent,argparse.Namespace
360 |
361 | # List of decorators that create context managers from functions, such as
362 | # contextlib.contextmanager.
363 | contextmanager-decorators=contextlib.contextmanager
364 |
365 | # Tells whether to warn about missing members when the owner of the attribute
366 | # is inferred to be None.
367 | ignore-none=yes
368 |
369 | # This flag controls whether pylint should warn about no-member and similar
370 | # checks whenever an opaque object is returned when inferring. The inference
371 | # can return multiple potential results while evaluating a Python object, but
372 | # some branches might not be evaluated, which results in partial inference. In
373 | # that case, it might be useful to still emit no-member and other checks for
374 | # the rest of the inferred objects.
375 | ignore-on-opaque-inference=yes
376 |
377 | # Show a hint with possible names when a member name was not found. The aspect
378 | # of finding the hint is based on edit distance.
379 | missing-member-hint=yes
380 |
381 | # The minimum edit distance a name should have in order to be considered a
382 | # similar match for a missing member name.
383 | missing-member-hint-distance=1
384 |
385 | # The total number of similar names that should be taken in consideration when
386 | # showing a hint for a missing member.
387 | missing-member-max-choices=1
388 |
389 | [SPELLING]
390 |
391 | # Spelling dictionary name. Available dictionaries: none. To make it working
392 | # install python-enchant package.
393 | spelling-dict=
394 |
395 | # List of comma separated words that should not be checked.
396 | spelling-ignore-words=
397 |
398 | # List of comma separated words that should be considered directives if they
399 | # appear and the beginning of a comment and should not be checked.
400 | spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:,pragma:,# noinspection
401 |
402 | # A path to a file that contains private dictionary; one word per line.
403 | spelling-private-dict-file=.pyenchant_pylint_custom_dict.txt
404 |
405 | # Tells whether to store unknown words to indicated private dictionary in
406 | # --spelling-private-dict-file option instead of raising a message.
407 | spelling-store-unknown-words=no
408 |
409 | # Limits count of emitted suggestions for spelling mistakes.
410 | max-spelling-suggestions=2
411 |
412 |
413 | [DESIGN]
414 |
415 | # Maximum number of arguments for function / method
416 | max-args = 9
417 |
418 | # Maximum number of locals for function / method body
419 | max-locals = 19
420 |
421 | # Maximum number of return / yield for function / method body
422 | max-returns=11
423 |
424 | # Maximum number of branch for function / method body
425 | max-branches = 20
426 |
427 | # Maximum number of statements in function / method body
428 | max-statements = 50
429 |
430 | # Maximum number of attributes for a class (see R0902).
431 | max-attributes=11
432 |
433 | # Maximum number of statements in a try-block
434 | max-try-statements = 7
435 |
436 | [CLASSES]
437 |
438 | # List of method names used to declare (i.e. assign) instance attributes.
439 | defining-attr-methods=__init__,__new__,setUp,__post_init__
440 |
441 | # List of valid names for the first argument in a class method.
442 | valid-classmethod-first-arg=cls
443 |
444 | # List of valid names for the first argument in a metaclass class method.
445 | valid-metaclass-classmethod-first-arg=mcs
446 |
447 | # List of member names, which should be excluded from the protected access
448 | # warning.
449 | exclude-protected=_asdict,_fields,_replace,_source,_make
450 |
451 | # Warn about protected attribute access inside special methods
452 | check-protected-access-in-special-methods=no
453 |
454 | [IMPORTS]
455 |
456 | # List of modules that can be imported at any level, not just the top level
457 | # one.
458 | allow-any-import-level=
459 |
460 | # Allow wildcard imports from modules that define __all__.
461 | allow-wildcard-with-all=no
462 |
463 | # Allow explicit reexports by alias from a package __init__.
464 | allow-reexport-from-package=no
465 |
466 | # Analyse import fallback blocks. This can be used to support both Python 2 and
467 | # 3 compatible code, which means that the block might have code that exists
468 | # only in one or another interpreter, leading to false positives when analysed.
469 | analyse-fallback-blocks=no
470 |
471 | # Deprecated modules which should not be used, separated by a comma
472 | deprecated-modules=regsub,TERMIOS,Bastion,rexec
473 |
474 | # Create a graph of every (i.e. internal and external) dependencies in the
475 | # given file (report RP0402 must not be disabled)
476 | import-graph=
477 |
478 | # Create a graph of external dependencies in the given file (report RP0402 must
479 | # not be disabled)
480 | ext-import-graph=
481 |
482 | # Create a graph of internal dependencies in the given file (report RP0402 must
483 | # not be disabled)
484 | int-import-graph=
485 |
486 | # Force import order to recognize a module as part of the standard
487 | # compatibility libraries.
488 | known-standard-library=_string
489 |
490 | # Force import order to recognize a module as part of a third party library.
491 | known-third-party=enchant
492 |
493 | # Couples of modules and preferred modules, separated by a comma.
494 | preferred-modules=
495 |
496 |
497 | [EXCEPTIONS]
498 |
499 | # Exceptions that will emit a warning when being caught. Defaults to
500 | # "Exception"
501 | overgeneral-exceptions=builtins.Exception
502 |
503 |
504 | [TYPING]
505 |
506 | # Set to ``no`` if the app / library does **NOT** need to support runtime
507 | # introspection of type annotations. If you use type annotations
508 | # **exclusively** for type checking of an application, you're probably fine.
509 | # For libraries, evaluate if some users what to access the type hints at
510 | # runtime first, e.g., through ``typing.get_type_hints``. Applies to Python
511 | # versions 3.7 - 3.9
512 | runtime-typing = no
513 |
514 |
515 | [DEPRECATED_BUILTINS]
516 |
517 | # List of builtins function names that should not be used, separated by a comma
518 | bad-functions=map,input
519 |
520 |
521 | [REFACTORING]
522 |
523 | # Maximum number of nested blocks for function / method body
524 | max-nested-blocks=5
525 |
526 | # Complete name of functions that never returns. When checking for
527 | # inconsistent-return-statements if a never returning function is called then
528 | # it will be considered as an explicit return statement and no message will be
529 | # printed.
530 | never-returning-functions=sys.exit,argparse.parse_error
531 |
532 |
533 | [STRING]
534 |
535 | # This flag controls whether inconsistent-quotes generates a warning when the
536 | # character used as a quote delimiter is used inconsistently within a module.
537 | check-quote-consistency=no
538 |
539 | # This flag controls whether the implicit-str-concat should generate a warning
540 | # on implicit string concatenation in sequences defined over several lines.
541 | check-str-concat-over-line-jumps=no
542 |
543 |
544 | [CODE_STYLE]
545 |
546 | # Max line length for which to sill emit suggestions. Used to prevent optional
547 | # suggestions which would get split by a code formatter (e.g., black). Will
548 | # default to the setting for ``max-line-length``.
549 | #max-line-length-suggestions=
--------------------------------------------------------------------------------
/DEVELOPMENT.md:
--------------------------------------------------------------------------------
1 | ## Development
2 |
3 | We need to clone the project and prepare the dev environment:
4 |
5 | ```bash
6 | $ git clone https://github.com/manrajgrover/halo.git // or using ssh: git@github.com:manrajgrover/halo.git
7 | $ cd halo
8 | $ pip install -e .
9 | ```
10 |
11 | This will install all requirements to use `halo`. You may want to create a virtual environment specifically for this.
12 |
13 | To install development dependencies, run:
14 |
15 | ```bash
16 | $ pip install -r requirements-dev.txt
17 | ```
18 |
19 | #### Testing
20 | Before submitting a pull request, make sure the code passes all the tests and is clean of lint errors:
21 |
22 | ```bash
23 | $ tox
24 | ```
25 |
26 | To run tests for specific environment, run:
27 |
28 | For Python 3.6:
29 |
30 | ```bash
31 | $ tox -e py36
32 | ```
33 |
34 | For checking lint issues:
35 |
36 | ```bash
37 | $ tox -e lint
38 | ```
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Manraj Singh
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include requirements.txt
2 | include requirements-dev.txt
3 | include LICENSE
4 | include README.md
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |