travis2docker 6.4.14__tar.gz → 6.4.16__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. {travis2docker-6.4.14 → travis2docker-6.4.16}/.bumpversion.cfg +1 -1
  2. {travis2docker-6.4.14 → travis2docker-6.4.16}/MANIFEST.in +1 -5
  3. {travis2docker-6.4.14/src/travis2docker.egg-info → travis2docker-6.4.16}/PKG-INFO +5 -1
  4. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/conf.py +2 -6
  5. {travis2docker-6.4.14 → travis2docker-6.4.16}/setup.py +1 -1
  6. travis2docker-6.4.16/src/travis2docker/__init__.py +1 -0
  7. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/cli.py +9 -1
  8. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/Dockerfile +4 -0
  9. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/Dockerfile_deployv +3 -1
  10. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/build.sh +0 -20
  11. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis2docker.py +26 -0
  12. {travis2docker-6.4.14 → travis2docker-6.4.16/src/travis2docker.egg-info}/PKG-INFO +5 -1
  13. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/SOURCES.txt +0 -13
  14. travis2docker-6.4.14/.cookiecutterrc +0 -49
  15. travis2docker-6.4.14/.editorconfig +0 -20
  16. travis2docker-6.4.14/.isort.cfg +0 -13
  17. travis2docker-6.4.14/.travis.yml +0 -68
  18. travis2docker-6.4.14/appveyor.yml +0 -70
  19. travis2docker-6.4.14/ci/appveyor-bootstrap.py +0 -113
  20. travis2docker-6.4.14/ci/appveyor-download.py +0 -107
  21. travis2docker-6.4.14/ci/appveyor-with-compiler.cmd +0 -46
  22. travis2docker-6.4.14/ci/bootstrap.py +0 -56
  23. travis2docker-6.4.14/ci/requirements.txt +0 -9
  24. travis2docker-6.4.14/ci/templates/.travis.yml +0 -38
  25. travis2docker-6.4.14/ci/templates/appveyor.yml +0 -53
  26. travis2docker-6.4.14/pyproject.toml +0 -3
  27. travis2docker-6.4.14/src/travis2docker/__init__.py +0 -1
  28. {travis2docker-6.4.14 → travis2docker-6.4.16}/.coveragerc +0 -0
  29. {travis2docker-6.4.14 → travis2docker-6.4.16}/AUTHORS.rst +0 -0
  30. {travis2docker-6.4.14 → travis2docker-6.4.16}/CHANGELOG.rst +0 -0
  31. {travis2docker-6.4.14 → travis2docker-6.4.16}/CONTRIBUTING.rst +0 -0
  32. {travis2docker-6.4.14 → travis2docker-6.4.16}/LICENSE +0 -0
  33. {travis2docker-6.4.14 → travis2docker-6.4.16}/README.rst +0 -0
  34. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/authors.rst +0 -0
  35. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/changelog.rst +0 -0
  36. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/contributing.rst +0 -0
  37. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/index.rst +0 -0
  38. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/installation.rst +0 -0
  39. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/readme.rst +0 -0
  40. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/reference/index.rst +0 -0
  41. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/reference/travis2docker.rst +0 -0
  42. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/requirements.txt +0 -0
  43. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/spelling_wordlist.txt +0 -0
  44. {travis2docker-6.4.14 → travis2docker-6.4.16}/docs/usage.rst +0 -0
  45. {travis2docker-6.4.14 → travis2docker-6.4.16}/examples/example_1.yml +0 -0
  46. {travis2docker-6.4.14 → travis2docker-6.4.16}/examples/example_2.yml +0 -0
  47. {travis2docker-6.4.14 → travis2docker-6.4.16}/examples/example_3.yml +0 -0
  48. {travis2docker-6.4.14 → travis2docker-6.4.16}/examples/example_4.yml +0 -0
  49. {travis2docker-6.4.14 → travis2docker-6.4.16}/examples/example_5.yml +0 -0
  50. {travis2docker-6.4.14 → travis2docker-6.4.16}/requirements.txt +0 -0
  51. {travis2docker-6.4.14 → travis2docker-6.4.16}/setup.cfg +0 -0
  52. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/__main__.py +0 -0
  53. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/docker_helper/build.py +0 -0
  54. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/exceptions.py +0 -0
  55. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/git_run.py +0 -0
  56. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/.coveragerc +0 -0
  57. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/.vscode/extensions.json +0 -0
  58. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/.vscode/launch.json +0 -0
  59. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/.vscode/settings.json +0 -0
  60. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/10-build.sh +0 -0
  61. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/20-run.sh +0 -0
  62. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/entrypoint.sh +0 -0
  63. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/entrypoint_deployv.sh +0 -0
  64. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/templates/rvm_env.sh +0 -0
  65. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/.git +0 -0
  66. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/.gitignore +0 -0
  67. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/.travis.yml +0 -0
  68. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/LICENSE +0 -0
  69. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/README.md +0 -0
  70. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/add_all.rb +0 -0
  71. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/bin/travis-add-source +0 -0
  72. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker/travis-ci-apt-source-whitelist/ubuntu.json +0 -0
  73. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/dependency_links.txt +0 -0
  74. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/entry_points.txt +0 -0
  75. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/not-zip-safe +0 -0
  76. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/requires.txt +0 -0
  77. {travis2docker-6.4.14 → travis2docker-6.4.16}/src/travis2docker.egg-info/top_level.txt +0 -0
  78. {travis2docker-6.4.14 → travis2docker-6.4.16}/tests/test_travis2docker.py +0 -0
  79. {travis2docker-6.4.14 → travis2docker-6.4.16}/tox.ini +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 6.4.14
2
+ current_version = 6.4.16
3
3
  commit = True
4
4
  tag = True
5
5
 
@@ -1,14 +1,10 @@
1
1
  graft docs
2
2
  graft examples
3
3
  graft src
4
- graft ci
5
4
  graft tests
6
5
 
7
6
  include .bumpversion.cfg
8
7
  include .coveragerc
9
- include .cookiecutterrc
10
- include .editorconfig
11
- include .isort.cfg
12
8
 
13
9
  include AUTHORS.rst
14
10
  include CHANGELOG.rst
@@ -17,7 +13,7 @@ include CONTRIBUTING.rst
17
13
  include LICENSE
18
14
  include README.rst
19
15
 
20
- include tox.ini .travis.yml appveyor.yml
16
+ include tox.ini
21
17
 
22
18
  global-exclude *.py[cod] __pycache__ *.so *.dylib
23
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: travis2docker
3
- Version: 6.4.14
3
+ Version: 6.4.16
4
4
  Summary: Script to generate Dockerfile from .travis.yml file
5
5
  Home-page: https://github.com/vauxoo/travis2docker
6
6
  Author: Vauxoo
@@ -26,6 +26,10 @@ Classifier: Topic :: Utilities
26
26
  Description-Content-Type: text/x-rst
27
27
  License-File: LICENSE
28
28
  License-File: AUTHORS.rst
29
+ Requires-Dist: PyYAML==3.12; python_version < "3.7"
30
+ Requires-Dist: PyYAML==6.0.*; python_version >= "3.7"
31
+ Requires-Dist: Jinja2==2.11.3; python_version < "3.7"
32
+ Requires-Dist: Jinja2==3.1.*; python_version >= "3.7"
29
33
 
30
34
  ========
31
35
  Overview
@@ -26,7 +26,7 @@ project = u'travis2docker'
26
26
  year = '2016'
27
27
  author = u'Vauxoo'
28
28
  copyright = '{0}, {1}'.format(year, author)
29
- version = release = u'6.4.14'
29
+ version = release = u'6.4.16'
30
30
 
31
31
  pygments_style = 'trac'
32
32
  templates_path = ['.']
@@ -34,12 +34,8 @@ extlinks = {
34
34
  'issue': ('https://github.com/vauxoo/travis2docker/issues/%s', '#'),
35
35
  'pr': ('https://github.com/vauxoo/travis2docker/pull/%s', 'PR #'),
36
36
  }
37
- # on_rtd is whether we are on readthedocs.org
38
- on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
39
-
40
- if not on_rtd: # only set the theme if we're building docs locally
41
- html_theme = 'sphinx_rtd_theme'
42
37
 
38
+ html_theme = 'sphinx_rtd_theme'
43
39
  html_use_smartypants = True
44
40
  html_last_updated_fmt = '%b %d, %Y'
45
41
  html_split_index = False
@@ -15,7 +15,7 @@ def read(*names, **kwargs):
15
15
 
16
16
  setup(
17
17
  name='travis2docker',
18
- version='6.4.14',
18
+ version='6.4.16',
19
19
  license='BSD',
20
20
  description='Script to generate Dockerfile from .travis.yml file',
21
21
  long_description='%s\n%s'
@@ -0,0 +1 @@
1
+ __version__ = "6.4.16"
@@ -94,7 +94,7 @@ def main(return_result=False):
94
94
  parser.add_argument(
95
95
  '--root-path',
96
96
  dest='root_path',
97
- help="Root path to save scripts generated." "\nDefault: 'tmp' dir of your O.S.",
97
+ help=f"Root path to save scripts generated.\nDefault: {default_root_path}",
98
98
  default=default_root_path,
99
99
  )
100
100
  parser.add_argument(
@@ -184,6 +184,13 @@ def main(return_result=False):
184
184
  default=False,
185
185
  help='Use the image generated from the CI and used in deployV',
186
186
  )
187
+ parser.add_argument(
188
+ '--build-extra-steps',
189
+ nargs='*',
190
+ default="",
191
+ dest='build_extra_steps',
192
+ help='Append these extra steps at the end of the Dockerfile',
193
+ )
187
194
 
188
195
  args = parser.parse_args()
189
196
  revision = args.git_revision
@@ -250,6 +257,7 @@ def main(return_result=False):
250
257
  runs_at_the_end_script=runs_at_the_end_script,
251
258
  build_env_args=build_env_args,
252
259
  deployv=deployv,
260
+ build_extra_steps=args.build_extra_steps,
253
261
  )
254
262
  t2d.build_extra_params = {
255
263
  'extra_params': build_extra_args,
@@ -39,6 +39,10 @@ RUN apt-get update; apt-get install {{ ' '.join(packages) }}
39
39
 
40
40
  RUN echo "TRAVIS_PYTHON_VERSION={{ python_version }}" >> /etc/environment
41
41
 
42
+ {% for step in build_extra_steps %}
43
+ RUN {{ step }}
44
+ {% endfor %}
45
+
42
46
  USER {{ user }}
43
47
  ENV TRAVIS_PYTHON_VERSION={{ python_version }}
44
48
  ENV TRAVIS_REPO_SLUG={{ repo_owner }}/{{ repo_project }}
@@ -34,11 +34,13 @@ RUN . /home/odoo/build.sh && \
34
34
  configure_vim && \
35
35
  configure_zsh && \
36
36
  chown_all && \
37
- set_authorized_keys && \
38
37
  mv /entrypoint_image /deployv_entrypoint_image && \
39
38
  mv /entry_point.py /deployv_entry_point.py && \
40
39
  mkdir /run/sshd
41
40
 
41
+ {% for step in build_extra_steps %}
42
+ RUN {{ step }}
43
+ {% endfor %}
42
44
 
43
45
  USER {{ user }}
44
46
 
@@ -55,26 +55,6 @@ EOF
55
55
  # alias odoo
56
56
  }
57
57
 
58
- set_authorized_keys(){
59
- YELLOW='\033[0;33m'
60
- NC='\033[0m'
61
-
62
- AUTH_FILE="${HOME}/.ssh/authorized_keys"
63
- ED_KEY="${HOME}/.ssh/id_ed25519.pub"
64
- RSA_KEY="${HOME}/.ssh/id_rsa.pub"
65
-
66
- echo "INFO: Adding public key to ~/.ssh/authorized_keys"
67
- if [ -f "${ED_KEY}" ]; then
68
- tee -a "${AUTH_FILE}" < "${ED_KEY}"
69
- elif [ -f "${RSA_KEY}" ]; then
70
- printf "${YELLOW}WARNING: RSA keys are deprecated, consider changing to ed25519\n${NC}"
71
- tee -a "${AUTH_FILE}" < "${RSA_KEY}"
72
- else
73
- echo "INFO: No public key found. No key added to ~/.ssh/authorized_keys"
74
- fi
75
- }
76
-
77
-
78
58
  # You can add new packages here
79
59
  install_dev_tools(){
80
60
  apt update -qq
@@ -77,6 +77,7 @@ class Travis2Docker(object):
77
77
  runs_at_the_end_script=None,
78
78
  build_env_args=None,
79
79
  deployv=None,
80
+ build_extra_steps=None,
80
81
  ):
81
82
  self._python_versions = []
82
83
  self.curr_work_path = None
@@ -87,6 +88,7 @@ class Travis2Docker(object):
87
88
  self.deployv = deployv
88
89
  self.runs_at_the_end_script = ["sleep 2"] if runs_at_the_end_script is None else runs_at_the_end_script
89
90
  self.variables_sh_data = {}
91
+ self.build_extra_steps = build_extra_steps
90
92
  if deployv:
91
93
  self.variables_sh_data = {
92
94
  var.lower(): value for _, _, var, value in self.re_export.findall(os_kwargs['variables_sh'])
@@ -304,6 +306,7 @@ class Travis2Docker(object):
304
306
  copies = []
305
307
  for copy_path, dest in self.copy_paths:
306
308
  copies.append((self.copy_path(copy_path), dest))
309
+ self.set_authorized_key()
307
310
  kwargs = {
308
311
  'runs': [],
309
312
  'copies': copies,
@@ -316,6 +319,7 @@ class Travis2Docker(object):
316
319
  'sources': [],
317
320
  'rvm_env_path': rvm_env_relpath,
318
321
  'build_env_args': self.build_env_args,
322
+ 'build_extra_steps': self.build_extra_steps,
319
323
  }
320
324
  with open(curr_dockerfile, "w") as f_dockerfile, open(entryp_path, "w") as f_entrypoint, open(
321
325
  rvm_env_path, "w"
@@ -378,3 +382,25 @@ class Travis2Docker(object):
378
382
  else:
379
383
  raise UserWarning("Just directory or file is supported to copy [%s]" % src)
380
384
  return os.path.relpath(dest_path, self.curr_work_path)
385
+
386
+ def set_authorized_key(self):
387
+ ssh_dir = os.path.expanduser("~/.ssh")
388
+ ed_key = os.path.join(ssh_dir, "id_ed25519.pub")
389
+ rsa_key = os.path.join(ssh_dir, "id_rsa.pub")
390
+
391
+ to_copy = False
392
+ if os.path.isfile(ed_key):
393
+ to_copy = ed_key
394
+ elif os.path.isfile(rsa_key):
395
+ print("RSA keys are deprecated, consider changing to ed25519")
396
+ to_copy = rsa_key
397
+
398
+ if not to_copy:
399
+ print("No public key found. No key added to ~/.ssh/authorized_keys. SSH login won't work.")
400
+ return
401
+
402
+ with open(to_copy, "r", encoding="utf-8") as key_fd:
403
+ pub_key = key_fd.read()
404
+
405
+ with open(os.path.join(self.curr_work_path, ".ssh", "authorized_keys"), "w", encoding="utf-8") as auth_fd:
406
+ auth_fd.write(pub_key)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: travis2docker
3
- Version: 6.4.14
3
+ Version: 6.4.16
4
4
  Summary: Script to generate Dockerfile from .travis.yml file
5
5
  Home-page: https://github.com/vauxoo/travis2docker
6
6
  Author: Vauxoo
@@ -26,6 +26,10 @@ Classifier: Topic :: Utilities
26
26
  Description-Content-Type: text/x-rst
27
27
  License-File: LICENSE
28
28
  License-File: AUTHORS.rst
29
+ Requires-Dist: PyYAML==3.12; python_version < "3.7"
30
+ Requires-Dist: PyYAML==6.0.*; python_version >= "3.7"
31
+ Requires-Dist: Jinja2==2.11.3; python_version < "3.7"
32
+ Requires-Dist: Jinja2==3.1.*; python_version >= "3.7"
29
33
 
30
34
  ========
31
35
  Overview
@@ -1,28 +1,15 @@
1
1
  .bumpversion.cfg
2
- .cookiecutterrc
3
2
  .coveragerc
4
- .editorconfig
5
- .isort.cfg
6
- .travis.yml
7
3
  AUTHORS.rst
8
4
  CHANGELOG.rst
9
5
  CONTRIBUTING.rst
10
6
  LICENSE
11
7
  MANIFEST.in
12
8
  README.rst
13
- appveyor.yml
14
- pyproject.toml
15
9
  requirements.txt
16
10
  setup.cfg
17
11
  setup.py
18
12
  tox.ini
19
- ci/appveyor-bootstrap.py
20
- ci/appveyor-download.py
21
- ci/appveyor-with-compiler.cmd
22
- ci/bootstrap.py
23
- ci/requirements.txt
24
- ci/templates/.travis.yml
25
- ci/templates/appveyor.yml
26
13
  docs/authors.rst
27
14
  docs/changelog.rst
28
15
  docs/conf.py
@@ -1,49 +0,0 @@
1
- # This file exists so you can easily regenerate your project.
2
- #
3
- # `cookiepatcher` is a convenient shim around `cookiecutter`
4
- # for regenerating projects (it will generate a .cookiecutterrc
5
- # automatically for any template). To use it:
6
- #
7
- # pip install cookiepatcher
8
- # cookiepatcher gh:ionelmc/cookiecutter-pylibrary project-path
9
- #
10
- # See:
11
- # https://pypi.python.org/pypi/cookiecutter
12
- #
13
- # Alternatively, you can run:
14
- #
15
- # cookiecutter --overwrite-if-exists --config-file=project-path/.cookiecutterrc gh:ionelmc/cookiecutter-pylibrary
16
-
17
- default_context:
18
-
19
- appveyor: 'yes'
20
- c_extension_cython: 'no'
21
- c_extension_optional: 'no'
22
- c_extension_support: 'no'
23
- codacy: 'no'
24
- codeclimate: 'no'
25
- codecov: 'yes'
26
- command_line_interface: 'argparse'
27
- command_line_interface_bin_name: 'travisfile2dockerfile'
28
- coveralls: 'no'
29
- distribution_name: 'travis2docker'
30
- email: 'info@vauxoo.com'
31
- full_name: 'Vauxoo'
32
- github_username: 'vauxoo'
33
- landscape: 'no'
34
- package_name: 'travis2docker'
35
- project_name: 'travis2docker'
36
- project_short_description: 'Script to generate Dockerfile from .travis.yml file'
37
- release_date: 'today'
38
- repo_name: 'travis2docker'
39
- requiresio: 'no'
40
- scrutinizer: 'no'
41
- sphinx_doctest: 'yes'
42
- sphinx_theme: 'sphinx-rtd-theme'
43
- test_matrix_configurator: 'no'
44
- test_matrix_separate_coverage: 'no'
45
- test_runner: 'pytest'
46
- travis: 'yes'
47
- version: '3.0.0'
48
- website: 'https://www.vauxoo.com/'
49
- year: 'now'
@@ -1,20 +0,0 @@
1
- # Configuration for known file extensions
2
- [*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
3
- charset = utf-8
4
- end_of_line = lf
5
- indent_size = 4
6
- indent_style = space
7
- insert_final_newline = true
8
- trim_trailing_whitespace = true
9
-
10
- [*.{json,yml,yaml,rst,md}]
11
- indent_size = 2
12
-
13
- # Do not configure editor for libs and autogenerated content
14
- [{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
15
- charset = unset
16
- end_of_line = unset
17
- indent_size = unset
18
- indent_style = unset
19
- insert_final_newline = false
20
- trim_trailing_whitespace = false
@@ -1,13 +0,0 @@
1
- [settings]
2
- ; see https://github.com/psf/black
3
- multi_line_output=3
4
- include_trailing_comma=True
5
- force_grid_wrap=0
6
- combine_as_imports=True
7
- use_parentheses=True
8
- line_length=88
9
- known_odoo=odoo
10
- known_odoo_addons=odoo.addons
11
- sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
12
- default_section=THIRDPARTY
13
- ensure_newline_before_comments = True
@@ -1,68 +0,0 @@
1
- language: python
2
- sudo: false
3
- env:
4
- global:
5
- - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so
6
- - SEGFAULT_SIGNALS=all
7
- matrix:
8
- include:
9
- - python: 2.7
10
- env:
11
- TOXENV=py27,codecov
12
- # TODO: Fix coverage diff version issue
13
- # - python: 3.4
14
- # env:
15
- # TOXENV=py34,codecov
16
- - python: 3.5
17
- env:
18
- TOXENV=py35,codecov
19
- - python: 3.6
20
- env:
21
- TOXENV=py36,codecov
22
- - python: 3.7
23
- env:
24
- TOXENV=py37,codecov
25
- - python: 3.8
26
- env:
27
- TOXENV=py38,codecov
28
- - python: 3.9
29
- env:
30
- TOXENV=py39,codecov
31
- - python: pypy
32
- env:
33
- TOXENV=pypy,codecov
34
- - python: 3.5
35
- env:
36
- TOXENV=check
37
- - python: 3.5
38
- env:
39
- TOXENV=docs
40
- before_install:
41
- - python --version
42
- - uname -a
43
- - lsb_release -a
44
- install:
45
- - pip install tox
46
- - virtualenv --version
47
- - easy_install --version
48
- - pip --version
49
- - tox --version
50
- script:
51
- - tox -ve $TOXENV
52
- after_failure:
53
- - more .tox/log/* | cat
54
- - more .tox/*/log/* | cat
55
- before_cache:
56
- - rm -rf $HOME/.cache/pip/log
57
- cache:
58
- directories:
59
- - $HOME/.cache/pip
60
- deploy:
61
- provider: pypi
62
- user: vauxoo
63
- password:
64
- secure: dScWMD2+phGrPeufO2TTQLa3ZW5olWrSf1xXwki2UcrPjF4vIHmFUFoHZ9zK3BPVnY114XArb7O5N0pGO+j9b8G3jXD0HA+jlkMEtrbRJ1kiKUAb4KzF3xs9S/qLNZ2I3+pcE29+faDEV4CErsmlVK/h2HEYVdseH+V0qXUGxEk2bY6NKQ5LGkhb4Ole3wWLah11vvAEGcYQLd0K/hRoNup0bDgmjacH4gfCXLfhNJkz3hw1D/FPYv2Z7AIVvo/UMQS62LisMKKcw7DltzMg7rp1tuQdt7gUBD/EGiqlyVqSgj7d0XOO3HucJK9KATQRDoetVwCQSiR5GwMu39zqijpd1AH5T4mxm9w7xAG9KGlog12dDjZe5eneGGXxfxApZ5K12huiSfxAMHiF6Yhm3BDNTh3WeWAYxH2o3XoqoB5DZowWWAw9Fdl3iG7QdNaboVZ6iOxPUxERJYkle5a74RraQyPEdv7xHyNZhjMrc1NOIzYswGsvMgW/TyCKpBqidSFrkOf6hCGOdMbRXmqtM+M2mAV4WuIJx3fbXT3nvpHmdMMMnwyAYY35CQaz2RcQ3mV7WcyKi0zyrys3wcgsZ2lBMxiqpmBJzDAZQDhBtX8xIKvtdZHf8lbUQFrQttwBgsZIL3eKVFE37iKJEIhMnWXvPcYyhhBYdeu4E9MarSQ=
65
- on:
66
- tags: true
67
- condition: $TOXENV == py37,codecov
68
- repo: Vauxoo/travis2docker
@@ -1,70 +0,0 @@
1
- version: '{branch}-{build}'
2
- build: off
3
- cache:
4
- - '%LOCALAPPDATA%\pip\Cache'
5
- environment:
6
- global:
7
- WITH_COMPILER: 'cmd /E:ON /V:ON /C .\ci\appveyor-with-compiler.cmd'
8
- nodejs_version: "0.10"
9
- matrix:
10
- - TOXENV: 'py27,codecov'
11
- TOXPYTHON: C:\Python27\python.exe
12
- PYTHON_HOME: C:\Python27
13
- PYTHON_VERSION: '2.7'
14
- PYTHON_ARCH: '32'
15
-
16
- - TOXENV: 'py27,codecov'
17
- TOXPYTHON: C:\Python27-x64\python.exe
18
- WINDOWS_SDK_VERSION: v7.0
19
- PYTHON_HOME: C:\Python27-x64
20
- PYTHON_VERSION: '2.7'
21
- PYTHON_ARCH: '64'
22
-
23
- - TOXENV: 'py34,codecov'
24
- TOXPYTHON: C:\Python34\python.exe
25
- PYTHON_HOME: C:\Python34
26
- PYTHON_VERSION: '3.4'
27
- PYTHON_ARCH: '32'
28
-
29
- - TOXENV: 'py34,codecov'
30
- TOXPYTHON: C:\Python34-x64\python.exe
31
- WINDOWS_SDK_VERSION: v7.1
32
- PYTHON_HOME: C:\Python34-x64
33
- PYTHON_VERSION: '3.4'
34
- PYTHON_ARCH: '64'
35
-
36
- - TOXENV: 'py35,codecov'
37
- TOXPYTHON: C:\Python35\python.exe
38
- PYTHON_HOME: C:\Python35
39
- PYTHON_VERSION: '3.5'
40
- PYTHON_ARCH: '32'
41
-
42
- - TOXENV: 'py35,codecov'
43
- TOXPYTHON: C:\Python35-x64\python.exe
44
- PYTHON_HOME: C:\Python35-x64
45
- PYTHON_VERSION: '3.5'
46
- PYTHON_ARCH: '64'
47
-
48
- init:
49
- - ps: echo $env:TOXENV
50
- - ps: ls C:\Python*
51
- - ps: Install-Product node $env:nodejs_version
52
- install:
53
- - python -u ci\appveyor-bootstrap.py
54
- - '%PYTHON_HOME%\Scripts\virtualenv --version'
55
- - '%PYTHON_HOME%\Scripts\easy_install --version'
56
- - '%PYTHON_HOME%\Scripts\pip --version'
57
- - '%PYTHON_HOME%\Scripts\tox --version'
58
- - npm --version
59
- test_script:
60
- - '%WITH_COMPILER% %PYTHON_HOME%\Scripts\tox'
61
-
62
- on_failure:
63
- - ps: dir "env:"
64
- - ps: get-content .tox\*\log\*
65
- artifacts:
66
- - path: dist\*
67
-
68
- ### To enable remote debugging uncomment this (also, see: http://www.appveyor.com/docs/how-to/rdp-to-build-worker):
69
- # on_finish:
70
- # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
@@ -1,113 +0,0 @@
1
- """
2
- AppVeyor will at least have few Pythons around so there's no point of implementing a bootstrapper in PowerShell.
3
-
4
- This is a port of https://github.com/pypa/python-packaging-user-guide/blob/master/source/code/install.ps1
5
- with various fixes and improvements that just weren't feasible to implement in PowerShell.
6
- """
7
- from __future__ import print_function
8
- from os import environ
9
- from os.path import exists
10
- from subprocess import check_call
11
-
12
- try:
13
- from urllib.request import urlretrieve
14
- except ImportError:
15
- from urllib import urlretrieve
16
-
17
- BASE_URL = "https://www.python.org/ftp/python/"
18
- GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
19
- GET_PIP_PATH = "C:\get-pip.py"
20
- URLS = {
21
- ("2.7", "64"): BASE_URL + "2.7.10/python-2.7.10.amd64.msi",
22
- ("2.7", "32"): BASE_URL + "2.7.10/python-2.7.10.msi",
23
- # NOTE: no .msi installer for 3.3.6
24
- ("3.3", "64"): BASE_URL + "3.3.3/python-3.3.3.amd64.msi",
25
- ("3.3", "32"): BASE_URL + "3.3.3/python-3.3.3.msi",
26
- ("3.4", "64"): BASE_URL + "3.4.3/python-3.4.3.amd64.msi",
27
- ("3.4", "32"): BASE_URL + "3.4.3/python-3.4.3.msi",
28
- ("3.5", "64"): BASE_URL + "3.5.0/python-3.5.0-amd64.exe",
29
- ("3.5", "32"): BASE_URL + "3.5.0/python-3.5.0.exe",
30
- }
31
- INSTALL_CMD = {
32
- # Commands are allowed to fail only if they are not the last command. Eg: uninstall (/x) allowed to fail.
33
- "2.7": [["msiexec.exe", "/L*+!", "install.log", "/qn", "/x", "{path}"],
34
- ["msiexec.exe", "/L*+!", "install.log", "/qn", "/i", "{path}", "TARGETDIR={home}"]],
35
- "3.3": [["msiexec.exe", "/L*+!", "install.log", "/qn", "/x", "{path}"],
36
- ["msiexec.exe", "/L*+!", "install.log", "/qn", "/i", "{path}", "TARGETDIR={home}"]],
37
- "3.4": [["msiexec.exe", "/L*+!", "install.log", "/qn", "/x", "{path}"],
38
- ["msiexec.exe", "/L*+!", "install.log", "/qn", "/i", "{path}", "TARGETDIR={home}"]],
39
- "3.5": [["{path}", "/quiet", "TargetDir={home}"]],
40
- }
41
-
42
-
43
- def download_file(url, path):
44
- print("Downloading: {} (into {})".format(url, path))
45
- progress = [0, 0]
46
-
47
- def report(count, size, total):
48
- progress[0] = count * size
49
- if progress[0] - progress[1] > 1000000:
50
- progress[1] = progress[0]
51
- print("Downloaded {:,}/{:,} ...".format(progress[1], total))
52
-
53
- dest, _ = urlretrieve(url, path, reporthook=report)
54
- return dest
55
-
56
-
57
- def install_python(version, arch, home):
58
- print("Installing Python", version, "for", arch, "bit architecture to", home)
59
- if exists(home):
60
- return
61
-
62
- path = download_python(version, arch)
63
- print("Installing", path, "to", home)
64
- success = False
65
- for cmd in INSTALL_CMD[version]:
66
- cmd = [part.format(home=home, path=path) for part in cmd]
67
- print("Running:", " ".join(cmd))
68
- try:
69
- check_call(cmd)
70
- except Exception as exc:
71
- print("Failed command", cmd, "with:", exc)
72
- if exists("install.log"):
73
- with open("install.log") as fh:
74
- print(fh.read())
75
- else:
76
- success = True
77
- if success:
78
- print("Installation complete!")
79
- else:
80
- print("Installation failed")
81
-
82
-
83
- def download_python(version, arch):
84
- for _ in range(3):
85
- try:
86
- return download_file(URLS[version, arch], "installer.exe")
87
- except Exception as exc:
88
- print("Failed to download:", exc)
89
- print("Retrying ...")
90
-
91
-
92
- def install_pip(home):
93
- pip_path = home + "/Scripts/pip.exe"
94
- python_path = home + "/python.exe"
95
- if exists(pip_path):
96
- print("pip already installed.")
97
- else:
98
- print("Installing pip...")
99
- download_file(GET_PIP_URL, GET_PIP_PATH)
100
- print("Executing:", python_path, GET_PIP_PATH)
101
- check_call([python_path, GET_PIP_PATH])
102
-
103
-
104
- def install_packages(home, *packages):
105
- cmd = [home + "/Scripts/pip.exe", "install"]
106
- cmd.extend(packages)
107
- check_call(cmd)
108
-
109
-
110
- if __name__ == "__main__":
111
- install_python(environ['PYTHON_VERSION'], environ['PYTHON_ARCH'], environ['PYTHON_HOME'])
112
- install_pip(environ['PYTHON_HOME'])
113
- install_packages(environ['PYTHON_HOME'], "setuptools>=18.0.1", "wheel", "tox", "virtualenv>=13.1.0")
@@ -1,107 +0,0 @@
1
- #!/usr/bin/env python
2
- """
3
- Use the AppVeyor API to download Windows artifacts.
4
-
5
- Taken from: https://bitbucket.org/ned/coveragepy/src/tip/ci/download_appveyor.py
6
- # Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
7
- # For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
8
- """
9
- from __future__ import unicode_literals
10
-
11
- import argparse
12
- import os
13
- import requests
14
- import zipfile
15
-
16
-
17
- def make_auth_headers():
18
- """Make the authentication headers needed to use the Appveyor API."""
19
- path = os.path.expanduser("~/.appveyor.token")
20
- if not os.path.exists(path):
21
- raise RuntimeError(
22
- "Please create a file named `.appveyor.token` in your home directory. "
23
- "You can get the token from https://ci.appveyor.com/api-token"
24
- )
25
- with open(path) as f:
26
- token = f.read().strip()
27
-
28
- headers = {
29
- 'Authorization': 'Bearer {}'.format(token),
30
- }
31
- return headers
32
-
33
-
34
- def download_latest_artifacts(account_project, build_id):
35
- """Download all the artifacts from the latest build."""
36
- if build_id is None:
37
- url = "https://ci.appveyor.com/api/projects/{}".format(account_project)
38
- else:
39
- url = "https://ci.appveyor.com/api/projects/{}/build/{}".format(account_project, build_id)
40
- build = requests.get(url, headers=make_auth_headers()).json()
41
- jobs = build['build']['jobs']
42
- print(u"Build {0[build][version]}, {1} jobs: {0[build][message]}".format(build, len(jobs)))
43
-
44
- for job in jobs:
45
- name = job['name']
46
- print(u" {0}: {1[status]}, {1[artifactsCount]} artifacts".format(name, job))
47
-
48
- url = "https://ci.appveyor.com/api/buildjobs/{}/artifacts".format(job['jobId'])
49
- response = requests.get(url, headers=make_auth_headers())
50
- artifacts = response.json()
51
-
52
- for artifact in artifacts:
53
- is_zip = artifact['type'] == "Zip"
54
- filename = artifact['fileName']
55
- print(u" {0}, {1} bytes".format(filename, artifact['size']))
56
-
57
- url = "https://ci.appveyor.com/api/buildjobs/{}/artifacts/{}".format(job['jobId'], filename)
58
- download_url(url, filename, make_auth_headers())
59
-
60
- if is_zip:
61
- unpack_zipfile(filename)
62
- os.remove(filename)
63
-
64
-
65
- def ensure_dirs(filename):
66
- """Make sure the directories exist for `filename`."""
67
- dirname, _ = os.path.split(filename)
68
- if dirname and not os.path.exists(dirname):
69
- os.makedirs(dirname)
70
-
71
-
72
- def download_url(url, filename, headers):
73
- """Download a file from `url` to `filename`."""
74
- ensure_dirs(filename)
75
- response = requests.get(url, headers=headers, stream=True)
76
- if response.status_code == 200:
77
- with open(filename, 'wb') as f:
78
- for chunk in response.iter_content(16 * 1024):
79
- f.write(chunk)
80
- else:
81
- print(u" Error downloading {}: {}".format(url, response))
82
-
83
-
84
- def unpack_zipfile(filename):
85
- """Unpack a zipfile, using the names in the zip."""
86
- with open(filename, 'rb') as fzip:
87
- z = zipfile.ZipFile(fzip)
88
- for name in z.namelist():
89
- print(u" extracting {}".format(name))
90
- ensure_dirs(name)
91
- z.extract(name)
92
-
93
- parser = argparse.ArgumentParser(description='Download artifacts from AppVeyor.')
94
- parser.add_argument('--id',
95
- metavar='PROJECT_ID',
96
- default='vauxoo/travis2docker',
97
- help='Project ID in AppVeyor.')
98
- parser.add_argument('build',
99
- nargs='?',
100
- metavar='BUILD_ID',
101
- help='Build ID in AppVeyor. Eg: master-123')
102
-
103
- if __name__ == "__main__":
104
- # import logging
105
- # logging.basicConfig(level="DEBUG")
106
- args = parser.parse_args()
107
- download_latest_artifacts(args.id, args.build)
@@ -1,46 +0,0 @@
1
- :: To build extensions for 64 bit Python 3, we need to configure environment
2
- :: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of:
3
- :: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1)
4
- ::
5
- :: To build extensions for 64 bit Python 2, we need to configure environment
6
- :: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of:
7
- :: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0)
8
- ::
9
- :: 32 bit builds do not require specific environment configurations.
10
- ::
11
- :: Note: this script needs to be run with the /E:ON and /V:ON flags for the
12
- :: cmd interpreter, at least for (SDK v7.0)
13
- ::
14
- :: More details at:
15
- :: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows
16
- :: http://stackoverflow.com/a/13751649/163740
17
- ::
18
- :: Author: Olivier Grisel
19
- :: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
20
- SET COMMAND_TO_RUN=%*
21
- SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows
22
- SET WIN_WDK="c:\Program Files (x86)\Windows Kits\10\Include\wdf"
23
- ECHO SDK: %WINDOWS_SDK_VERSION% ARCH: %PYTHON_ARCH%
24
-
25
-
26
- IF "%PYTHON_VERSION%"=="3.5" (
27
- IF EXIST %WIN_WDK% (
28
- REM See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/
29
- REN %WIN_WDK% 0wdf
30
- )
31
- GOTO main
32
- )
33
-
34
- IF "%PYTHON_ARCH%"=="32" (
35
- GOTO main
36
- )
37
-
38
- SET DISTUTILS_USE_SDK=1
39
- SET MSSdk=1
40
- "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION%
41
- CALL "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release
42
-
43
- :main
44
-
45
- ECHO Executing: %COMMAND_TO_RUN%
46
- CALL %COMMAND_TO_RUN% || EXIT 1
@@ -1,56 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
- from __future__ import absolute_import, print_function, unicode_literals
4
-
5
- import os
6
- import sys
7
- from os.path import exists
8
- from os.path import join
9
- from os.path import dirname
10
- from os.path import abspath
11
-
12
-
13
- if __name__ == "__main__":
14
- base_path = dirname(dirname(abspath(__file__)))
15
- print("Project path: {0}".format(base_path))
16
- env_path = join(base_path, ".tox", "bootstrap")
17
- if sys.platform == "win32":
18
- bin_path = join(env_path, "Scripts")
19
- else:
20
- bin_path = join(env_path, "bin")
21
- if not exists(env_path):
22
- import subprocess
23
- print("Making bootstrap env in: {0} ...".format(env_path))
24
- try:
25
- subprocess.check_call(["virtualenv", env_path])
26
- except Exception:
27
- subprocess.check_call([sys.executable, "-m", "virtualenv", env_path])
28
- print("Installing `jinja2` into bootstrap environment ...")
29
- subprocess.check_call([join(bin_path, "pip"), "install", "jinja2"])
30
- activate = join(bin_path, "activate_this.py")
31
- exec(compile(open(activate, "rb").read(), activate, "exec"), dict(__file__=activate))
32
-
33
- import jinja2
34
-
35
- import subprocess
36
-
37
-
38
- jinja = jinja2.Environment(
39
- loader=jinja2.FileSystemLoader(join(base_path, "ci", "templates")),
40
- trim_blocks=True,
41
- lstrip_blocks=True,
42
- keep_trailing_newline=True
43
- )
44
-
45
- tox_environments = [
46
- line.strip()
47
- for line in subprocess.check_output(['tox', '--listenvs'], universal_newlines=True).splitlines()
48
- ]
49
- tox_environments = [line for line in tox_environments if line not in ['clean', 'report', 'docs', 'check']]
50
-
51
-
52
- for name in os.listdir(join("ci", "templates")):
53
- with open(join(base_path, name), "w") as fh:
54
- fh.write(jinja.get_template(name).render(tox_environments=tox_environments))
55
- print("Wrote {}".format(name))
56
- print("DONE.")
@@ -1,9 +0,0 @@
1
- virtualenv>=16.6.0
2
- pip>=19.1.1
3
- setuptools>=18.0.1
4
- six>=1.14.0
5
- tox
6
- # only to generate changelog based on git commits
7
- pbr
8
- twine
9
- wheel
@@ -1,38 +0,0 @@
1
- language: python
2
- python: '3.5'
3
- sudo: false
4
- env:
5
- global:
6
- - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so
7
- - SEGFAULT_SIGNALS=all
8
- matrix:
9
- - TOXENV=check
10
- - TOXENV=docs
11
- {% for env in tox_environments %}{{ '' }}
12
- - TOXENV={{ env }},codecov
13
- {% endfor %}
14
-
15
- before_install:
16
- - python --version
17
- - uname -a
18
- - lsb_release -a
19
- install:
20
- - pip install tox
21
- - virtualenv --version
22
- - easy_install --version
23
- - pip --version
24
- - tox --version
25
- script:
26
- - tox -v
27
- after_failure:
28
- - more .tox/log/* | cat
29
- - more .tox/*/log/* | cat
30
- before_cache:
31
- - rm -rf $HOME/.cache/pip/log
32
- cache:
33
- directories:
34
- - $HOME/.cache/pip
35
- notifications:
36
- email:
37
- on_success: never
38
- on_failure: always
@@ -1,53 +0,0 @@
1
- version: '{branch}-{build}'
2
- build: off
3
- cache:
4
- - '%LOCALAPPDATA%\pip\Cache'
5
- environment:
6
- global:
7
- WITH_COMPILER: 'cmd /E:ON /V:ON /C .\ci\appveyor-with-compiler.cmd'
8
- matrix:
9
- - TOXENV: check
10
- PYTHON_HOME: C:\Python27
11
- PYTHON_VERSION: '2.7'
12
- PYTHON_ARCH: '32'
13
-
14
- {% for env in tox_environments %}{% if env.startswith(('py27', 'py34', 'py35')) %}
15
- - TOXENV: '{{ env }},codecov'
16
- TOXPYTHON: C:\Python{{ env[2:4] }}\python.exe
17
- PYTHON_HOME: C:\Python{{ env[2:4] }}
18
- PYTHON_VERSION: '{{ env[2] }}.{{ env[3] }}'
19
- PYTHON_ARCH: '32'
20
-
21
- - TOXENV: '{{ env }},codecov'
22
- TOXPYTHON: C:\Python{{ env[2:4] }}-x64\python.exe
23
- {%- if env.startswith(('py2', 'py33', 'py34')) %}
24
-
25
- WINDOWS_SDK_VERSION: v7.{{ '1' if env.startswith('py3') else '0' }}
26
- {%- endif %}
27
-
28
- PYTHON_HOME: C:\Python{{ env[2:4] }}-x64
29
- PYTHON_VERSION: '{{ env[2] }}.{{ env[3] }}'
30
- PYTHON_ARCH: '64'
31
-
32
- {% endif %}{% endfor %}
33
- init:
34
- - ps: echo $env:TOXENV
35
- - ps: ls C:\Python*
36
- install:
37
- - python -u ci\appveyor-bootstrap.py
38
- - '%PYTHON_HOME%\Scripts\virtualenv --version'
39
- - '%PYTHON_HOME%\Scripts\easy_install --version'
40
- - '%PYTHON_HOME%\Scripts\pip --version'
41
- - '%PYTHON_HOME%\Scripts\tox --version'
42
- test_script:
43
- - '%WITH_COMPILER% %PYTHON_HOME%\Scripts\tox'
44
-
45
- on_failure:
46
- - ps: dir "env:"
47
- - ps: get-content .tox\*\log\*
48
- artifacts:
49
- - path: dist\*
50
-
51
- ### To enable remote debugging uncomment this (also, see: http://www.appveyor.com/docs/how-to/rdp-to-build-worker):
52
- # on_finish:
53
- # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
@@ -1,3 +0,0 @@
1
- [tool.black]
2
- line-length=119
3
- skip-string-normalization=true
@@ -1 +0,0 @@
1
- __version__ = "6.4.14"
File without changes
File without changes
File without changes