aboutsummaryrefslogtreecommitdiff
path: root/cbc
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-17 13:57:23 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-17 13:57:23 -0400
commit237d2159faac7dadb0232e35f7016588db568808 (patch)
tree19482c130efee570b7e985121dbf372b6965db50 /cbc
parent16a6d3d6c9495d3a67d74835f1d25329418ba832 (diff)
downloadcbc-237d2159faac7dadb0232e35f7016588db568808.tar.gz
Restructuring and setuptools integration1.0
Diffstat (limited to 'cbc')
-rw-r--r--cbc/__init__.py2
-rw-r--r--cbc/cli/__init__.py0
-rwxr-xr-xcbc/cli/build.py100
-rw-r--r--cbc/cli/server.py (renamed from cbc/server.py)14
-rw-r--r--cbc/tests/__init__.py0
-rw-r--r--cbc/tests/data/test.ini47
-rw-r--r--cbc/tests/test_cbc.py66
7 files changed, 221 insertions, 8 deletions
diff --git a/cbc/__init__.py b/cbc/__init__.py
index 8c167d0..7fc79f7 100644
--- a/cbc/__init__.py
+++ b/cbc/__init__.py
@@ -1,5 +1,5 @@
from . import environment
from . import meta
-from . import server
from . import utils
from . import parsers
+from . import cli
diff --git a/cbc/cli/__init__.py b/cbc/cli/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cbc/cli/__init__.py
diff --git a/cbc/cli/build.py b/cbc/cli/build.py
new file mode 100755
index 0000000..ce5fa62
--- /dev/null
+++ b/cbc/cli/build.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+import argparse
+import os
+import conda_build.metadata
+import cbc
+
+
+def main():
+ no_upload = ''
+ use_local = ''
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--force-rebuild',
+ action='store_true',
+ help='Do not stop if package already installed')
+ parser.add_argument('--no-build',
+ action='store_true',
+ help='Generate metadata from cbc configuration (useful for manual building)')
+ parser.add_argument('--no-upload',
+ action='store_true',
+ help='Do not upload to anaconda.org (aka. binstar)')
+ parser.add_argument('--use-local',
+ action='store_true',
+ help='Install built package from [...]/conda-bld/pkgs repository')
+ parser.add_argument('cbcfile',
+ nargs='+',
+ help='CBC metadata')
+ args = parser.parse_args()
+
+ # Initialize cbc internal environment
+ env = cbc.environment.Environment()
+
+ # Convert cbcfile paths to absolute paths
+ args.cbcfile = [ os.path.abspath(x) for x in args.cbcfile ]
+
+ # Verify we have a file that exists
+ for cbcfile in args.cbcfile:
+ if not os.path.exists(cbcfile):
+ print('{} does not exist.'.format(cbcfile))
+ exit(1)
+ elif not os.path.isfile(cbcfile):
+ print('{} is not a file.'.format(cbcfile))
+ exit(1)
+
+ if args.no_upload:
+ no_upload = '--no-binstar-upload'
+
+ if args.use_local:
+ use_local = '--use-local'
+
+ print('CBC_HOME is {0}'.format(env.cbchome))
+ # Perform build(s)
+ for cbcfile in args.cbcfile:
+ print('Using cbc build configuration: {0}'.format(cbcfile))
+ # Ensure the working directory remains the same throughout.
+ os.chdir(env.pwd)
+
+ metadata = cbc.meta.MetaData(cbcfile, env)
+ metadata.env.mkpkgdir(metadata.local['package']['name'])
+ metadata.render_scripts()
+ metadata.copy_patches()
+
+ print('Scripts written to {0}'.format(metadata.env.pkgdir))
+
+ if args.no_build:
+ continue
+
+ print('Generating Conda metadata...')
+ conda_metadata = conda_build.metadata.MetaData(env.pkgdir)
+
+ if not args.force_rebuild:
+ if cbc.utils.conda_search(conda_metadata) == conda_metadata.dist():
+ print('{0} matches an installed package; increment the build number to rebuild or use --force-rebuild.'.format(conda_metadata.dist()))
+ continue
+
+ conda_builder_args = [no_upload, use_local]
+ try:
+ print('Initializing Conda build...')
+ built = cbc.utils.conda_builder(metadata, conda_builder_args)
+ if not built:
+ print('Failure occurred building: {0}'.format(conda_metadata.dist()))
+ continue
+ except cbc.exceptions.CondaBuildError as cbe:
+ print(cbe)
+ continue
+
+ print('Installing Conda package...')
+ package_exists = cbc.utils.conda_search(conda_metadata)
+
+ if not package_exists:
+ cbc.utils.conda_install(conda_metadata.name())
+ elif package_exists:
+ if args.force_rebuild:
+ cbc.utils.conda_reinstall(conda_metadata.name())
+
+ print('')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/cbc/server.py b/cbc/cli/server.py
index 4126ed8..9661f4a 100644
--- a/cbc/server.py
+++ b/cbc/cli/server.py
@@ -37,17 +37,17 @@ class FileServer(object):
self.httpd.server_close()
-if __name__ == '__main__':
+def main():
parser = argparse.ArgumentParser()
parser.add_argument('-r', '--root', default=os.path.abspath(os.curdir), help='Path to files')
parser.add_argument('-p', '--port', type=int, default=8888, help='TCP port')
parser.add_argument('-s', '--single', action='store_false')
args = parser.parse_args()
-
+
fileserver = FileServer(args.port, args.root)
fileserver.run(forever=args.single)
-
-
-
-
-
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/cbc/tests/__init__.py b/cbc/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cbc/tests/__init__.py
diff --git a/cbc/tests/data/test.ini b/cbc/tests/data/test.ini
new file mode 100644
index 0000000..ec67f6e
--- /dev/null
+++ b/cbc/tests/data/test.ini
@@ -0,0 +1,47 @@
+[cbc_cgi]
+local_server: true
+local_port: 8888
+local_sources: /srv/conda/sources
+protocol: http
+url: ${cbc_cgi:protocol}://localhost:${cbc_cgi:local_port}
+
+[package]
+name: test
+version: 1.0.0
+
+[about]
+home: http://example.com/${package:name}
+license: GPL
+summary: ${package:name} is a test package
+readme: README.md
+
+[source]
+fn: ${package:name}-${package:version}.tar.gz
+url: ${cbc_cgi:url}/${fn}
+
+[build]
+number: 1
+
+[requirements]
+build:
+ python
+ setuptools
+
+run:
+ python
+
+
+[cbc_build]
+prefix: /usr/local
+win_prefix: c:\anaconda3\
+
+
+linux:
+ python setup.py install || exit 1
+
+darwin:
+ python setup.py install || exit 1
+
+windows:
+ python setup.py install
+ if errorlevel 1 exit 1 \ No newline at end of file
diff --git a/cbc/tests/test_cbc.py b/cbc/tests/test_cbc.py
new file mode 100644
index 0000000..84e4e67
--- /dev/null
+++ b/cbc/tests/test_cbc.py
@@ -0,0 +1,66 @@
+import cbc
+import nose
+import nose.tools
+import os
+import sys
+from cbc.exceptions import IncompleteEnv, MetaDataError
+
+
+class TestCBC(object):
+ def setUp(self):
+ lookup = os.path.join(os.path.dirname(__file__), 'data')
+ output = os.path.join(lookup, 'output')
+ os.makedirs(output, exist_ok=True)
+ os.environ['CBC_HOME'] = output
+ self.env = cbc.environment.Environment()
+ self.ini = os.path.join(lookup, 'test.ini')
+
+
+ def tearDown(self):
+ pass
+
+ @nose.tools.raises(OSError)
+ def test_spec_does_not_exist(self):
+ spec = cbc.meta.MetaData('deadbeefcafe.ini', self.env)
+
+ @nose.tools.raises(IncompleteEnv)
+ def test_spec_incomplete_environment(self):
+ '''test_spec_incomplete_environment (a valid ~/.cbcrc will cause this to fail)
+ '''
+ del os.environ['CBC_HOME']
+ env = cbc.environment.Environment()
+
+ @nose.tools.raises(MetaDataError)
+ def test_spec_environment_instance(self):
+ env = ''
+ cbc_meta = cbc.meta.MetaData(self.ini, env)
+
+ def test_spec_standalone_build_data(self):
+ cbc_meta = cbc.meta.MetaData(self.ini, self.env)
+ nose.tools.assert_in('cbc_build', cbc_meta.local_metadata)
+
+ def test_spec_standalone_cgi_server_data(self):
+ cbc_meta = cbc.meta.MetaData(self.ini, self.env)
+ nose.tools.assert_in('cbc_cgi', cbc_meta.local_metadata)
+
+ def test_spec_no_ini_and_yaml_crosstalk(self):
+ cbc_meta = cbc.meta.MetaData(self.ini, self.env)
+ nose.tools.assert_not_in('settings', cbc_meta.conda_metadata)
+ nose.tools.assert_not_in('cbc_build', cbc_meta.conda_metadata)
+ nose.tools.assert_not_in('cbc_cgi', cbc_meta.conda_metadata)
+
+ def test_spec_outputs_valid_conda_metadata(self):
+ import conda_build.metadata
+ cbc_meta = cbc.meta.MetaData(self.ini, self.env)
+ cbc_meta.env.mkpkgdir(cbc_meta.local['package']['name'])
+ cbc_meta.render_scripts()
+
+ # Test against conda's build system
+ conda_meta = conda_build.metadata.MetaData(self.env.pkgdir)
+ nose.tools.assert_is_instance(conda_meta, conda_build.metadata.MetaData)
+ nose.tools.assert_equal(conda_meta.dist(), 'test-1.0.0-py34_1')
+
+
+
+if __name__ == '__main__':
+ nose.main(argv=sys.argv)