rigid 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/rigid +4 -0
- data/rigid +16 -0
- data/vendor/PyYAML-3.12.dist-info/DESCRIPTION.rst +12 -0
- data/vendor/PyYAML-3.12.dist-info/INSTALLER +1 -0
- data/vendor/PyYAML-3.12.dist-info/METADATA +35 -0
- data/vendor/PyYAML-3.12.dist-info/RECORD +42 -0
- data/vendor/PyYAML-3.12.dist-info/WHEEL +5 -0
- data/vendor/PyYAML-3.12.dist-info/metadata.json +1 -0
- data/vendor/PyYAML-3.12.dist-info/top_level.txt +2 -0
- data/vendor/_yaml.so +0 -0
- data/vendor/click/__init__.py +98 -0
- data/vendor/click/__init__.pyc +0 -0
- data/vendor/click/_bashcomplete.py +83 -0
- data/vendor/click/_bashcomplete.pyc +0 -0
- data/vendor/click/_compat.py +642 -0
- data/vendor/click/_compat.pyc +0 -0
- data/vendor/click/_termui_impl.py +547 -0
- data/vendor/click/_termui_impl.pyc +0 -0
- data/vendor/click/_textwrap.py +38 -0
- data/vendor/click/_textwrap.pyc +0 -0
- data/vendor/click/_unicodefun.py +119 -0
- data/vendor/click/_unicodefun.pyc +0 -0
- data/vendor/click/_winconsole.py +273 -0
- data/vendor/click/_winconsole.pyc +0 -0
- data/vendor/click/core.py +1738 -0
- data/vendor/click/core.pyc +0 -0
- data/vendor/click/decorators.py +304 -0
- data/vendor/click/decorators.pyc +0 -0
- data/vendor/click/exceptions.py +201 -0
- data/vendor/click/exceptions.pyc +0 -0
- data/vendor/click/formatting.py +256 -0
- data/vendor/click/formatting.pyc +0 -0
- data/vendor/click/globals.py +48 -0
- data/vendor/click/globals.pyc +0 -0
- data/vendor/click/parser.py +426 -0
- data/vendor/click/parser.pyc +0 -0
- data/vendor/click/termui.py +539 -0
- data/vendor/click/termui.pyc +0 -0
- data/vendor/click/testing.py +322 -0
- data/vendor/click/testing.pyc +0 -0
- data/vendor/click/types.py +550 -0
- data/vendor/click/types.pyc +0 -0
- data/vendor/click/utils.py +415 -0
- data/vendor/click/utils.pyc +0 -0
- data/vendor/click-6.6.dist-info/DESCRIPTION.rst +3 -0
- data/vendor/click-6.6.dist-info/INSTALLER +1 -0
- data/vendor/click-6.6.dist-info/METADATA +16 -0
- data/vendor/click-6.6.dist-info/RECORD +41 -0
- data/vendor/click-6.6.dist-info/WHEEL +6 -0
- data/vendor/click-6.6.dist-info/metadata.json +1 -0
- data/vendor/click-6.6.dist-info/top_level.txt +1 -0
- data/vendor/easy_install.py +5 -0
- data/vendor/easy_install.pyc +0 -0
- data/vendor/pip-9.0.1.dist-info/DESCRIPTION.rst +39 -0
- data/vendor/pip-9.0.1.dist-info/INSTALLER +1 -0
- data/vendor/pip-9.0.1.dist-info/METADATA +69 -0
- data/vendor/pip-9.0.1.dist-info/RECORD +501 -0
- data/vendor/pip-9.0.1.dist-info/WHEEL +6 -0
- data/vendor/pip-9.0.1.dist-info/entry_points.txt +5 -0
- data/vendor/pip-9.0.1.dist-info/metadata.json +1 -0
- data/vendor/pip-9.0.1.dist-info/top_level.txt +1 -0
- data/vendor/pkg_resources/__init__.py +3051 -0
- data/vendor/pkg_resources/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/__init__.py +0 -0
- data/vendor/pkg_resources/_vendor/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/appdirs.py +552 -0
- data/vendor/pkg_resources/_vendor/appdirs.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/__about__.py +21 -0
- data/vendor/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/__init__.py +14 -0
- data/vendor/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/_compat.py +30 -0
- data/vendor/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/_structures.py +68 -0
- data/vendor/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/markers.py +287 -0
- data/vendor/pkg_resources/_vendor/packaging/markers.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/requirements.py +127 -0
- data/vendor/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/specifiers.py +774 -0
- data/vendor/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/utils.py +14 -0
- data/vendor/pkg_resources/_vendor/packaging/utils.pyc +0 -0
- data/vendor/pkg_resources/_vendor/packaging/version.py +393 -0
- data/vendor/pkg_resources/_vendor/packaging/version.pyc +0 -0
- data/vendor/pkg_resources/_vendor/pyparsing.py +5696 -0
- data/vendor/pkg_resources/_vendor/pyparsing.pyc +0 -0
- data/vendor/pkg_resources/_vendor/six.py +868 -0
- data/vendor/pkg_resources/_vendor/six.pyc +0 -0
- data/vendor/pkg_resources/extern/__init__.py +73 -0
- data/vendor/pkg_resources/extern/__init__.pyc +0 -0
- data/vendor/requests/__init__.py +86 -0
- data/vendor/requests/__init__.pyc +0 -0
- data/vendor/requests/adapters.py +503 -0
- data/vendor/requests/adapters.pyc +0 -0
- data/vendor/requests/api.py +148 -0
- data/vendor/requests/api.pyc +0 -0
- data/vendor/requests/auth.py +252 -0
- data/vendor/requests/auth.pyc +0 -0
- data/vendor/requests/cacert.pem +5616 -0
- data/vendor/requests/certs.py +25 -0
- data/vendor/requests/certs.pyc +0 -0
- data/vendor/requests/compat.py +66 -0
- data/vendor/requests/compat.pyc +0 -0
- data/vendor/requests/cookies.py +540 -0
- data/vendor/requests/cookies.pyc +0 -0
- data/vendor/requests/exceptions.py +114 -0
- data/vendor/requests/exceptions.pyc +0 -0
- data/vendor/requests/hooks.py +34 -0
- data/vendor/requests/hooks.pyc +0 -0
- data/vendor/requests/models.py +873 -0
- data/vendor/requests/models.pyc +0 -0
- data/vendor/requests/packages/__init__.py +36 -0
- data/vendor/requests/packages/__init__.pyc +0 -0
- data/vendor/requests/packages/chardet/__init__.py +32 -0
- data/vendor/requests/packages/chardet/__init__.pyc +0 -0
- data/vendor/requests/packages/chardet/big5freq.py +925 -0
- data/vendor/requests/packages/chardet/big5freq.pyc +0 -0
- data/vendor/requests/packages/chardet/big5prober.py +42 -0
- data/vendor/requests/packages/chardet/big5prober.pyc +0 -0
- data/vendor/requests/packages/chardet/chardetect.py +80 -0
- data/vendor/requests/packages/chardet/chardetect.pyc +0 -0
- data/vendor/requests/packages/chardet/chardistribution.py +231 -0
- data/vendor/requests/packages/chardet/chardistribution.pyc +0 -0
- data/vendor/requests/packages/chardet/charsetgroupprober.py +106 -0
- data/vendor/requests/packages/chardet/charsetgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/charsetprober.py +62 -0
- data/vendor/requests/packages/chardet/charsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/codingstatemachine.py +61 -0
- data/vendor/requests/packages/chardet/codingstatemachine.pyc +0 -0
- data/vendor/requests/packages/chardet/compat.py +34 -0
- data/vendor/requests/packages/chardet/compat.pyc +0 -0
- data/vendor/requests/packages/chardet/constants.py +39 -0
- data/vendor/requests/packages/chardet/constants.pyc +0 -0
- data/vendor/requests/packages/chardet/cp949prober.py +44 -0
- data/vendor/requests/packages/chardet/cp949prober.pyc +0 -0
- data/vendor/requests/packages/chardet/escprober.py +86 -0
- data/vendor/requests/packages/chardet/escprober.pyc +0 -0
- data/vendor/requests/packages/chardet/escsm.py +242 -0
- data/vendor/requests/packages/chardet/escsm.pyc +0 -0
- data/vendor/requests/packages/chardet/eucjpprober.py +90 -0
- data/vendor/requests/packages/chardet/eucjpprober.pyc +0 -0
- data/vendor/requests/packages/chardet/euckrfreq.py +596 -0
- data/vendor/requests/packages/chardet/euckrfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/euckrprober.py +42 -0
- data/vendor/requests/packages/chardet/euckrprober.pyc +0 -0
- data/vendor/requests/packages/chardet/euctwfreq.py +428 -0
- data/vendor/requests/packages/chardet/euctwfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/euctwprober.py +41 -0
- data/vendor/requests/packages/chardet/euctwprober.pyc +0 -0
- data/vendor/requests/packages/chardet/gb2312freq.py +472 -0
- data/vendor/requests/packages/chardet/gb2312freq.pyc +0 -0
- data/vendor/requests/packages/chardet/gb2312prober.py +41 -0
- data/vendor/requests/packages/chardet/gb2312prober.pyc +0 -0
- data/vendor/requests/packages/chardet/hebrewprober.py +283 -0
- data/vendor/requests/packages/chardet/hebrewprober.pyc +0 -0
- data/vendor/requests/packages/chardet/jisfreq.py +569 -0
- data/vendor/requests/packages/chardet/jisfreq.pyc +0 -0
- data/vendor/requests/packages/chardet/jpcntx.py +227 -0
- data/vendor/requests/packages/chardet/jpcntx.pyc +0 -0
- data/vendor/requests/packages/chardet/langbulgarianmodel.py +229 -0
- data/vendor/requests/packages/chardet/langbulgarianmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langcyrillicmodel.py +329 -0
- data/vendor/requests/packages/chardet/langcyrillicmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langgreekmodel.py +225 -0
- data/vendor/requests/packages/chardet/langgreekmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langhebrewmodel.py +201 -0
- data/vendor/requests/packages/chardet/langhebrewmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langhungarianmodel.py +225 -0
- data/vendor/requests/packages/chardet/langhungarianmodel.pyc +0 -0
- data/vendor/requests/packages/chardet/langthaimodel.py +200 -0
- data/vendor/requests/packages/chardet/langthaimodel.pyc +0 -0
- data/vendor/requests/packages/chardet/latin1prober.py +139 -0
- data/vendor/requests/packages/chardet/latin1prober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcharsetprober.py +86 -0
- data/vendor/requests/packages/chardet/mbcharsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcsgroupprober.py +54 -0
- data/vendor/requests/packages/chardet/mbcsgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/mbcssm.py +572 -0
- data/vendor/requests/packages/chardet/mbcssm.pyc +0 -0
- data/vendor/requests/packages/chardet/sbcharsetprober.py +120 -0
- data/vendor/requests/packages/chardet/sbcharsetprober.pyc +0 -0
- data/vendor/requests/packages/chardet/sbcsgroupprober.py +69 -0
- data/vendor/requests/packages/chardet/sbcsgroupprober.pyc +0 -0
- data/vendor/requests/packages/chardet/sjisprober.py +91 -0
- data/vendor/requests/packages/chardet/sjisprober.pyc +0 -0
- data/vendor/requests/packages/chardet/universaldetector.py +170 -0
- data/vendor/requests/packages/chardet/universaldetector.pyc +0 -0
- data/vendor/requests/packages/chardet/utf8prober.py +76 -0
- data/vendor/requests/packages/chardet/utf8prober.pyc +0 -0
- data/vendor/requests/packages/urllib3/__init__.py +96 -0
- data/vendor/requests/packages/urllib3/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/_collections.py +324 -0
- data/vendor/requests/packages/urllib3/_collections.pyc +0 -0
- data/vendor/requests/packages/urllib3/connection.py +330 -0
- data/vendor/requests/packages/urllib3/connection.pyc +0 -0
- data/vendor/requests/packages/urllib3/connectionpool.py +866 -0
- data/vendor/requests/packages/urllib3/connectionpool.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/__init__.py +0 -0
- data/vendor/requests/packages/urllib3/contrib/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/appengine.py +231 -0
- data/vendor/requests/packages/urllib3/contrib/appengine.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/ntlmpool.py +115 -0
- data/vendor/requests/packages/urllib3/contrib/ntlmpool.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/pyopenssl.py +358 -0
- data/vendor/requests/packages/urllib3/contrib/pyopenssl.pyc +0 -0
- data/vendor/requests/packages/urllib3/contrib/socks.py +172 -0
- data/vendor/requests/packages/urllib3/contrib/socks.pyc +0 -0
- data/vendor/requests/packages/urllib3/exceptions.py +209 -0
- data/vendor/requests/packages/urllib3/exceptions.pyc +0 -0
- data/vendor/requests/packages/urllib3/fields.py +178 -0
- data/vendor/requests/packages/urllib3/fields.pyc +0 -0
- data/vendor/requests/packages/urllib3/filepost.py +94 -0
- data/vendor/requests/packages/urllib3/filepost.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/__init__.py +5 -0
- data/vendor/requests/packages/urllib3/packages/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ordered_dict.py +259 -0
- data/vendor/requests/packages/urllib3/packages/ordered_dict.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/six.py +868 -0
- data/vendor/requests/packages/urllib3/packages/six.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +13 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +105 -0
- data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc +0 -0
- data/vendor/requests/packages/urllib3/poolmanager.py +367 -0
- data/vendor/requests/packages/urllib3/poolmanager.pyc +0 -0
- data/vendor/requests/packages/urllib3/request.py +151 -0
- data/vendor/requests/packages/urllib3/request.pyc +0 -0
- data/vendor/requests/packages/urllib3/response.py +530 -0
- data/vendor/requests/packages/urllib3/response.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/__init__.py +46 -0
- data/vendor/requests/packages/urllib3/util/__init__.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/connection.py +144 -0
- data/vendor/requests/packages/urllib3/util/connection.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/request.py +72 -0
- data/vendor/requests/packages/urllib3/util/request.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/response.py +74 -0
- data/vendor/requests/packages/urllib3/util/response.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/retry.py +300 -0
- data/vendor/requests/packages/urllib3/util/retry.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/ssl_.py +320 -0
- data/vendor/requests/packages/urllib3/util/ssl_.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/timeout.py +242 -0
- data/vendor/requests/packages/urllib3/util/timeout.pyc +0 -0
- data/vendor/requests/packages/urllib3/util/url.py +217 -0
- data/vendor/requests/packages/urllib3/util/url.pyc +0 -0
- data/vendor/requests/sessions.py +712 -0
- data/vendor/requests/sessions.pyc +0 -0
- data/vendor/requests/status_codes.py +91 -0
- data/vendor/requests/status_codes.pyc +0 -0
- data/vendor/requests/structures.py +105 -0
- data/vendor/requests/structures.pyc +0 -0
- data/vendor/requests/utils.py +817 -0
- data/vendor/requests/utils.pyc +0 -0
- data/vendor/requests-2.11.1.dist-info/DESCRIPTION.rst +1294 -0
- data/vendor/requests-2.11.1.dist-info/INSTALLER +1 -0
- data/vendor/requests-2.11.1.dist-info/METADATA +1323 -0
- data/vendor/requests-2.11.1.dist-info/RECORD +170 -0
- data/vendor/requests-2.11.1.dist-info/WHEEL +6 -0
- data/vendor/requests-2.11.1.dist-info/metadata.json +1 -0
- data/vendor/requests-2.11.1.dist-info/top_level.txt +1 -0
- data/vendor/rigid/__init__.py +1 -0
- data/vendor/rigid/__init__.pyc +0 -0
- data/vendor/rigid/api.py +129 -0
- data/vendor/rigid/api.pyc +0 -0
- data/vendor/rigid/commands/__init__.py +260 -0
- data/vendor/rigid/commands/__init__.pyc +0 -0
- data/vendor/rigid/commands/deploy.py +0 -0
- data/vendor/rigid/commands/deploy.pyc +0 -0
- data/vendor/rigid/deploy.py +70 -0
- data/vendor/rigid/deploy.pyc +0 -0
- data/vendor/rigid/file_scanner.py +63 -0
- data/vendor/rigid/file_scanner.pyc +0 -0
- data/vendor/rigid/utils.py +17 -0
- data/vendor/rigid/utils.pyc +0 -0
- data/vendor/rigid-0.2.0.dist-info/DESCRIPTION.rst +3 -0
- data/vendor/rigid-0.2.0.dist-info/INSTALLER +1 -0
- data/vendor/rigid-0.2.0.dist-info/METADATA +23 -0
- data/vendor/rigid-0.2.0.dist-info/RECORD +49 -0
- data/vendor/rigid-0.2.0.dist-info/WHEEL +5 -0
- data/vendor/rigid-0.2.0.dist-info/entry_points.txt +3 -0
- data/vendor/rigid-0.2.0.dist-info/metadata.json +1 -0
- data/vendor/rigid-0.2.0.dist-info/top_level.txt +2 -0
- data/vendor/setuptools-28.8.0.dist-info/DESCRIPTION.rst +243 -0
- data/vendor/setuptools-28.8.0.dist-info/INSTALLER +1 -0
- data/vendor/setuptools-28.8.0.dist-info/METADATA +272 -0
- data/vendor/setuptools-28.8.0.dist-info/RECORD +143 -0
- data/vendor/setuptools-28.8.0.dist-info/WHEEL +6 -0
- data/vendor/setuptools-28.8.0.dist-info/dependency_links.txt +2 -0
- data/vendor/setuptools-28.8.0.dist-info/entry_points.txt +63 -0
- data/vendor/setuptools-28.8.0.dist-info/metadata.json +1 -0
- data/vendor/setuptools-28.8.0.dist-info/top_level.txt +3 -0
- data/vendor/setuptools-28.8.0.dist-info/zip-safe +1 -0
- data/vendor/tests/__init__.py +0 -0
- data/vendor/tests/__init__.pyc +0 -0
- data/vendor/tests/integration/__init__.py +0 -0
- data/vendor/tests/integration/__init__.pyc +0 -0
- data/vendor/tests/integration/test_app.py +63 -0
- data/vendor/tests/integration/test_app.pyc +0 -0
- data/vendor/tests/integration/test_apps.py +27 -0
- data/vendor/tests/integration/test_apps.pyc +0 -0
- data/vendor/tests/integration/test_deploy.py +128 -0
- data/vendor/tests/integration/test_deploy.pyc +0 -0
- data/vendor/tests/integration/test_domains.py +35 -0
- data/vendor/tests/integration/test_domains.pyc +0 -0
- data/vendor/tests/integration/test_login.py +37 -0
- data/vendor/tests/integration/test_login.pyc +0 -0
- data/vendor/tests/integration/test_promote.py +24 -0
- data/vendor/tests/integration/test_promote.pyc +0 -0
- data/vendor/tests/integration/test_token.py +33 -0
- data/vendor/tests/integration/test_token.pyc +0 -0
- data/vendor/tests/integration/test_whoami.py +24 -0
- data/vendor/tests/integration/test_whoami.pyc +0 -0
- data/vendor/tests/test_deploy.py +33 -0
- data/vendor/tests/test_deploy.pyc +0 -0
- data/vendor/tests/test_file_scanner.py +89 -0
- data/vendor/tests/test_file_scanner.pyc +0 -0
- data/vendor/tests/utils.py +78 -0
- data/vendor/tests/utils.pyc +0 -0
- data/vendor/wheel-0.30.0a0.dist-info/DESCRIPTION.rst +325 -0
- data/vendor/wheel-0.30.0a0.dist-info/INSTALLER +1 -0
- data/vendor/wheel-0.30.0a0.dist-info/LICENSE.txt +22 -0
- data/vendor/wheel-0.30.0a0.dist-info/METADATA +357 -0
- data/vendor/wheel-0.30.0a0.dist-info/RECORD +86 -0
- data/vendor/wheel-0.30.0a0.dist-info/WHEEL +6 -0
- data/vendor/wheel-0.30.0a0.dist-info/entry_points.txt +6 -0
- data/vendor/wheel-0.30.0a0.dist-info/metadata.json +1 -0
- data/vendor/wheel-0.30.0a0.dist-info/top_level.txt +1 -0
- data/vendor/yaml/__init__.py +315 -0
- data/vendor/yaml/__init__.pyc +0 -0
- data/vendor/yaml/composer.py +139 -0
- data/vendor/yaml/composer.pyc +0 -0
- data/vendor/yaml/constructor.py +675 -0
- data/vendor/yaml/constructor.pyc +0 -0
- data/vendor/yaml/cyaml.py +85 -0
- data/vendor/yaml/cyaml.pyc +0 -0
- data/vendor/yaml/dumper.py +62 -0
- data/vendor/yaml/dumper.pyc +0 -0
- data/vendor/yaml/emitter.py +1140 -0
- data/vendor/yaml/emitter.pyc +0 -0
- data/vendor/yaml/error.py +75 -0
- data/vendor/yaml/error.pyc +0 -0
- data/vendor/yaml/events.py +86 -0
- data/vendor/yaml/events.pyc +0 -0
- data/vendor/yaml/loader.py +40 -0
- data/vendor/yaml/loader.pyc +0 -0
- data/vendor/yaml/nodes.py +49 -0
- data/vendor/yaml/nodes.pyc +0 -0
- data/vendor/yaml/parser.py +589 -0
- data/vendor/yaml/parser.pyc +0 -0
- data/vendor/yaml/reader.py +190 -0
- data/vendor/yaml/reader.pyc +0 -0
- data/vendor/yaml/representer.py +486 -0
- data/vendor/yaml/representer.pyc +0 -0
- data/vendor/yaml/resolver.py +227 -0
- data/vendor/yaml/resolver.pyc +0 -0
- data/vendor/yaml/scanner.py +1453 -0
- data/vendor/yaml/scanner.pyc +0 -0
- data/vendor/yaml/serializer.py +111 -0
- data/vendor/yaml/serializer.pyc +0 -0
- data/vendor/yaml/tokens.py +104 -0
- data/vendor/yaml/tokens.pyc +0 -0
- metadata +407 -0
@@ -0,0 +1,128 @@
|
|
1
|
+
import os
|
2
|
+
import unittest
|
3
|
+
from click.testing import CliRunner
|
4
|
+
|
5
|
+
from rigid.commands import cli
|
6
|
+
|
7
|
+
from ..utils import FakeServer
|
8
|
+
|
9
|
+
FIXTURES = os.path.join(os.path.dirname(__file__), '..', 'fixtures')
|
10
|
+
|
11
|
+
class DeployTests(unittest.TestCase):
|
12
|
+
def setUp(self):
|
13
|
+
super(DeployTests, self).setUp()
|
14
|
+
self.server = FakeServer()
|
15
|
+
|
16
|
+
self.server.status = 200
|
17
|
+
self.server.responses = [
|
18
|
+
# Preflight (head)
|
19
|
+
{},
|
20
|
+
|
21
|
+
# Create Source
|
22
|
+
{'body': {'uuid': 'source-uuid', 'upload': {'method': 'PUT', 'url': self.server.url + '/upload-source'}}},
|
23
|
+
|
24
|
+
# Upload Source
|
25
|
+
{},
|
26
|
+
|
27
|
+
# Create version
|
28
|
+
{'body': {'uuid': 'version-uuid'}},
|
29
|
+
|
30
|
+
# Promote version
|
31
|
+
{'body': {}},
|
32
|
+
]
|
33
|
+
|
34
|
+
def test_deploy_without_app(self):
|
35
|
+
runner = CliRunner()
|
36
|
+
result = runner.invoke(cli, ['deploy', FIXTURES], env={'RIGID_API': self.server.url})
|
37
|
+
self.assertEqual(result.exit_code, 2)
|
38
|
+
self.assertEqual(result.output, 'Usage: cli deploy [OPTIONS] SOURCE\n\nError: Missing option "--app" / "-a".\n')
|
39
|
+
|
40
|
+
|
41
|
+
def test_deploy_success(self):
|
42
|
+
runner = CliRunner()
|
43
|
+
result = runner.invoke(cli, ['deploy', '-a', 'testingapp', FIXTURES], env={'RIGID_API': self.server.url}, catch_exceptions=False)
|
44
|
+
self.assertEqual(result.exit_code, 0)
|
45
|
+
|
46
|
+
self.assertEqual(len(self.server.requests), 5)
|
47
|
+
|
48
|
+
# Preflight (to check auth and permissions to app)
|
49
|
+
self.assertEqual(self.server.requests[0]['method'], 'HEAD')
|
50
|
+
self.assertEqual(self.server.requests[0]['path'], '/apps/testingapp')
|
51
|
+
|
52
|
+
# Create a source
|
53
|
+
self.assertEqual(self.server.requests[1]['method'], 'POST')
|
54
|
+
self.assertEqual(self.server.requests[1]['path'], '/sources')
|
55
|
+
|
56
|
+
# Upload source
|
57
|
+
self.assertEqual(self.server.requests[2]['method'], 'PUT')
|
58
|
+
self.assertEqual(self.server.requests[2]['path'], '/upload-source')
|
59
|
+
|
60
|
+
# Create version
|
61
|
+
self.assertEqual(self.server.requests[3]['method'], 'POST')
|
62
|
+
self.assertEqual(self.server.requests[3]['path'], '/apps/testingapp/versions')
|
63
|
+
|
64
|
+
# Promote version
|
65
|
+
self.assertEqual(self.server.requests[4]['method'], 'PUT')
|
66
|
+
self.assertEqual(self.server.requests[4]['path'], '/apps/testingapp/aliases/production')
|
67
|
+
|
68
|
+
def test_deploy_create(self):
|
69
|
+
self.server.responses = [
|
70
|
+
{'body': {'name': 'testingapp'}}
|
71
|
+
] + self.server.responses[1:]
|
72
|
+
|
73
|
+
runner = CliRunner()
|
74
|
+
result = runner.invoke(cli, ['deploy', '--create', '-a', 'testingapp', FIXTURES], env={'RIGID_API': self.server.url}, catch_exceptions=False)
|
75
|
+
self.assertEqual(result.exit_code, 0)
|
76
|
+
|
77
|
+
self.assertEqual(len(self.server.requests), 5)
|
78
|
+
|
79
|
+
# Preflight (to check auth and permissions to app)
|
80
|
+
self.assertEqual(self.server.requests[0]['method'], 'POST')
|
81
|
+
self.assertEqual(self.server.requests[0]['path'], '/apps')
|
82
|
+
|
83
|
+
# Create a source
|
84
|
+
self.assertEqual(self.server.requests[1]['method'], 'POST')
|
85
|
+
self.assertEqual(self.server.requests[1]['path'], '/sources')
|
86
|
+
|
87
|
+
# Upload source
|
88
|
+
self.assertEqual(self.server.requests[2]['method'], 'PUT')
|
89
|
+
self.assertEqual(self.server.requests[2]['path'], '/upload-source')
|
90
|
+
|
91
|
+
# Create version
|
92
|
+
self.assertEqual(self.server.requests[3]['method'], 'POST')
|
93
|
+
self.assertEqual(self.server.requests[3]['path'], '/apps/testingapp/versions')
|
94
|
+
|
95
|
+
# Promote version
|
96
|
+
self.assertEqual(self.server.requests[4]['method'], 'PUT')
|
97
|
+
self.assertEqual(self.server.requests[4]['path'], '/apps/testingapp/aliases/production')
|
98
|
+
|
99
|
+
def test_deploy_create_random_name(self):
|
100
|
+
self.server.responses = [
|
101
|
+
{'body': {'name': 'rando'}}
|
102
|
+
] + self.server.responses[1:]
|
103
|
+
|
104
|
+
runner = CliRunner()
|
105
|
+
result = runner.invoke(cli, ['deploy', '--create', FIXTURES], env={'RIGID_API': self.server.url})
|
106
|
+
self.assertEqual(result.exit_code, 0)
|
107
|
+
|
108
|
+
self.assertEqual(len(self.server.requests), 5)
|
109
|
+
|
110
|
+
# Preflight (to check auth and permissions to app)
|
111
|
+
self.assertEqual(self.server.requests[0]['method'], 'POST')
|
112
|
+
self.assertEqual(self.server.requests[0]['path'], '/apps')
|
113
|
+
|
114
|
+
# Create a source
|
115
|
+
self.assertEqual(self.server.requests[1]['method'], 'POST')
|
116
|
+
self.assertEqual(self.server.requests[1]['path'], '/sources')
|
117
|
+
|
118
|
+
# Upload source
|
119
|
+
self.assertEqual(self.server.requests[2]['method'], 'PUT')
|
120
|
+
self.assertEqual(self.server.requests[2]['path'], '/upload-source')
|
121
|
+
|
122
|
+
# Create version
|
123
|
+
self.assertEqual(self.server.requests[3]['method'], 'POST')
|
124
|
+
self.assertEqual(self.server.requests[3]['path'], '/apps/rando/versions')
|
125
|
+
|
126
|
+
# Promote version
|
127
|
+
self.assertEqual(self.server.requests[4]['method'], 'PUT')
|
128
|
+
self.assertEqual(self.server.requests[4]['path'], '/apps/rando/aliases/production')
|
Binary file
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import unittest
|
2
|
+
from click.testing import CliRunner
|
3
|
+
|
4
|
+
from rigid.commands import cli
|
5
|
+
|
6
|
+
from ..utils import FakeServer
|
7
|
+
|
8
|
+
|
9
|
+
class DomainTests(unittest.TestCase):
|
10
|
+
def setUp(self):
|
11
|
+
super(DomainTests, self).setUp()
|
12
|
+
self.server = FakeServer()
|
13
|
+
|
14
|
+
def test_add_domain(self):
|
15
|
+
self.server.status = 202
|
16
|
+
self.server.body = {}
|
17
|
+
|
18
|
+
runner = CliRunner()
|
19
|
+
result = runner.invoke(cli, ['domains', '--add', 'example.com', '-a', 'test'], env={'RIGID_API': self.server.url}, catch_exceptions=False)
|
20
|
+
self.assertEqual(result.exit_code, 0)
|
21
|
+
self.assertEqual(result.output, 'example.com has been added to test.\n')
|
22
|
+
|
23
|
+
self.assertEqual(self.server.request['method'], 'POST')
|
24
|
+
self.assertEqual(self.server.request['path'], '/apps/test/aliases/production/domains')
|
25
|
+
|
26
|
+
def test_remove_domain(self):
|
27
|
+
self.server.status = 204
|
28
|
+
|
29
|
+
runner = CliRunner()
|
30
|
+
result = runner.invoke(cli, ['domains', '--remove', 'example.com', '-a', 'test'], env={'RIGID_API': self.server.url})
|
31
|
+
self.assertEqual(result.exit_code, 0)
|
32
|
+
self.assertEqual(result.output, 'example.com has been removed from test.\n')
|
33
|
+
|
34
|
+
self.assertEqual(self.server.request['method'], 'DELETE')
|
35
|
+
self.assertEqual(self.server.request['path'], '/apps/test/aliases/production/domains/example.com')
|
Binary file
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import unittest
|
2
|
+
from click.testing import CliRunner
|
3
|
+
|
4
|
+
from rigid.commands import cli
|
5
|
+
|
6
|
+
from ..utils import FakeServer
|
7
|
+
|
8
|
+
|
9
|
+
class LoginTests(unittest.TestCase):
|
10
|
+
def setUp(self):
|
11
|
+
super(LoginTests, self).setUp()
|
12
|
+
self.server = FakeServer()
|
13
|
+
|
14
|
+
def test_login_success(self):
|
15
|
+
self.server.status = 200
|
16
|
+
self.server.body = { 'token': 'abc' }
|
17
|
+
|
18
|
+
runner = CliRunner()
|
19
|
+
result = runner.invoke(cli, ['login'], input='kyle@example.com\nsecretpw\n', env={'RIGID_API': self.server.url})
|
20
|
+
self.assertEqual(result.exit_code, 0)
|
21
|
+
|
22
|
+
self.assertEqual(self.server.request['method'], 'POST')
|
23
|
+
self.assertEqual(self.server.request['path'], '/authorizations')
|
24
|
+
self.assertEqual(self.server.request['headers']['Authorization'], 'Basic a3lsZUBleGFtcGxlLmNvbTpzZWNyZXRwdw==')
|
25
|
+
|
26
|
+
def test_login_failure(self):
|
27
|
+
self.server.status = 401
|
28
|
+
self.server.body = {}
|
29
|
+
|
30
|
+
runner = CliRunner()
|
31
|
+
result = runner.invoke(cli, ['login'], input='kyle@example.com\nsecret\n', env={'RIGID_API': self.server.url})
|
32
|
+
self.assertEqual(result.exit_code, 1)
|
33
|
+
self.assertEqual(result.output, 'Enter your Rigid credentials.\nEmail: kyle@example.com\nPassword: \nError: Invalid Credentials\n')
|
34
|
+
|
35
|
+
self.assertEqual(self.server.request['method'], 'POST')
|
36
|
+
self.assertEqual(self.server.request['path'], '/authorizations')
|
37
|
+
self.assertEqual(self.server.request['headers']['Authorization'], 'Basic a3lsZUBleGFtcGxlLmNvbTpzZWNyZXQ=')
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import unittest
|
2
|
+
from click.testing import CliRunner
|
3
|
+
|
4
|
+
from rigid.commands import cli
|
5
|
+
|
6
|
+
from ..utils import FakeServer
|
7
|
+
|
8
|
+
|
9
|
+
class PromoteTests(unittest.TestCase):
|
10
|
+
def setUp(self):
|
11
|
+
super(PromoteTests, self).setUp()
|
12
|
+
self.server = FakeServer()
|
13
|
+
|
14
|
+
def test_promote(self):
|
15
|
+
self.server.status = 200
|
16
|
+
self.server.body = {'version': 'testing'}
|
17
|
+
|
18
|
+
runner = CliRunner()
|
19
|
+
result = runner.invoke(cli, ['promote', '-a', 'test', 'abc'], env={'RIGID_API': self.server.url}, catch_exceptions=False)
|
20
|
+
self.assertEqual(result.exit_code, 0)
|
21
|
+
self.assertEqual(result.output, 'test/production is now running testing.\n')
|
22
|
+
|
23
|
+
self.assertEqual(self.server.request['method'], 'PUT')
|
24
|
+
self.assertEqual(self.server.request['path'], '/apps/test/aliases/production')
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import unittest
|
2
|
+
from click.testing import CliRunner
|
3
|
+
|
4
|
+
from rigid.commands import cli
|
5
|
+
|
6
|
+
from ..utils import FakeServer
|
7
|
+
|
8
|
+
|
9
|
+
class TokenTests(unittest.TestCase):
|
10
|
+
def setUp(self):
|
11
|
+
super(TokenTests, self).setUp()
|
12
|
+
self.server = FakeServer()
|
13
|
+
|
14
|
+
self.server.status = 200
|
15
|
+
self.server.body = { 'token': 'abc' }
|
16
|
+
|
17
|
+
def test_token_success(self):
|
18
|
+
runner = CliRunner()
|
19
|
+
result = runner.invoke(cli, ['token'], env={'RIGID_API': self.server.url})
|
20
|
+
self.assertEqual(result.exit_code, 0)
|
21
|
+
self.assertEqual(result.output, 'abc\n')
|
22
|
+
|
23
|
+
self.assertEqual(self.server.request['method'], 'POST')
|
24
|
+
self.assertEqual(self.server.request['path'], '/authorizations')
|
25
|
+
|
26
|
+
def test_token_with_scopes(self):
|
27
|
+
runner = CliRunner()
|
28
|
+
result = runner.invoke(cli, ['token', '--scope', 'example'], env={'RIGID_API': self.server.url})
|
29
|
+
self.assertEqual(result.exit_code, 0)
|
30
|
+
self.assertEqual(result.output, 'abc\n')
|
31
|
+
|
32
|
+
self.assertEqual(self.server.request['method'], 'POST')
|
33
|
+
self.assertEqual(self.server.request['path'], '/authorizations')
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import unittest
|
2
|
+
from click.testing import CliRunner
|
3
|
+
|
4
|
+
from rigid.commands import cli
|
5
|
+
|
6
|
+
from ..utils import FakeServer
|
7
|
+
|
8
|
+
|
9
|
+
class WhoamiTests(unittest.TestCase):
|
10
|
+
def setUp(self):
|
11
|
+
super(WhoamiTests, self).setUp()
|
12
|
+
self.server = FakeServer()
|
13
|
+
|
14
|
+
def test_whoami_success(self):
|
15
|
+
self.server.status = 200
|
16
|
+
self.server.body = { 'email': 'kyle@example.com' }
|
17
|
+
|
18
|
+
runner = CliRunner()
|
19
|
+
result = runner.invoke(cli, ['whoami'], env={'RIGID_API': self.server.url})
|
20
|
+
self.assertEqual(result.exit_code, 0)
|
21
|
+
self.assertEqual(result.output, 'kyle@example.com\n')
|
22
|
+
|
23
|
+
self.assertEqual(self.server.request['method'], 'GET')
|
24
|
+
self.assertEqual(self.server.request['path'], '/user')
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import os
|
2
|
+
import unittest
|
3
|
+
from threading import Thread
|
4
|
+
|
5
|
+
from six.moves import BaseHTTPServer
|
6
|
+
|
7
|
+
from rigid.api import Client
|
8
|
+
from rigid.deploy import Deploy
|
9
|
+
|
10
|
+
from .utils import FakeServer
|
11
|
+
|
12
|
+
FIXTURES = os.path.join(os.path.dirname(__file__), 'fixtures')
|
13
|
+
|
14
|
+
|
15
|
+
class DeployTests(unittest.TestCase):
|
16
|
+
def setUp(self):
|
17
|
+
self.client = Client()
|
18
|
+
self.deploy = Deploy(self.client, os.path.join(FIXTURES, 'scanner'))
|
19
|
+
|
20
|
+
def test_collect_files(self):
|
21
|
+
self.assertEqual(self.deploy.collect_files(), [
|
22
|
+
'index.html',
|
23
|
+
'posts/hello-internet.html',
|
24
|
+
'posts/hello-world.html',
|
25
|
+
'posts/index.html',
|
26
|
+
])
|
27
|
+
|
28
|
+
def test_collect_files_with_ignore_file(self):
|
29
|
+
deploy = Deploy(self.client, FIXTURES)
|
30
|
+
self.assertEqual(deploy.collect_files(), [
|
31
|
+
'scanner/index.html',
|
32
|
+
'scanner/posts/index.html',
|
33
|
+
])
|
Binary file
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import os
|
2
|
+
import tempfile
|
3
|
+
import tarfile
|
4
|
+
import unittest
|
5
|
+
|
6
|
+
from rigid.file_scanner import scan, tar, Skipper
|
7
|
+
|
8
|
+
FIXTURES = os.path.join(os.path.dirname(__file__), 'fixtures')
|
9
|
+
|
10
|
+
|
11
|
+
class FileScannerTests(unittest.TestCase):
|
12
|
+
def test_scan_directory(self):
|
13
|
+
path = os.path.join(FIXTURES, 'scanner')
|
14
|
+
files = scan(path)
|
15
|
+
|
16
|
+
self.assertEqual(set(files), set([
|
17
|
+
'index.html',
|
18
|
+
'posts/hello-internet.html',
|
19
|
+
'posts/hello-world.html',
|
20
|
+
'posts/index.html',
|
21
|
+
]))
|
22
|
+
|
23
|
+
|
24
|
+
class TarTests(unittest.TestCase):
|
25
|
+
def test_tar(self):
|
26
|
+
fd = tempfile.NamedTemporaryFile()
|
27
|
+
path = os.path.join(FIXTURES, 'scanner')
|
28
|
+
tar(fd.name, ['posts/hello-internet.html', 'index.html'], path)
|
29
|
+
|
30
|
+
with tarfile.open(fd.name) as tarball:
|
31
|
+
self.assertEqual(tarball.getnames(), ['posts/hello-internet.html', 'index.html'])
|
32
|
+
|
33
|
+
post = tarball.getmember('index.html')
|
34
|
+
self.assertEqual(post.size, 13)
|
35
|
+
self.assertEqual(post.type, tarfile.REGTYPE)
|
36
|
+
|
37
|
+
post = tarball.getmember('posts/hello-internet.html')
|
38
|
+
self.assertEqual(post.size, 16)
|
39
|
+
self.assertEqual(post.type, tarfile.REGTYPE)
|
40
|
+
|
41
|
+
fd.close()
|
42
|
+
|
43
|
+
|
44
|
+
class SkipperTests(unittest.TestCase):
|
45
|
+
def test_skipper_default_rules(self):
|
46
|
+
skipper = Skipper([])
|
47
|
+
|
48
|
+
rules = [
|
49
|
+
'.git',
|
50
|
+
'.DS_Store',
|
51
|
+
'.rigid.yaml',
|
52
|
+
'.rigid-*.yaml',
|
53
|
+
|
54
|
+
# Vim swap files
|
55
|
+
'*~',
|
56
|
+
'*.swp',
|
57
|
+
'*.swo',
|
58
|
+
]
|
59
|
+
|
60
|
+
self.assertEqual(skipper.rules, rules)
|
61
|
+
self.assertEqual(skipper.DEFAULT_RULES, rules)
|
62
|
+
|
63
|
+
def test_skipper_component(self):
|
64
|
+
skipper = Skipper(['ignored'])
|
65
|
+
|
66
|
+
self.assertFalse(skipper.test('hello-world.html'))
|
67
|
+
self.assertFalse(skipper.test('ignored.html'))
|
68
|
+
self.assertTrue(skipper.test('ignored'))
|
69
|
+
self.assertTrue(skipper.test('ignored/index.html'))
|
70
|
+
self.assertTrue(skipper.test('deep/ignored/index.html'))
|
71
|
+
self.assertTrue(skipper.test('directory/ignored'))
|
72
|
+
|
73
|
+
def test_skipper_wildcard(self):
|
74
|
+
skipper = Skipper(['*.html'])
|
75
|
+
|
76
|
+
self.assertFalse(skipper.test('hello-html'))
|
77
|
+
self.assertFalse(skipper.test('html'))
|
78
|
+
self.assertTrue(skipper.test('test.html'))
|
79
|
+
self.assertTrue(skipper.test('testing/test.html'))
|
80
|
+
|
81
|
+
def test_callable(self):
|
82
|
+
skipper = Skipper(['ignored'])
|
83
|
+
self.assertFalse(skipper('ignored'))
|
84
|
+
self.assertTrue(skipper('not-ignored'))
|
85
|
+
|
86
|
+
def test_skipper_from_path(self):
|
87
|
+
path = os.path.join(FIXTURES, 'skipper')
|
88
|
+
skipper = Skipper.open(path)
|
89
|
+
self.assertEqual(skipper.rules, ['*.py', 'foo', 'bar'] + skipper.DEFAULT_RULES)
|
Binary file
|
@@ -0,0 +1,78 @@
|
|
1
|
+
import json
|
2
|
+
from threading import Thread
|
3
|
+
|
4
|
+
from six.moves import BaseHTTPServer
|
5
|
+
|
6
|
+
|
7
|
+
class FakeServer(object):
|
8
|
+
def __init__(self):
|
9
|
+
self.requests = []
|
10
|
+
self.responses = []
|
11
|
+
|
12
|
+
self.status = 204
|
13
|
+
self.body = None
|
14
|
+
|
15
|
+
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
|
16
|
+
def dispatch(handler, method):
|
17
|
+
if len(self.responses) > 0:
|
18
|
+
status = self.responses[len(self.requests)].get('status', self.status)
|
19
|
+
body = self.responses[len(self.requests)].get('body', self.body)
|
20
|
+
else:
|
21
|
+
status = self.status
|
22
|
+
body = self.body
|
23
|
+
|
24
|
+
self.requests.append({
|
25
|
+
'method': method,
|
26
|
+
'path': handler.path,
|
27
|
+
'headers': handler.headers,
|
28
|
+
})
|
29
|
+
|
30
|
+
handler.send_response(status)
|
31
|
+
|
32
|
+
if body is not None:
|
33
|
+
body = json.dumps(body)
|
34
|
+
handler.send_header('Content-Length', str(len(body)))
|
35
|
+
handler.send_header('Content-Type', 'application/json')
|
36
|
+
|
37
|
+
handler.end_headers()
|
38
|
+
|
39
|
+
if body:
|
40
|
+
handler.wfile.write(body)
|
41
|
+
|
42
|
+
def do_HEAD(handler):
|
43
|
+
handler.dispatch('HEAD')
|
44
|
+
|
45
|
+
def do_GET(handler):
|
46
|
+
handler.dispatch('GET')
|
47
|
+
|
48
|
+
def do_PUT(handler):
|
49
|
+
handler.dispatch('PUT')
|
50
|
+
|
51
|
+
def do_POST(handler):
|
52
|
+
handler.dispatch('POST')
|
53
|
+
|
54
|
+
def do_DELETE(handler):
|
55
|
+
handler.dispatch('DELETE')
|
56
|
+
|
57
|
+
def log_request(self, *args):
|
58
|
+
pass # Disable default logging
|
59
|
+
|
60
|
+
self.server = BaseHTTPServer.HTTPServer(('localhost', 0), Handler)
|
61
|
+
self.server.timeout = 0.5
|
62
|
+
self.thread = Thread(target=self.server.serve_forever, args=(0.1,))
|
63
|
+
self.thread.daemon = True
|
64
|
+
self.thread.start()
|
65
|
+
|
66
|
+
@property
|
67
|
+
def url(self):
|
68
|
+
return 'http://{0}:{1}'.format(*self.server.server_address)
|
69
|
+
|
70
|
+
@property
|
71
|
+
def request(self):
|
72
|
+
""" Returns the last request """
|
73
|
+
return self.requests[-1]
|
74
|
+
|
75
|
+
def shutdown(self):
|
76
|
+
self.server.shutdown()
|
77
|
+
self.thread.join()
|
78
|
+
self.server.server_close()
|
Binary file
|