diff --git a/.gitignore b/.gitignore
index 76a84da..2a099f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1 @@
-*~
-*.pyc
-dist/
rattail_cognitive.egg-info
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 928960f..0000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,60 +0,0 @@
-
-# Changelog
-All notable changes to rattail_cognitive will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
-
-
-## v0.4.0 (2024-07-09)
-
-### Feat
-
-- switch from setup.cfg to pyproject.toml + hatchling
-
-## 0.3.6 (2023-06-01)
-
-* Replace ``setup.py`` contents with ``setup.cfg``.
-
-
-## 0.3.5 (2019-01-21)
-
-* Remove unused reference to ``cStringIO``.
-
-
-## 0.3.4 (2017-07-07)
-
-* Switch license to GPL v3 (no longer Affero)
-
-
-## 0.3.3
-
-* Refactor some config usage per rattail changes.
-
-
-## 0.3.2
-
-* Fix broken barcode commands.
-
- UPC wasn't working, and EAN wasn't even being attempted...
-
-
-## 0.3.1
-
-* Refactor ``rattail.hw.cognitive`` -> ``rattail_cognitive``.
-
-
-## 0.3a3
-
-- [general] Fixed namespace package declaration.
-
-- [general] Added initial Fabric script.
-
-
-## 0.3a2
-
-- Tweaked default label format.
-
-## 0.3a1
-
-- Initial port to Rattail v0.3.
diff --git a/CHANGES.rst b/CHANGES.rst
new file mode 100644
index 0000000..960c748
--- /dev/null
+++ b/CHANGES.rst
@@ -0,0 +1,47 @@
+
+CHANGELOG
+=========
+
+0.3.4 (2017-07-07)
+------------------
+
+* Switch license to GPL v3 (no longer Affero)
+
+
+0.3.3
+-----
+
+* Refactor some config usage per rattail changes.
+
+
+0.3.2
+-----
+
+* Fix broken barcode commands.
+
+ UPC wasn't working, and EAN wasn't even being attempted...
+
+
+0.3.1
+-----
+
+* Refactor ``rattail.hw.cognitive`` -> ``rattail_cognitive``.
+
+
+0.3a3
+-----
+
+- [general] Fixed namespace package declaration.
+
+- [general] Added initial Fabric script.
+
+
+0.3a2
+-----
+
+- Tweaked default label format.
+
+0.3a1
+-----
+
+- Initial port to Rattail v0.3.
diff --git a/README.md b/README.md
deleted file mode 100644
index 5648c9d..0000000
--- a/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-
-# rattail-cognitive
-
-Rattail is a retail software framework, released under the GNU General Public
-License.
-
-This package contains hardware interfaces for
-[Cognitive](http://www.cognitive.com/) devices.
-
-Please see Rattail's [home page](https://rattailproject.org/) for more
-information.
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..f675812
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,13 @@
+
+rattail-cognitive
+=================
+
+Rattail is a retail software framework, released under the GNU General Public
+License.
+
+This package contains hardware interfaces for `Cognitive`_ devices.
+
+Please see Rattail's `home page`_ for more information.
+
+.. _Cognitive: http://www.cognitive.com/
+.. _home page: https://rattailproject.org/
diff --git a/tasks.py b/fabfile.py
similarity index 69%
rename from tasks.py
rename to fabfile.py
index 977854b..74ba601 100644
--- a/tasks.py
+++ b/fabfile.py
@@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
-# Copyright © 2010-2024 Lance Edgar
+# Copyright © 2010-2017 Lance Edgar
#
# This file is part of Rattail.
#
@@ -20,26 +20,16 @@
# Rattail. If not, see .
#
################################################################################
-"""
-Tasks for rattail-cognitive
-"""
-import os
import shutil
-from invoke import task
+from fabric.api import *
@task
-def release(c):
+def release():
"""
- Release a new version of `rattail`.
+ Release a new version of 'rattail_cognitive'.
"""
- if os.path.exists('rattail_cognitive.egg-info'):
- shutil.rmtree('rattail_cognitive.egg-info')
- if os.path.exists('dist'):
- shutil.rmtree('dist')
-
- c.run('python -m build --sdist')
-
- c.run('twine upload dist/*')
+ shutil.rmtree('rattail_cognitive.egg-info')
+ local('python setup.py sdist --formats=gztar register upload')
diff --git a/pyproject.toml b/pyproject.toml
deleted file mode 100644
index 0742c23..0000000
--- a/pyproject.toml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-[build-system]
-requires = ["hatchling"]
-build-backend = "hatchling.build"
-
-
-[project]
-name = "rattail_cognitive"
-version = "0.4.0"
-description = "Hardware Interfaces for Cognitive Devices"
-readme = "README.md"
-authors = [{name = "Lance Edgar", email = "lance@edbob.org"}]
-license = {text = "GNU GPL v3+"}
-classifiers = [
- "Development Status :: 3 - Alpha",
- "Environment :: Console",
- "Environment :: Web Environment",
- "Environment :: Win32 (MS Windows)",
- "Environment :: X11 Applications",
- "Intended Audience :: Developers",
- "Intended Audience :: System Administrators",
- "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
- "Natural Language :: English",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Topic :: Office/Business",
- "Topic :: Software Development :: Libraries :: Python Modules",
-]
-dependencies = [
- "rattail",
-]
-
-
-[project.urls]
-Homepage = "https://rattailproject.org"
-Repository = "https://kallithea.rattailproject.org/rattail-project-contrib/rattail-cognitive"
-Changelog = "https://kallithea.rattailproject.org/rattail-project-contrib/rattail-cognitive/files/master/CHANGELOG.md"
-
-
-[tool.commitizen]
-version_provider = "pep621"
-tag_format = "v$version"
-update_changelog_on_bump = true
diff --git a/rattail_cognitive/_version.py b/rattail_cognitive/_version.py
index 3336373..70d2ced 100644
--- a/rattail_cognitive/_version.py
+++ b/rattail_cognitive/_version.py
@@ -1,6 +1,3 @@
# -*- coding: utf-8; -*-
-from importlib.metadata import version
-
-
-__version__ = version('rattail_cognitive')
+__version__ = '0.3.4'
diff --git a/rattail_cognitive/labels.py b/rattail_cognitive/labels.py
index 6fe992d..942cfa3 100644
--- a/rattail_cognitive/labels.py
+++ b/rattail_cognitive/labels.py
@@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
-# Copyright © 2010-2018 Lance Edgar
+# Copyright © 2010-2017 Lance Edgar
#
# This file is part of Rattail.
#
@@ -24,7 +24,9 @@
Label Printing
"""
-from __future__ import unicode_literals, absolute_import
+from __future__ import unicode_literals
+
+from cStringIO import StringIO
from rattail import labels
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..dc7ca42
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8; -*-
+################################################################################
+#
+# Rattail -- Retail Software Framework
+# Copyright © 2010-2017 Lance Edgar
+#
+# This file is part of Rattail.
+#
+# Rattail is free software: you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version.
+#
+# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Rattail. If not, see .
+#
+################################################################################
+
+
+import os.path
+from setuptools import setup, find_packages
+
+
+here = os.path.abspath(os.path.dirname(__file__))
+exec(open(os.path.join(here, 'rattail_cognitive', '_version.py')).read())
+README = open(os.path.join(here, 'README.txt')).read()
+CHANGES = open(os.path.join(here, 'CHANGES.rst')).read()
+
+
+requires = [
+ #
+ # Version numbers within comments below have specific meanings.
+ # Basically the 'low' value is a "soft low," and 'high' a "soft high."
+ # In other words:
+ #
+ # If either a 'low' or 'high' value exists, the primary point to be
+ # made about the value is that it represents the most current (stable)
+ # version available for the package (assuming typical public access
+ # methods) whenever this project was started and/or documented.
+ # Therefore:
+ #
+ # If a 'low' version is present, you should know that attempts to use
+ # versions of the package significantly older than the 'low' version
+ # may not yield happy results. (A "hard" high limit may or may not be
+ # indicated by a true version requirement.)
+ #
+ # Similarly, if a 'high' version is present, and especially if this
+ # project has laid dormant for a while, you may need to refactor a bit
+ # when attempting to support a more recent version of the package. (A
+ # "hard" low limit should be indicated by a true version requirement
+ # when a 'high' version is present.)
+ #
+ # In any case, developers and other users are encouraged to play
+ # outside the lines with regard to these soft limits. If bugs are
+ # encountered then they should be filed as such.
+ #
+ # package # low high
+
+ 'rattail>=0.3a6', # 0.3a7.dev
+ ]
+
+
+setup(
+ name = "rattail_cognitive",
+ version = __version__,
+ author = "Lance Edgar",
+ author_email = "lance@edbob.org",
+ url = "http://rattailproject.org/",
+ license = "GNU GPL v3",
+ description = "Hardware Interfaces for Cognitive Devices",
+ long_description = README + '\n\n' + CHANGES,
+
+ classifiers = [
+ 'Development Status :: 3 - Alpha',
+ 'Environment :: Console',
+ 'Environment :: Web Environment',
+ 'Environment :: Win32 (MS Windows)',
+ 'Environment :: X11 Applications',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: System Administrators',
+ 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
+ 'Topic :: Office/Business',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ ],
+
+ install_requires = requires,
+
+ packages = find_packages(),
+ include_package_data = True,
+ zip_safe = False,
+ )