def lint_cmd(cli_args, stream=sys.stdout): metadata = load_metadata(cli_args.metadata) import_metadata(cli_args.modules) current, locations = get_metadata().serialize() has_errors = False display_level = lint.WARNING error_level = lint.DOCUMENTATION if cli_args.strict: display_level = lint.WARNING error_level = lint.WARNING elif cli_args.quiet: display_level = lint.DOCUMENTATION for message in lint.metadata_lint(metadata, current, locations): if message.level >= display_level: stream.write('{}\n'.format(message)) if message.level >= error_level: has_errors = True if cli_args.update: if not has_errors or cli_args.force: with open(cli_args.metadata.name, 'w') as f: json.dump(current, f, indent=2) return 1 if has_errors else 0
def version_cmd(cli_args, stream=sys.stdout): metadata = load_metadata(cli_args.metadata) json_version = metadata['$version'] import_version = None if cli_args.modules: import_metadata(cli_args.modules) import_version = get_metadata().current_version stream.write('{}: {}\n'.format(cli_args.metadata.name, json_version)) if import_version is not None: if len(cli_args.modules) == 1: name = cli_args.modules[0] else: name = 'Imported API' stream.write('{}: {}\n'.format(name, import_version)) return 0
def get_metadata(self, code='', module='service', locations=True): fixture = self.useFixture(TemporaryModuleFixture(module, code)) import_metadata([module]) metadata, locations = get_metadata().serialize() return metadata, locations, fixture.path
def test_legacy_api_still_works(self): service = """ from acceptable import * service = AcceptableService('service') root_api = service.api('/', 'root') root_api.changelog(4, "changelog") @root_api.view(introduced_at='1.0') @validate_body({'type': 'object'}) @validate_output({'type': 'object'}) @validate_params({'type': 'object', 'properties': {'test': {'type': 'string'}}}) def my_view(): "Documentation." """ fixture = self.useFixture(TemporaryModuleFixture('service', service)) main.import_metadata(['service']) import service as svc_mod metadata, locations = get_metadata().serialize() self.assertEqual( { '$version': 4, 'default': { 'title': 'Default', 'apis': { 'root': { 'service': 'service', 'api_group': 'default', 'api_name': 'root', 'methods': ['GET'], 'url': '/', 'doc': "Documentation.", 'changelog': { 4: 'changelog', }, 'request_schema': { 'type': 'object' }, 'response_schema': { 'type': 'object' }, 'params_schema': { 'type': 'object', 'properties': { 'test': { 'type': 'string' } } }, 'introduced_at': 1, 'title': 'Root', } } } }, metadata, ) self.assertEqual( { 'root': { 'api': { 'filename': fixture.path, 'lineno': 4, 'module': svc_mod, }, 'changelog': { 4: { 'filename': fixture.path, 'lineno': 5, 'module': svc_mod, } }, 'request_schema': { 'filename': fixture.path, 'lineno': 8, 'module': svc_mod, }, 'response_schema': { 'filename': fixture.path, 'lineno': 9, 'module': svc_mod, }, 'params_schema': { 'filename': fixture.path, 'lineno': 10, 'module': svc_mod, }, 'view': { 'filename': fixture.path, 'lineno': 11, 'module': svc_mod, }, } }, locations, )
def test_importing_api_metadata_works(self): service = """ from acceptable import AcceptableService service = AcceptableService('myservice', 'group') root_api = service.api('/', 'root', introduced_at=1) root_api.request_schema = {'type': 'object'} root_api.response_schema = {'type': 'object'} root_api.params_schema = {'type': 'object'} root_api.changelog(4, "changelog") @root_api def my_view(): "Documentation." """ fixture = self.useFixture(TemporaryModuleFixture('service', service)) main.import_metadata(['service']) import service as svc_mod metadata, locations = get_metadata().serialize() self.assertEqual( { '$version': 4, 'group': { 'title': 'Group', 'apis': { 'root': { 'service': 'myservice', 'api_group': 'group', 'api_name': 'root', 'methods': ['GET'], 'url': '/', 'doc': "Documentation.", 'changelog': { 4: 'changelog', }, 'request_schema': { 'type': 'object' }, 'response_schema': { 'type': 'object' }, 'params_schema': { 'type': 'object' }, 'introduced_at': 1, 'title': 'Root', } } } }, metadata, ) self.assertEqual( { 'root': { 'api': { 'filename': fixture.path, 'lineno': 4, 'module': svc_mod, }, 'changelog': { 4: { 'filename': fixture.path, 'lineno': 8, 'module': svc_mod, }, }, 'request_schema': { 'filename': fixture.path, 'lineno': 5, 'module': svc_mod, }, 'response_schema': { 'filename': fixture.path, 'lineno': 6, 'module': svc_mod, }, 'params_schema': { 'filename': fixture.path, 'lineno': 7, 'module': svc_mod }, 'view': { 'filename': fixture.path, 'lineno': 11, 'module': svc_mod, }, } }, locations, )
def handle(self, *args, **options): get_urlmap() # this imports all urls and initialises the url mappings func = options['func'] current, _ = get_metadata().serialize() func(options, current)
def metadata_cmd(cli_args): import_metadata(cli_args.modules, cli_args.dummy_dependencies) current, _ = get_metadata().serialize() cli_args.output.write(json.dumps(current, indent=2))
def test_legacy_api_still_works(self): service = """ from acceptable import * service = AcceptableService('service') root_api = service.api('/', 'root') root_api.changelog(4, "changelog") @root_api.view(introduced_at='1.0') @validate_body({'type': 'object'}) @validate_output({'type': 'object'}) def my_view(): "Documentation." """ fixture = self.useFixture(TemporaryModuleFixture('service', service)) main.import_metadata(['service']) metadata, locations = main.parse(get_metadata()) self.assertEqual( { '$version': 4, 'root': { 'service': 'service', 'api_group': None, 'api_name': 'root', 'methods': ['GET'], 'url': '/', 'doc': "Documentation.", 'changelog': { 4: 'changelog', }, 'request_schema': { 'type': 'object' }, 'response_schema': { 'type': 'object' }, 'introduced_at': 1, } }, metadata, ) self.assertEqual( { 'root': { 'api': { 'filename': fixture.path, 'lineno': 4 }, 'changelog': { 4: { 'filename': fixture.path, 'lineno': 5 }, }, 'request_schema': { 'filename': fixture.path, 'lineno': 8, }, 'response_schema': { 'filename': fixture.path, 'lineno': 9, }, 'view': { 'filename': fixture.path, 'lineno': 10, }, } }, locations, )
def metadata_cmd(cli_args): import_metadata(cli_args.modules) current, _ = parse(get_metadata()) print(json.dumps(current, indent=2, sort_keys=True))