diff options
Diffstat (limited to 'cbc')
| -rw-r--r-- | cbc/__init__.py | 2 | ||||
| -rw-r--r-- | cbc/cli/__init__.py | 0 | ||||
| -rwxr-xr-x | cbc/cli/build.py | 100 | ||||
| -rw-r--r-- | cbc/cli/server.py (renamed from cbc/server.py) | 14 | ||||
| -rw-r--r-- | cbc/tests/__init__.py | 0 | ||||
| -rw-r--r-- | cbc/tests/data/test.ini | 47 | ||||
| -rw-r--r-- | cbc/tests/test_cbc.py | 66 | 
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)  | 
