+import arvados_version
+version = arvados_version.get_version(SETUP_DIR, "arvados")
+
+short_tests_only = False
+if '--short-tests-only' in sys.argv:
+ short_tests_only = True
+ sys.argv.remove('--short-tests-only')
+
+class BuildPython(build_py.build_py):
+ """Extend setuptools `build_py` to generate API documentation
+
+ This class implements a setuptools subcommand, so it follows
+ [the SubCommand protocol][1]. Most of these methods are required by that
+ protocol, except `should_run`, which we register as the subcommand
+ predicate.
+
+ [1]: https://setuptools.pypa.io/en/latest/userguide/extension.html#setuptools.command.build.SubCommand
+ """
+ # This is implemented as functionality on top of `build_py`, rather than a
+ # dedicated subcommand, because that's the only way I can find to run this
+ # code during both `build` and `install`. setuptools' `install` command
+ # normally calls specific `build` subcommands directly, rather than calling
+ # the entire command, so it skips custom subcommands.
+ user_options = build_py.build_py.user_options + [
+ ('discovery-json=', 'J', 'JSON discovery document used to build pydoc'),
+ ('discovery-output=', 'O', 'relative path to write discovery document pydoc'),
+ ]
+
+ def initialize_options(self):
+ super().initialize_options()
+ self.discovery_json = 'arvados-v1-discovery.json'
+ self.discovery_output = str(Path('arvados', 'api_resources.py'))
+
+ def _relative_path(self, src, optname):
+ retval = Path(src)
+ if retval.is_absolute():
+ raise Exception(f"--{optname} should be a relative path")
+ else:
+ return retval
+
+ def finalize_options(self):
+ super().finalize_options()
+ self.json_path = self._relative_path(self.discovery_json, 'discovery-json')
+ self.out_path = Path(
+ self.build_lib,
+ self._relative_path(self.discovery_output, 'discovery-output'),
+ )
+
+ def run(self):
+ super().run()
+ import discovery2pydoc
+ arglist = ['--output-file', str(self.out_path), str(self.json_path)]
+ returncode = discovery2pydoc.main(arglist)
+ if returncode != 0:
+ raise Exception(f"discovery2pydoc exited {returncode}")
+
+ def get_outputs(self):
+ retval = super().get_outputs()
+ retval.append(str(self.out_path))
+ return retval
+
+ def get_source_files(self):
+ retval = super().get_source_files()
+ retval.append(str(self.json_path))
+ return retval
+
+ def get_output_mapping(self):
+ retval = super().get_output_mapping()
+ retval[str(self.json_path)] = str(self.out_path)
+ return retval
+