diff --git a/.travis.yml b/.travis.yml
index 1f090c2..e99e66d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,5 @@
+os: linux
language: python
-sudo: false # Since this is an older project, this is not the default.
cache: pip
dist: xenial
python:
@@ -8,6 +8,7 @@ python:
- "3.5"
- "3.6"
- "3.7"
+ - "3.8"
install:
- pip install -U pip setuptools
- pip install tox-travis
diff --git a/CHANGES.txt b/CHANGES.txt
index 55721f9..6c2de9a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,7 @@
+Version 4.1.0.17
+2020-11-16
+- Remove deprecation warning for collections module
+
Version 4.1.0.16
2019-09-17
- [#96] Fix problem when installing from Python 2.7
diff --git a/README.rst b/README.rst
index dea7835..2ef5d63 100644
--- a/README.rst
+++ b/README.rst
@@ -1,10 +1,10 @@
python-maec
===========
-A Python library for parsing, manipulating, and generating `Malware Attribute Enumeration and Characterization (MAECâ„¢) `_ content.
+A Python library for parsing, manipulating, and generating `Malware Attribute Enumeration and Characterization (MAECâ„¢) `_ v4.1 content.
:Source: https://github.com/MAECProject/python-maec
-:Documentation: http://maec.readthedocs.org
+:Documentation: https://maec.readthedocs.io/
:Information: https://maecproject.github.io/
:Download: https://pypi.python.org/pypi/maec/
diff --git a/docs/getting_started.rst b/docs/getting_started.rst
index ed5570e..069c224 100644
--- a/docs/getting_started.rst
+++ b/docs/getting_started.rst
@@ -23,7 +23,7 @@ Once you have installed python-maec, you can begin writing Python applications t
.. note::
- The *python-maec* library provides **bindings** and **APIs**, both of which can be used to parse and write MAEC XML files. For in-depth description of the *APIs, bindings, and the differences between the two*, please refer to :doc:`api_vs_bindings/index`
+ The *python-maec* library provides **bindings** and **APIs**, both of which can be used to parse and write MAEC XML files. For in-depth description of the *APIs, bindings, and the differences between the two*, please refer to :doc:`api_vs_bindings/index`
Creating a MAEC Package
***********************
diff --git a/docs/index.rst b/docs/index.rst
index f667181..47a49af 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -15,13 +15,13 @@ version of MAEC.
============ ===================
MAEC Version python-maec Version
============ ===================
-4.1 4.1.0.12 (`PyPI`__) (`GitHub`__)
+4.1 4.1.0.17 (`PyPI`__) (`GitHub`__)
4.0 4.0.1.0 (`PyPI`__) (`GitHub`__)
3.0 3.0.0b1 (`PyPI`__) (`GitHub`__)
============ ===================
-__ https://pypi.python.org/pypi/maec/4.1.0.12
-__ https://github.com/MAECProject/python-maec/tree/v4.1.0.12
+__ https://pypi.python.org/pypi/maec/4.1.0.17
+__ https://github.com/MAECProject/python-maec/tree/v4.1.0.17
__ https://pypi.python.org/pypi/maec/4.0.1.0
__ https://github.com/MAECProject/python-maec/tree/v4.0.1.0
__ https://pypi.python.org/pypi/maec/3.0.0b1
diff --git a/maec/utils/comparator.py b/maec/utils/comparator.py
index 50e43fd..8aea9aa 100644
--- a/maec/utils/comparator.py
+++ b/maec/utils/comparator.py
@@ -1,5 +1,5 @@
# MAEC Comparator Classes
-import collections
+from mixbox import compat
class ComparisonResult(object):
def __init__(self, bundle_list, lookup_table):
@@ -154,7 +154,7 @@ def get_val(cls, obj, typed_field, hash_val, nested_elements = None):
val = getattr(obj.properties, str(typed_field))
if val is not None:
hash_val += str(typed_field) + ":"
- if isinstance(val, collections.MutableSequence):
+ if isinstance(val, compat.MutableSequence):
for list_item in val:
if '/' in str(nested_elements[0]):
hash_val += '['
diff --git a/maec/utils/deduplicator.py b/maec/utils/deduplicator.py
index b10f1d0..7b96fa3 100644
--- a/maec/utils/deduplicator.py
+++ b/maec/utils/deduplicator.py
@@ -4,9 +4,9 @@
# See LICENSE.txt for complete terms
-import collections
import copy
+from mixbox import compat
from mixbox import entities
from cybox.core import RelatedObject, AssociatedObject
@@ -179,7 +179,7 @@ def get_typedfield_values(cls, val, name, values, ignoreCase=False):
# If the value is a mutable sequence, attempt to find TypedFields as
# in each item. EntityLists are Entity subclasses that can have
# TypedFields, so we don't make this an elif.
- if isinstance(val, collections.MutableSequence):
+ if isinstance(val, compat.MutableSequence):
for list_item in val:
cls.get_typedfield_values(list_item, name, values, ignoreCase)
diff --git a/maec/version.py b/maec/version.py
index 26571b3..b87b594 100644
--- a/maec/version.py
+++ b/maec/version.py
@@ -1,4 +1,4 @@
# Copyright (c) 2018, The MITRE Corporation. All rights reserved.
# See LICENSE.txt for complete terms.
-__version__ = "4.1.0.16"
+__version__ = "4.1.0.17"
diff --git a/setup.cfg b/setup.cfg
index 4b24ed4..395669c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,12 +1,17 @@
[bumpversion]
-current_version = 4.1.0.16
-parse = (?P\d+)\.(?P\d+)\.(?P\d+).(?P\d+)
-serialize = {major}.{minor}.{patch}.{release}
+current_version = 4.1.0.17
+parse = (?P\d+)\.(?P\d+)\.(?P\d+).(?P\d+)
+serialize = {major}.{minor}.{patch}.{revision}
commit = True
tag = True
[bumpversion:file:maec/version.py]
+[bumpversion:file:docs/index.rst]
+
+[metadata]
+license_file = LICENSE.txt
+
[bdist_wheel]
universal = True
diff --git a/setup.py b/setup.py
index c8a445c..da68f08 100644
--- a/setup.py
+++ b/setup.py
@@ -30,7 +30,7 @@ def get_long_description():
install_requires = [
'lxml>=2.2.3 ; python_version == "2.7" or python_version >= "3.5"',
'lxml>=2.2.3,<4.4.0 ; python_version > "2.7" and python_version < "3.5"',
- 'mixbox>=1.0.2',
+ 'mixbox>=1.0.4',
'cybox>=2.1.0.13,<2.1.1.0',
]
@@ -52,7 +52,7 @@ def get_long_description():
author_email="maec@mitre.org",
description="An API for parsing and creating MAEC content.",
long_description=get_long_description(),
- url="http://maec.mitre.org",
+ url="https://maecproject.github.io/",
packages=find_packages(),
install_requires=install_requires,
extras_require=extras_require,
@@ -65,9 +65,15 @@ def get_long_description():
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
- ]
+ ],
+ project_urls={
+ 'Documentation': 'https://maec.readthedocs.io/',
+ 'Source Code': 'https://github.com/MAECProject/python-maec/',
+ 'Bug Tracker': 'https://github.com/MAECProject/python-maec/issues/',
+ },
)
diff --git a/tox.ini b/tox.ini
index 0b520ed..d50a0b4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py27,py34,py35,py36,py37
+envlist = py27, py34, py35, py36, py37, py38, docs, packaging
[testenv]
commands =
@@ -12,10 +12,17 @@ commands =
sphinx-build -W -b doctest -d {envtmpdir}/doctrees docs {envtmpdir}/doctest
sphinx-build -W -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html
+[testenv:packaging]
+deps =
+ readme_renderer
+commands =
+ python setup.py check -r -s
+
[travis]
python =
- 2.7: py27
+ 2.7: py27, docs, packaging
3.4: py34
3.5: py35
- 3.6: py36
+ 3.6: py36, docs, packaging
3.7: py37
+ 3.8: py38