-
Notifications
You must be signed in to change notification settings - Fork 7
/
setup.py
190 lines (140 loc) · 4.92 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# -*- coding: utf-8 -*-
from shutil import rmtree
from setuptools import setup, Extension, Command
from setuptools.command.test import test
from setuptools.command.build_ext import build_ext
import generate_stubs
import os
import sys
sys.path.append(os.path.abspath("./zroya/"))
import version
here = os.path.abspath(os.path.dirname(__file__))
# Include path for _zroya module
includes_list = ["./module"]
# List of all *.cpp files in ./module directory
sources_list = []
for root, dirs, files in os.walk("./module"):
for f in files:
if os.path.splitext(f)[1] == ".cpp":
sources_list.append(os.path.join(root, f))
# Python C/CPP Api extension configuration
ext_modules = [
Extension("_zroya",
sources=sources_list,
include_dirs=includes_list
)
]
def discover_and_run_tests():
import unittest
# use the default shared TestLoader instance
test_loader = unittest.defaultTestLoader
# use the basic test runner that outputs to sys.stderr
test_runner = unittest.TextTestRunner()
# automatically discover all tests
# NOTE: only works for python 2.7 and later
test_suite = test_loader.discover( os.path.join(here, "tests"))
# run the test suite
test_runner.run(test_suite)
def find_pyd_file():
"""
Return path to .pyd after successful build command.
:return: Path to .pyd file or None.
"""
if not os.path.isdir("./build"):
raise NotADirectoryError
for path, dirs, files in os.walk("./build"):
for file_name in files:
file_name_parts = os.path.splitext(file_name)
if file_name_parts[1] == ".pyd":
return path
return None
class StubsCommand(build_ext):
description = "Generate python stubs with documentation from C code."
def run(self):
build_ext.run(self)
print("running stubs")
# Generate .pyd file for this module
generate_stubs.GenerateStubFile(find_pyd_file(), os.path.abspath("./zroya/"))
class DocumentationCommand(Command):
description = "Generate documentation from /docs_source directory."
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
os.system("{} {}".format(os.path.join(os.path.abspath("./docs_source/sphinx/"), "make.bat"), "html"))
sys.exit()
class UploadCommand(Command):
description = 'Build and publish the package.'
user_options = [
(
"pypi=",
"p",
"Set PyPi repository in which should be distribution uploaded. Valid values are 'test' for TestPyPi or \
'standard' for regular PyPi."
)
]
@staticmethod
def status(s):
"""Prints things in bold."""
print('\033[1m{0}\033[0m'.format(s))
def initialize_options(self):
self.pypi = "standard"
def finalize_options(self):
assert(self.pypi == "standard" or self.pypi == "test")
def run(self):
try:
self.status('Removing previous builds…')
rmtree(os.path.join(here, 'dist'))
except OSError:
pass
self.status('Building Source and Wheel (universal) distribution…')
os.system('{0} setup.py sdist bdist_wheel --universal'.format(sys.executable))
self.status('Uploading the package to PyPi via Twine…')
if self.pypi == "standard":
os.system('twine upload --repository pypi dist/*')
else:
os.system('twine upload --repository testpypi dist/*')
sys.exit()
class DiscoverTest(test):
"""
Discover and run tests.
See: https://stackoverflow.com/questions/17001010/how-to-run-unittest-discover-from-python-setup-py-test
"""
description = "Run tests in /tests folder with unittest."
def finalize_options(self):
test.finalize_options(self)
self.test_args = []
self.test_suite = True
def run_tests(self):
discover_and_run_tests()
setup(name='zroya',
version=version.__version__,
description='Python library for creating native Windows notifications.',
long_description=open("README.md").read(),
author='Jan Malčák',
author_email='looorin@gmail.com',
license='MIT',
url='https://malja.github.io/zroya',
keywords=["notifications", "windows", "toast"],
classifiers=[
"Development Status :: 4 - Beta",
"Environment :: Win32 (MS Windows)",
"License :: OSI Approved :: MIT License",
"Operating System :: Microsoft :: Windows",
"Programming Language :: C",
"Programming Language :: C++",
"Programming Language :: Python :: 3",
"Topic :: Software Development :: User Interfaces"
],
ext_modules=ext_modules,
test_suite="tests",
packages=["zroya"],
cmdclass={
"stubs": StubsCommand,
'upload': UploadCommand,
"docs": DocumentationCommand,
"test": DiscoverTest,
}
)