From 3e981c3f29e3a92ee30bc748526a7f6a098e4a99 Mon Sep 17 00:00:00 2001 From: Erick Daniszewski Date: Fri, 26 Oct 2018 10:26:25 -0400 Subject: [PATCH] fix bug with recursive getter, remove pipenv, tox updates (#9) * fix bug with recursive getter, remove pipenv, tox updates * build dep * build dep * ... * . --- .travis.yml | 7 +- Makefile | 27 ++--- Pipfile | 19 ---- Pipfile.lock | 241 ------------------------------------------- bison/__init__.py | 7 +- bison/__version__.py | 2 +- bison/utils.py | 4 +- requirements.txt | 7 ++ setup.cfg | 5 + tests/test_bison.py | 19 ++++ tox.ini | 32 +++++- 11 files changed, 77 insertions(+), 293 deletions(-) delete mode 100644 Pipfile delete mode 100644 Pipfile.lock create mode 100644 requirements.txt diff --git a/.travis.yml b/.travis.yml index f0b4436..8e88510 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,12 @@ python: - "3.6" # install dependencies -install: "make" +install: pip install tox-travis # run tests and linting script: - - pip install pipenv --upgrade - - make init - - make ci + - tox + - tox -e lint after_success: - coveralls \ No newline at end of file diff --git a/Makefile b/Makefile index 06c4719..bb9b176 100644 --- a/Makefile +++ b/Makefile @@ -2,34 +2,23 @@ # bison - python application configuration # -HAS_PIPENV := $(shell which pipenv) PKG_VERSION := $(shell cat bison/__version__.py | grep __version__ | awk '{print $$3}') -requires-pipenv: -ifndef HAS_PIPENV - @echo "pipenv required, but not found: run 'pip install pipenv --upgrade'" - exit 1 -endif - -.PHONY: init -init: requires-pipenv ## Initialize the project for development - pipenv install --dev --skip-lock .PHONY: test test: ## Run the bison unit tests - pipenv run py.test -vv + tox tests .PHONY: ci -ci: coverage lint ## Run the ci pipeline (test w/ coverage, lint) +ci: test lint ## Run the ci pipeline (test w/ coverage, lint) + +.PHONY: deps ## Update pinned project dependencies (requirements.txt) +deps: + tox -e deps .PHONY: lint -lint: requires-pipenv ## Run static analysis / linting on bison - pipenv run flake8 --ignore=E501,E712 bison - pipenv run isort bison tests -rc -c --diff - -.PHONY: coverage -coverage: requires-pipenv ## Show the coverage report for unit tests - pipenv run py.test --cov-report term --cov-report html --cov=bison tests +lint: ## Run static analysis / linting on bison + tox -e lint .PHONY: publish publish: ## Publish bison to Pypi diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 6692346..0000000 --- a/Pipfile +++ /dev/null @@ -1,19 +0,0 @@ -[[source]] - -url = "https://pypi.python.org/simple" -verify_ssl = true -name = "pypi" - - -[dev-packages] - -"pytest" = ">=2.8.0" -"pytest-cov" = "*" -"isort" = "*" -"flake8" = "*" -"tox" = "*" -"coveralls" = "*" - -[packages] - -"e1839a8" = {path = ".", editable = true} diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 901589b..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,241 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "169af82f00f401815defe78cfa60bbea2ab81a449ddf213d7a541cb35866565f" - }, - "pipfile-spec": 6, - "requires": {}, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.python.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "e1839a8": { - "editable": true, - "path": "." - }, - "pyyaml": { - "hashes": [ - "sha256:0c507b7f74b3d2dd4d1322ec8a94794927305ab4cebbe89cc47fe5e81541e6e8", - "sha256:16b20e970597e051997d90dc2cddc713a2876c47e3d92d59ee198700c5427736", - "sha256:3262c96a1ca437e7e4763e2843746588a965426550f3797a79fca9c6199c431f", - "sha256:326420cbb492172dec84b0f65c80942de6cedb5233c413dd824483989c000608", - "sha256:4474f8ea030b5127225b8894d626bb66c01cda098d47a2b0d3429b6700af9fd8", - "sha256:592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab", - "sha256:5ac82e411044fb129bae5cfbeb3ba626acb2af31a8d17d175004b70862a741a7", - "sha256:5f84523c076ad14ff5e6c037fe1c89a7f73a3e04cf0377cb4d017014976433f3", - "sha256:827dc04b8fa7d07c44de11fabbc888e627fa8293b695e0f99cb544fdfa1bf0d1", - "sha256:b4c423ab23291d3945ac61346feeb9a0dc4184999ede5e7c43e1ffb975130ae6", - "sha256:bc6bced57f826ca7cb5125a10b23fd0f2fff3b7c4701d64c439a300ce665fff8", - "sha256:c01b880ec30b5a6e6aa67b09a2fe3fb30473008c85cd6a67359a1b15ed6d83a4", - "sha256:ca233c64c6e40eaa6c66ef97058cdc80e8d0157a443655baa1b2966e812807ca", - "sha256:e863072cdf4c72eebf179342c94e6989c67185842d9997960b3e69290b2fa269" - ], - "version": "==3.12" - } - }, - "develop": { - "attrs": { - "hashes": [ - "sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9", - "sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450" - ], - "version": "==17.4.0" - }, - "certifi": { - "hashes": [ - "sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296", - "sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d" - ], - "version": "==2018.1.18" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "colorama": { - "hashes": [ - "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda", - "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.3.9" - }, - "coverage": { - "hashes": [ - "sha256:03481e81d558d30d230bc12999e3edffe392d244349a90f4ef9b88425fac74ba", - "sha256:0b136648de27201056c1869a6c0d4e23f464750fd9a9ba9750b8336a244429ed", - "sha256:104ab3934abaf5be871a583541e8829d6c19ce7bde2923b2751e0d3ca44db60a", - "sha256:15b111b6a0f46ee1a485414a52a7ad1d703bdf984e9ed3c288a4414d3871dcbd", - "sha256:198626739a79b09fa0a2f06e083ffd12eb55449b5f8bfdbeed1df4910b2ca640", - "sha256:1c383d2ef13ade2acc636556fd544dba6e14fa30755f26812f54300e401f98f2", - "sha256:28b2191e7283f4f3568962e373b47ef7f0392993bb6660d079c62bd50fe9d162", - "sha256:2eb564bbf7816a9d68dd3369a510be3327f1c618d2357fa6b1216994c2e3d508", - "sha256:337ded681dd2ef9ca04ef5d93cfc87e52e09db2594c296b4a0a3662cb1b41249", - "sha256:3a2184c6d797a125dca8367878d3b9a178b6fdd05fdc2d35d758c3006a1cd694", - "sha256:3c79a6f7b95751cdebcd9037e4d06f8d5a9b60e4ed0cd231342aa8ad7124882a", - "sha256:3d72c20bd105022d29b14a7d628462ebdc61de2f303322c0212a054352f3b287", - "sha256:3eb42bf89a6be7deb64116dd1cc4b08171734d721e7a7e57ad64cc4ef29ed2f1", - "sha256:4635a184d0bbe537aa185a34193898eee409332a8ccb27eea36f262566585000", - "sha256:56e448f051a201c5ebbaa86a5efd0ca90d327204d8b059ab25ad0f35fbfd79f1", - "sha256:5a13ea7911ff5e1796b6d5e4fbbf6952381a611209b736d48e675c2756f3f74e", - "sha256:69bf008a06b76619d3c3f3b1983f5145c75a305a0fea513aca094cae5c40a8f5", - "sha256:6bc583dc18d5979dc0f6cec26a8603129de0304d5ae1f17e57a12834e7235062", - "sha256:701cd6093d63e6b8ad7009d8a92425428bc4d6e7ab8d75efbb665c806c1d79ba", - "sha256:7608a3dd5d73cb06c531b8925e0ef8d3de31fed2544a7de6c63960a1e73ea4bc", - "sha256:76ecd006d1d8f739430ec50cc872889af1f9c1b6b8f48e29941814b09b0fd3cc", - "sha256:7aa36d2b844a3e4a4b356708d79fd2c260281a7390d678a10b91ca595ddc9e99", - "sha256:7d3f553904b0c5c016d1dad058a7554c7ac4c91a789fca496e7d8347ad040653", - "sha256:7e1fe19bd6dce69d9fd159d8e4a80a8f52101380d5d3a4d374b6d3eae0e5de9c", - "sha256:8c3cb8c35ec4d9506979b4cf90ee9918bc2e49f84189d9bf5c36c0c1119c6558", - "sha256:9d6dd10d49e01571bf6e147d3b505141ffc093a06756c60b053a859cb2128b1f", - "sha256:9e112fcbe0148a6fa4f0a02e8d58e94470fc6cb82a5481618fea901699bf34c4", - "sha256:ac4fef68da01116a5c117eba4dd46f2e06847a497de5ed1d64bb99a5fda1ef91", - "sha256:b8815995e050764c8610dbc82641807d196927c3dbed207f0a079833ffcf588d", - "sha256:be6cfcd8053d13f5f5eeb284aa8a814220c3da1b0078fa859011c7fffd86dab9", - "sha256:c1bb572fab8208c400adaf06a8133ac0712179a334c09224fb11393e920abcdd", - "sha256:de4418dadaa1c01d497e539210cb6baa015965526ff5afc078c57ca69160108d", - "sha256:e05cb4d9aad6233d67e0541caa7e511fa4047ed7750ec2510d466e806e0255d6", - "sha256:e4d96c07229f58cb686120f168276e434660e4358cc9cf3b0464210b04913e77", - "sha256:f3f501f345f24383c0000395b26b726e46758b71393267aeae0bd36f8b3ade80", - "sha256:f8a923a85cb099422ad5a2e345fe877bbc89a8a8b23235824a93488150e45f6e" - ], - "version": "==4.5.1" - }, - "coveralls": { - "hashes": [ - "sha256:32569a43c9dbc13fa8199247580a4ab182ef439f51f65bb7f8316d377a1340e8", - "sha256:664794748d2e5673e347ec476159a9d87f43e0d2d44950e98ed0e27b98da8346" - ], - "version": "==1.3.0" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "flake8": { - "hashes": [ - "sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0", - "sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37" - ], - "version": "==3.5.0" - }, - "funcsigs": { - "hashes": [ - "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", - "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50" - ], - "markers": "python_version < '3.0'", - "version": "==1.0.2" - }, - "idna": { - "hashes": [ - "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", - "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" - ], - "version": "==2.6" - }, - "isort": { - "hashes": [ - "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", - "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", - "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" - ], - "version": "==4.3.4" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "pluggy": { - "hashes": [ - "sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff" - ], - "version": "==0.6.0" - }, - "py": { - "hashes": [ - "sha256:8cca5c229d225f8c1e3085be4fcf306090b00850fefad892f9d96c7b6e2f310f", - "sha256:ca18943e28235417756316bfada6cd96b23ce60dd532642690dcfdaba988a76d" - ], - "version": "==1.5.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:682256a5b318149ca0d2a9185d365d8864a768a28db66a84a2ea946bcc426766", - "sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9" - ], - "version": "==2.3.1" - }, - "pyflakes": { - "hashes": [ - "sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f", - "sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805" - ], - "version": "==1.6.0" - }, - "pytest": { - "hashes": [ - "sha256:062027955bccbc04d2fcd5d79690947e018ba31abe4c90b2c6721abec734261b", - "sha256:117bad36c1a787e1a8a659df35de53ba05f9f3398fb9e4ac17e80ad5903eb8c5" - ], - "version": "==3.4.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:03aa752cf11db41d281ea1d807d954c4eda35cfa1b21d6971966cc041bbf6e2d", - "sha256:890fe5565400902b0c78b5357004aab1c814115894f4f21370e2433256a3eeec" - ], - "version": "==2.5.1" - }, - "requests": { - "hashes": [ - "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", - "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e" - ], - "version": "==2.18.4" - }, - "six": { - "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" - ], - "version": "==1.11.0" - }, - "tox": { - "hashes": [ - "sha256:752f5ec561c6c08c5ecb167d3b20f4f4ffc158c0ab78855701a75f5cef05f4b8", - "sha256:8af30fd835a11f3ff8e95176ccba5a4e60779df4d96a9dfefa1a1704af263225" - ], - "version": "==2.9.1" - }, - "urllib3": { - "hashes": [ - "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", - "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" - ], - "markers": "python_version < '3'", - "version": "==1.22" - }, - "virtualenv": { - "hashes": [ - "sha256:02f8102c2436bb03b3ee6dede1919d1dac8a427541652e5ec95171ec8adbc93a", - "sha256:39d88b533b422825d644087a21e78c45cf5af0ef7a99a1fc9fbb7b481e5c85b0" - ], - "markers": "python_version != '3.2'", - "version": "==15.1.0" - } - } -} diff --git a/bison/__init__.py b/bison/__init__.py index fc1614d..7e0eca3 100644 --- a/bison/__init__.py +++ b/bison/__init__.py @@ -7,10 +7,9 @@ A Python application configuration library. """ # flake8: noqa -from .__version__ import __author__, __author_email__, __copyright__ -from .__version__ import __description__, __license__, __url__ -from .__version__ import __title__, __version__ - +from .__version__ import (__author__, __author_email__, __copyright__, + __description__, __license__, __title__, __url__, + __version__) from .bison import Bison from .scheme import DictOption, ListOption, Option, Scheme from .utils import DotDict diff --git a/bison/__version__.py b/bison/__version__.py index d87fac0..00bf193 100644 --- a/bison/__version__.py +++ b/bison/__version__.py @@ -3,7 +3,7 @@ __title__ = 'bison' __description__ = 'Python application configuration' __url__ = 'https://github.com/edaniszewski/bison' -__version__ = '0.0.6' +__version__ = '0.1.0' __author__ = 'Erick Daniszewski' __author_email__ = 'edaniszewski@gmail.com' __license__ = 'MIT' diff --git a/bison/utils.py b/bison/utils.py index ac706f5..368c25b 100644 --- a/bison/utils.py +++ b/bison/utils.py @@ -123,12 +123,12 @@ class DotDict(dict): # DotDicts. first, remainder = key.split('.', 1) if first in self: - value = super(DotDict, self).get(first) + value = super(DotDict, self).get(first, default) # if the value for the key at this level is a dictionary, # then pass the remainder to that DotDict. if isinstance(value, (dict, DotDict)): - return DotDict(value).get(remainder) + return DotDict(value).get(remainder, default) # TODO: support lists diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ae82f54 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --output-file requirements.txt setup.py +# +pyyaml==3.13 diff --git a/setup.cfg b/setup.cfg index 60bd34d..14f422a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,10 @@ [bdist_wheel] universal = 1 +[isort] +not_skip = __init__.py +default_section = THIRDPARTY +known_first_party = bison,tests + [metadata] license_file = LICENSE \ No newline at end of file diff --git a/tests/test_bison.py b/tests/test_bison.py index 4ac8c81..e6e4830 100644 --- a/tests/test_bison.py +++ b/tests/test_bison.py @@ -62,6 +62,25 @@ class TestBison: value = b.get(key) assert value == expected + @pytest.mark.parametrize( + 'key,default,expected,config', [ + ('foo', 7, 7, None), + ('foo', None, None, bison.DotDict()), + ('foo', 'bar', 'bar', bison.DotDict()), + ('foo', 'bar', None, bison.DotDict({'foo': None})), + ('foo', 'bar', 'test', bison.DotDict({'foo': 'test'})), + ('foo.bar', 7, 'baz', bison.DotDict({'foo': {'bar': 'baz'}})), + ('foo.bar', 7, 7, bison.DotDict({'foo': {'something': 'else'}})), + ] + ) + def test_get_with_defaults(self, key, default, expected, config): + """Get config values from Bison, using defaults if the key is not set.""" + b = bison.Bison() + b._full_config = config # for the test, set the config manually + + value = b.get(key, default=default) + assert value == expected + @pytest.mark.parametrize( 'key,value', [ ('foo', 'bar'), diff --git a/tox.ini b/tox.ini index a72726f..2a3d299 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,35 @@ [tox] -testenv = py34,py35,py36 +envlist = py{34,35,36} +minversion=3.4.0 +skipsdist=True +skip_missing_interpreters=True [testenv] +basepython= + py34: python3.4 + py35: python3.5 + py36: python3.6 deps= pytest -commands = + pytest-cov +commands= pip install -e . - py.test tests \ No newline at end of file + py.test \ + --cov-report term \ + --cov-report html \ + --cov=bison \ + {posargs} + +[testenv:deps] +deps= + pip-tools +commands= + pip-compile --output-file requirements.txt setup.py + +[testenv:lint] +deps= + isort + flake8 +commands= + flake8 --ignore=E501,E712 bison + isort bison tests -rc -c --diff