diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fe2441bfe..64ef0302e 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -199,7 +199,7 @@ jobs: pip install .[pytorch_cpu] - name: Run pytest tests run: | - pytest -vx tests/version_test.py + pytest -vx tests/test_version.py pytest -vx tests/test_num_params.py pytest -vx tests/test_param_shapes.py pytest -vx tests/test_param_types.py diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 628fc012b..6b47b271c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -50,7 +50,7 @@ jobs: - name: Install yapf run: | python -m pip install --upgrade pip - pip install yapf==0.32 + pip install yapf==0.32 toml - name: Run yapf run: | yapf . --diff --recursive diff --git a/.gitignore b/.gitignore index d2e212366..85063bcf4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,6 @@ wandb/ scoring/plots/ !scoring/test_data/experiment_dir/study_0/mnist_jax/trial_0/eval_measurements.csv -!scoring/test_data/experiment_dir/study_0/mnist_jax/trial_1/eval_measurements.csv \ No newline at end of file +!scoring/test_data/experiment_dir/study_0/mnist_jax/trial_1/eval_measurements.csv + +algorithmic_efficiency/_version.py \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 364bbee62..a93289852 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,7 @@ - [Style Testing](#style-testing) - [Unit and Integration Tests](#unit-and-integration-tests) - [Regression Tests](#regression-tests) + - [Versioning](#versioning) ## Contributing to MLCommons @@ -276,3 +277,15 @@ To run a regression test: 2. Turn on the self-hosted runner. 3. Run the self-hosted runner application for the runner to accept jobs. 4. Open a pull request into mian to trigger the workflow. + +### Versioning + +The package version is automatically determined by the `setuptools_scm` package based on the last git tag. +It follows the structure `major.minor.patch` + `devN` where `N` is the number of commits since the last tag. +It automatically increments the patch version (i.e. it guesses the next version) if there are commits after the last tag. +Additionally, if there are uncommitted changes, the version will include a suffix separated by a `+` character and includes the last commit hash plus the date on dirt workdir (see [setuptools_scm's documentation](https://setuptools-scm.readthedocs.io/en/latest/extending/#setuptools_scmlocal_scheme) with the default version and local scheme). +You can check what version `setuptools_scm` is creating by running `python -m setuptools_scm`. + +To create a new version, create a new release (and tag) in the GitHub UI. +The package version is automatically updated to the new version. +Once the package is installed, the version can be accessed as the package attribute `algorithmic_efficiency.__version__`, i.e. via `python -c "import algorithmic_efficiency; print(algorithmic_efficiency.__version__)"`. diff --git a/algorithmic_efficiency/__init__.py b/algorithmic_efficiency/__init__.py index a0e473e1d..7d54f8290 100644 --- a/algorithmic_efficiency/__init__.py +++ b/algorithmic_efficiency/__init__.py @@ -1,3 +1,5 @@ """Algorithmic Efficiency.""" -__version__ = '0.1.0' +from ._version import version as __version__ + +__all__ = ["__version__"] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..870cfe99a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,332 @@ +############################################################################### +# MLCommons Algorithmic Efficiency. # +############################################################################### + +[project] +name = "algorithmic_efficiency" +dynamic = ["version"] +description = "Codebase for the AlgoPerf: Training Algorithms benchmark" +authors = [ + { name = "MLCommons Algorithms Working Group", email = "algorithms@mlcommons.org" }, +] +license = { text = "Apache 2.0" } +readme = "README.md" +requires-python = ">=3.11" +keywords = [ + "algoperf", + "algorithmic-efficiency", + "machine-learning", + "deep-learning", + "optimization", + "benchmarking", + "training-methods", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Topic :: Scientific/Engineering :: Artificial Intelligence", +] +dependencies = [ + "absl-py==2.1.0", + "networkx==3.2.1", + "docker==7.1.0", + "numpy>=2.0.2", + "pandas>=2.0.1", + "tensorflow==2.18.0", + "tensorflow-datasets==4.9.7", + "tensorflow-probability==0.20.0", + "tensorflow-addons==0.20.0", + "gputil==1.4.0", + "psutil==6.1.0", + "clu==0.0.12", + "matplotlib>=3.9.2", + "tabulate==0.9.0", +] + +[build-system] +requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"] +build-backend = "setuptools.build_meta" + +[tool.setuptools] +py-modules = ["submission_runner"] +include-package-data = true +zip-safe = false + +[tool.setuptools.packages] +find = {} # Scanning implicit namespaces is active by default + +[tool.setuptools_scm] +version_file = "algorithmic_efficiency/_version.py" + +############################################################################### +# (Optional) Dependencies # +############################################################################### +[project.optional-dependencies] +# All workloads +full = [ + "algorithmic_efficiency[criteo1tb,fastmri,ogbg,librispeech_conformer,wmt]", +] +# All workloads plus development dependencies +full_dev = ["algorithmic_efficiency[full,dev]"] +# Dependencies for developing the package +dev = [ + "isort==5.13.0", + "pylint==2.17.4", + "pytest==8.3.3", + "yapf==0.32.0", + "pre-commit==4.0.1", +] + +# Workloads +criteo1tb = ["scikit-learn==1.5.2"] +fastmri = ["h5py==3.12.0", "scikit-image==0.24.0"] +ogbg = ["jraph==0.0.6.dev0", "scikit-learn==1.5.2"] +librispeech_conformer = [ + "sentencepiece==0.2.0", + "tensorflow-text==2.18.0", + "pydub==0.25.1", +] +wmt = ["sentencepiece==0.2.0", "tensorflow-text==2.18.0"] + +# Frameworks +jax_core_deps = [ + "flax==0.8.4", + "optax==0.2.2", + "chex==0.1.86", + "ml_dtypes==0.4.1", + "protobuf==4.25.5", +] +jax_cpu = [ + "jax==0.4.26", + "jaxlib==0.4.26", + "algorithmic_efficiency[jax_core_deps]", +] +jax_gpu = [ + "jax==0.4.26", + "jaxlib==0.4.26", + "jax-cuda12-plugin[with_cuda]==0.4.28", + "jax-cuda12-pjrt==0.4.28", + "algorithmic_efficiency[jax_core_deps]", +] +pytorch_cpu = ["torch==2.5.1", "torchvision==0.20.1"] +pytorch_gpu = [ + "torch==2.5.0", + "torchvision==0.20.1", +] # Note: omit the cuda suffix and installing from the appropriate wheel will result in using locally installed CUDA. +wandb = ["wandb==0.16.5"] + +############################################################################### +# Linting Configurations # +############################################################################### + +# yapf configuration +[tool.yapf] +based_on_style = "yapf" +each_dict_entry_on_separate_line = false +split_all_top_level_comma_separated_values = true +[tool.yapfignore] +ignore_patterns = ["algorithmic_efficiency/_version.py"] + +# isort configuration +[tool.isort] +profile = "google" + +# pylint configuration +[tool.pylint.MASTER] +persistent = false +ignore = "get_references_web.py,get_references_web_single_group.py,_version.py" + +[tool.pylint.REPORTS] +reports = false +msg-template = "{msg_id}:{line:3} {obj}: {msg} [{symbol}]" + +[tool.pylint.MESSAGES_CONTROL] +enable = "indexing-exception,old-raise-syntax" + +[tool.pylint.BASIC] +# Required attributes for module, separated by a comma +#required-attributes= +# Regular expression which should only match the name +# of functions or classes which do not require a docstring. +no-docstring-rgx = "(__.*__|main)" +# Min length in lines of a function that requires a docstring. +docstring-min-length = 10 +# Regular expression which should only match correct module names. The +# leading underscore is sanctioned for private modules by Google's style +# guide. +# +# There are exceptions to the basic rule (_?[a-z][a-z0-9_]*) to cover +# requirements of Python's module system. +module-rgx = "^(_?[a-z][a-z0-9_]*)|__init__$" +# Regular expression which should only match correct module level names +const-rgx = "^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$" +# Regular expression which should only match correct class attribute +class-attribute-rgx = "^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$" +# Regular expression which should only match correct class names +class-rgx = "^_?[A-Z][a-zA-Z0-9]*$" +# Regular expression which should only match correct function names. +# 'camel_case' and 'snake_case' group names are used for consistency of naming +# styles across functions and methods. +function-rgx = "^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$" +# Regular expression which should only match correct method names. +# 'camel_case' and 'snake_case' group names are used for consistency of naming +# styles across functions and methods. 'exempt' indicates a name which is +# consistent with all naming styles. +method-rgx = "(?x)^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|_testDatasetSize|setUpClass|test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|(?:test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next|(?P_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P_{0,2}[a-z][a-z0-9_]*))$" +# Regular expression which should only match correct instance attribute names +attr-rgx = "^_{0,2}[a-z][a-z0-9_]*$" +# Regular expression which should only match correct argument names +argument-rgx = "^[a-z][a-z0-9_]*$" +# Regular expression which should only match correct variable names +variable-rgx = "^[a-z][a-z0-9_]*$" +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx = "^[a-z][a-z0-9_]*$" +# Good variable names which should always be accepted, separated by a comma +good-names = "main,_" +# Bad variable names which should always be refused, separated by a comma +bad-names = "" +# List of builtins function names that should not be used, separated by a comma +#bad-functions=input,apply,reduce +# List of decorators that define properties, such as abc.abstractproperty. +property-classes = "abc.abstractproperty" + +[tool.pylint.typecheck] +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members = true + +# List of decorators that create context managers from functions, such as +# contextlib.contextmanager. +contextmanager-decorators = [ + "contextlib.contextmanager", + "contextlib2.contextmanager", +] + +[tool.pylint.VARIABLES] +# Tells whether we should check for unused import in __init__ files. +init-import = false + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx = "^\\*{0,2}(_$|unused_|dummy_)" + +# List of additional names supposed to be defined in builtins. +additional-builtins = [] + +[tool.pylint.CLASSES] +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods = ["__init__", "__new__", "setUp"] + +# Valid names for the first argument to a class method. +valid-classmethod-first-arg = ["cls", "class_"] + +[tool.pylint.EXCEPTIONS] +overgeneral-exceptions = [ + "builtins.StandardError", + "builtins.Exception", + "builtins.BaseException", +] + +[tool.pylint.IMPORTS] +# Deprecated modules which should not be used, separated by a comma +deprecated-modules = ["regsub", "TERMIOS", "Bastion", "rexec", "sets"] + +[tool.pylint.FORMAT] +# List of checkers and warnings to disable. +disable = [ + "abstract-method", + "access-member-before-definition", + "arguments-differ", + "assignment-from-no-return", + "attribute-defined-outside-init", + "bad-mcs-classmethod-argument", + "bad-option-value", + "c-extension-no-member", + "consider-merging-isinstance", + "consider-using-dict-comprehension", + "consider-using-enumerate", + "consider-using-in", + "consider-using-set-comprehension", + "consider-using-ternary", + "deprecated-method", + "design", + "file-ignored", + "fixme", + "global-statement", + "import-error", + "inconsistent-return-statements", + "invalid-unary-operand-type", + "len-as-condition", + "locally-disabled", + "locally-enabled", + "misplaced-comparison-constant", + "missing-docstring", + "multiple-imports", + "no-else-return", + "no-member", + "no-name-in-module", + "no-self-use", + "no-value-for-parameter", + "not-an-iterable", + "not-context-manager", + "pointless-except", + "protected-access", + "redefined-argument-from-local", + "signature-differs", + "similarities", + "simplifiable-if-expression", + "star-args", + "super-init-not-called", + "suppressed-message", + "too-many-function-args", + "trailing-comma-tuple", + "trailing-newlines", + "ungrouped-imports", + "unnecessary-pass", + "unsubscriptable-object", + "unused-argument", + "useless-object-inheritance", + "useless-return", + "useless-suppression", + "wrong-import-order", + "wrong-import-position", + "unneeded-not", + "unexpected-keyword-arg", + "redundant-keyword-arg", + "unspecified-encoding", + "logging-fstring-interpolation", + "consider-using-f-string", + "use-dict-literal", +] +# Maximum number of characters on a single line. +max-line-length = 80 +ignore-long-lines = "(?x)(^\\s*(import|from)\\s|^\\s*(\\#\\ )??$|^[a-zA-Z_][a-zA-Z0-9_]*\\s*=\\s*('[^']\\S+'|\"[^\"]\\S+\"))" +# Maximum number of lines in a module +max-module-lines = 99999 +# String used as indentation unit. We differ from PEP8's normal 4 spaces. +indent-string = ' ' +single-line-if-stmt = true +# Do not warn about multiple statements on a single line for constructs like +# if test: stmt +[tool.pylint.LOGGING] +logging-modules = "logging,absl.logging" +# Add logging modules. +[tool.pylint.MISCELLANEOUS] +# Maximum line length for lambdas +#short-func-length=1 +# List of module members that should be marked as deprecated. +# All of the string functions are listed in 4.1.4 Deprecated string functions +# in the Python 2.4 docs. +#deprecated-members=string.atof,string.atoi,string.atol,string.capitalize,string.expandtabs,string.find,string.rfind,string.index,string.rindex,string.count,string.lower,string.split,string.rsplit,string.splitfields,string.join,string.joinfields,string.lstrip,string.rstrip,string.strip,string.swapcase,string.translate,string.upper,string.ljust,string.rjust,string.center,string.zfill,string.replace,sys.exitfunc,sys.maxint +# List of exceptions that do not need to be mentioned in the Raises section of +# a docstring. +#ignore-exceptions=AssertionError,NotImplementedError,StopIteration,TypeError +# Number of spaces of indent required when the last token on the preceding line +# is an open (, [, or {. +indent-after-paren = 4 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 43b31b536..000000000 --- a/setup.cfg +++ /dev/null @@ -1,304 +0,0 @@ -############################################################################### -# MLCommons Algorithmic Efficiency. # -############################################################################### - -[metadata] -name = algorithmic_efficiency -version = attr: algorithmic_efficiency.__version__ -description = MLCommons Algorithmic Efficiency -url = https://github.com/mlcommons/algorithmic-efficiency -author = MLCommons Algorithmic Efficiency -author_email = algorithms@mlcommons.org -license = Apache 2.0 -long_description = file: README.md -long_description_content_type = text/markdown -keywords = algorithmic-efficiency, machine-learning, deep-learning, - optimization, benchmarking, training-methods -platforms = any -classifiers = - Development Status :: 3 - Alpha - Intended Audience :: Developers - Intended Audience :: Science/Research - License :: OSI Approved :: Apache Software License - Operating System :: OS Independent - Programming Language :: Python :: 3.11 - Topic :: Scientific/Engineering :: Artificial Intelligence - -[options] -zip_safe = False -packages = find: -include_package_data = True -setup_requires = - setuptools_scm -# Dependencies of the project: -install_requires = - absl-py==2.1.0 - # Pin to avoid unpinned install in dependencies that requires Python>=3.9. - networkx==3.2.1 - docker==7.1.0 - numpy>=2.0.2 - pandas==2.2.3 - tensorflow==2.18.0 - tensorflow-datasets==4.9.7 - gputil==1.4.0 - psutil==6.1.0 - clu==0.0.12 - matplotlib>=3.9.2 - tabulate==0.9.0 - wandb==0.18.7 -python_requires = >=3.11 - - -############################################################################### -# Additional Dependencies # -############################################################################### - -[options.extras_require] -# Add extra dependencies, e.g. to run tests or for the different frameworks. -# Use as `pip install -e '.[jax_gpu]' -f https://storage.googleapis.com/jax-releases/jax_releases.html` -# or `pip install -e '.[dev]'` - -# Bundled installs # - -# All workloads -full = - %(criteo1tb)s - %(fastmri)s - %(ogbg)s - %(librispeech_conformer)s - %(wmt)s - -# All workloads plus development dependencies -full_dev = - %(full)s - %(dev)s - - -# Dependencies for developing the package -dev = - isort==5.13.2 - pylint==2.16.1 - pytest==8.3.3 - yapf==0.32.0 - pre-commit==4.0.1 - -# Workloads # -criteo1tb = - scikit-learn==1.5.2 - -fastmri = - h5py==3.12.1 - scikit-image==0.24.0 - -ogbg = - jraph==0.0.6.dev0 - scikit-learn==1.5.2 - -librispeech_conformer = - sentencepiece==0.2.0 - tensorflow-text==2.18.0 - pydub==0.25.1 - -wmt = - sentencepiece==0.2.0 - tensorflow-text==2.18.0 - -# Frameworks # - -# JAX Core -jax_core_deps = - flax==0.8.4 - optax==0.2.2 - chex==0.1.86 - ml_dtypes==0.4.1 - protobuf==4.25.5 - - -# JAX CPU -jax_cpu = - jax==0.4.26 - jaxlib==0.4.26 - %(jax_core_deps)s - -# JAX GPU -# Note this installs both jax and jaxlib. -jax_gpu = - jax==0.4.28 - jaxlib==0.4.28 - jax-cuda12-plugin[with_cuda]==0.4.28 - jax-cuda12-pjrt==0.4.28 - %(jax_core_deps)s - -# PyTorch CPU -pytorch_cpu = - torch==2.5.1 - torchvision==0.20.1 - -# PyTorch GPU -# Note: omit the cuda suffix and installing from the appropriate -# wheel will result in using locally installed CUDA. -pytorch_gpu = - torch==2.5.1 - torchvision==0.20.1 - - -############################################################################### -# Linting Configurations # -############################################################################### - -# yapf configuration -[yapf] -based_on_style = yapf -each_dict_entry_on_separate_line = false -split_all_top_level_comma_separated_values = true - - -# isort configuration -[isort] -profile=google - - -# pylint configuration -[pylint.MASTER] -persistent=no # Pickle collected data for later comparisons. -#cache-size=500 # Set the cache size for astng objects. -# Ignore Py3 files -ignore=get_references_web.py,get_references_web_single_group.py -[pylint.REPORTS] -# Set the output format. -# output-format=sorted-text -# Put messages in a separate file for each module / package specified on the -# command line instead of printing them on stdout. Reports (if any) will be -# written in a file name "pylint_global.[txt|html]". -#files-output=no -# Tells whether to display a full report or only the messages. -reports=no -# Disable the report(s) with the given id(s). -#disable-report=R0001,R0002,R0003,R0004,R0101,R0102,R0201,R0202,R0220,R0401,R0402,R0701,R0801,R0901,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,R0921,R0922,R0923 -# Error message template (continued on second line) -msg-template={msg_id}:{line:3} {obj}: {msg} [{symbol}] -[pylint.'MESSAGES CONTROL'] -# List of checkers and warnings to enable. -enable=indexing-exception,old-raise-syntax - - -[pylint.BASIC] -# Required attributes for module, separated by a comma -#required-attributes= -# Regular expression which should only match the name -# of functions or classes which do not require a docstring. -no-docstring-rgx=(__.*__|main) -# Min length in lines of a function that requires a docstring. -docstring-min-length=10 -# Regular expression which should only match correct module names. The -# leading underscore is sanctioned for private modules by Google's style -# guide. -# -# There are exceptions to the basic rule (_?[a-z][a-z0-9_]*) to cover -# requirements of Python's module system. -module-rgx=^(_?[a-z][a-z0-9_]*)|__init__$ -# Regular expression which should only match correct module level names -const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ -# Regular expression which should only match correct class attribute -class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$ -# Regular expression which should only match correct class names -class-rgx=^_?[A-Z][a-zA-Z0-9]*$ -# Regular expression which should only match correct function names. -# 'camel_case' and 'snake_case' group names are used for consistency of naming -# styles across functions and methods. -function-rgx=^(?:(?PsetUp|tearDown|setUpModule|tearDownModule)|(?P_?[A-Z][a-zA-Z0-9]*)|(?P_?[a-z][a-z0-9_]*))$ -# Regular expression which should only match correct method names. -# 'camel_case' and 'snake_case' group names are used for consistency of naming -# styles across functions and methods. 'exempt' indicates a name which is -# consistent with all naming styles. -method-rgx=(?x) - ^(?:(?P_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase - |tearDownTestCase|setupSelf|tearDownClass|_testDatasetSize|setUpClass - |(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next) - |(?P_{0,2}[A-Z][a-zA-Z0-9_]*) - |(?P_{0,2}[a-z][a-z0-9_]*))$ -# Regular expression which should only match correct instance attribute names -attr-rgx=^_{0,2}[a-z][a-z0-9_]*$ -# Regular expression which should only match correct argument names -argument-rgx=^[a-z][a-z0-9_]*$ -# Regular expression which should only match correct variable names -variable-rgx=^[a-z][a-z0-9_]*$ -# Regular expression which should only match correct list comprehension / -# generator expression variable names -inlinevar-rgx=^[a-z][a-z0-9_]*$ -# Good variable names which should always be accepted, separated by a comma -good-names=main,_ -# Bad variable names which should always be refused, separated by a comma -bad-names= -# List of builtins function names that should not be used, separated by a comma -#bad-functions=input,apply,reduce -# List of decorators that define properties, such as abc.abstractproperty. -property-classes=abc.abstractproperty -[pylint.TYPECHECK] -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes -# List of decorators that create context managers from functions, such as -# contextlib.contextmanager. -contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager -[pylint.VARIABLES] -# Tells whether we should check for unused import in __init__ files. -init-import=no -# A regular expression matching names used for dummy variables (i.e. not used). -dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_) -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= -[pylint.CLASSES] -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp -# "class_" is also a valid for the first argument to a class method. -valid-classmethod-first-arg=cls,class_ -[pylint.EXCEPTIONS] -overgeneral-exceptions=builtins.StandardError,builtins.Exception,builtins.BaseException -[pylint.IMPORTS] -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub,TERMIOS,Bastion,rexec,sets -[pylint.FORMAT] -# List of checkers and warnings to disable. -disable=abstract-method,access-member-before-definition,arguments-differ,assignment-from-no-return,attribute-defined-outside-init,bad-mcs-classmethod-argument,bad-option-value,c-extension-no-member,consider-merging-isinstance,consider-using-dict-comprehension,consider-using-enumerate,consider-using-in,consider-using-set-comprehension,consider-using-ternary,deprecated-method,design,file-ignored,fixme,global-statement,import-error,inconsistent-return-statements,invalid-unary-operand-type,len-as-condition,locally-disabled,locally-enabled,misplaced-comparison-constant,missing-docstring,multiple-imports,no-else-return,no-member,no-name-in-module,no-self-use,no-value-for-parameter,not-an-iterable,not-context-manager,pointless-except,protected-access,redefined-argument-from-local,signature-differs,similarities,simplifiable-if-expression,star-args,super-init-not-called,suppressed-message,too-many-function-args,trailing-comma-tuple,trailing-newlines,ungrouped-imports,unnecessary-pass,unsubscriptable-object,unused-argument,useless-object-inheritance,useless-return,useless-suppression,wrong-import-order,wrong-import-position,unneeded-not,unexpected-keyword-arg,redundant-keyword-arg,unspecified-encoding,logging-fstring-interpolation,consider-using-f-string,use-dict-literal - -# Maximum number of characters on a single line. -max-line-length=80 -# Regexp for a line that is allowed to be longer than the limit. -# This "ignore" regex is today composed of several independent parts: -# (1) Long import lines -# (2) URLs in comments or pydocs. Detecting URLs by regex is a hard problem and -# no amount of tweaking will make a perfect regex AFAICT. This one is a good -# compromise. -# (3) Constant string literals at the start of files don't need to be broken -# across lines. Allowing long paths and urls to be on a single -# line. Also requires that the string not be a triplequoted string. -ignore-long-lines=(?x) - (^\s*(import|from)\s - |^\s*(\#\ )??$ - |^[a-zA-Z_][a-zA-Z0-9_]*\s*=\s*("[^"]\S+"|'[^']\S+') - ) -# Maximum number of lines in a module -max-module-lines=99999 -# String used as indentation unit. We differ from PEP8's normal 4 spaces. -indent-string=' ' -# Do not warn about multiple statements on a single line for constructs like -# if test: stmt -single-line-if-stmt=y -[pylint.LOGGING] -# Add logging modules. -logging-modules=logging,absl.logging -[pylint.MISCELLANEOUS] -# Maximum line length for lambdas -#short-func-length=1 -# List of module members that should be marked as deprecated. -# All of the string functions are listed in 4.1.4 Deprecated string functions -# in the Python 2.4 docs. -#deprecated-members=string.atof,string.atoi,string.atol,string.capitalize,string.expandtabs,string.find,string.rfind,string.index,string.rindex,string.count,string.lower,string.split,string.rsplit,string.splitfields,string.join,string.joinfields,string.lstrip,string.rstrip,string.strip,string.swapcase,string.translate,string.upper,string.ljust,string.rjust,string.center,string.zfill,string.replace,sys.exitfunc,sys.maxint -# List of exceptions that do not need to be mentioned in the Raises section of -# a docstring. -#ignore-exceptions=AssertionError,NotImplementedError,StopIteration,TypeError -# Number of spaces of indent required when the last token on the preceding line -# is an open (, [, or {. -indent-after-paren=4 diff --git a/setup.py b/setup.py deleted file mode 100644 index a4ead8f48..000000000 --- a/setup.py +++ /dev/null @@ -1,4 +0,0 @@ -from setuptools import setup - -if __name__ == "__main__": - setup() diff --git a/tests/version_test.py b/tests/test_version.py similarity index 58% rename from tests/version_test.py rename to tests/test_version.py index 9f7006aab..ef01d4f32 100644 --- a/tests/version_test.py +++ b/tests/test_version.py @@ -10,4 +10,8 @@ def test_version_attribute(): version = algorithmic_efficiency.__version__ assert isinstance(version, str) version_elements = version.split(".") - assert all(el.isnumeric() for el in version_elements) + print(version_elements) + # Only check the first two elements, i.e. major, minor + # (patch is not checked as it is not required). + # The remaining elements contain commit hash and dirty status. + assert all(el.isnumeric() for el in version_elements[0:2])