diff --git a/pkgwat/api.py b/pkgwat/api.py index 6d30454..30ed6fb 100644 --- a/pkgwat/api.py +++ b/pkgwat/api.py @@ -3,8 +3,25 @@ import json import requests +import pkgwat import pkgwat.utils +import requests.defaults +requests.defaults.defaults['base_headers']['User-Agent'] = \ + 'pkgwat/' + pkgwat.__version__ + + +# TODO -- Tie this into cliff's verbosity options +DEBUG_REQUESTS = False +if DEBUG_REQUESTS: + import sys + + class myobj(object): + def write(self, message): + print "DEBUG:", message + + requests.defaults.defaults['verbose'] = myobj() + BASE_URL = "https://apps.fedoraproject.org/packages/fcomm_connector" @@ -34,6 +51,21 @@ "obsolete", ] +yum_releases = [ + 'Rawhide', + 'Fedora 16', + 'Fedora 16 Testing', + 'Fedora 15', + 'Fedora 15 Testing', + 'Fedora 14', + 'Fedora 14 Testing', +] + +yum_arches = [ + 'x86_64', + 'i686', +] + def _make_request(path, query, strip_tags): query_as_json = json.dumps(query) @@ -118,4 +150,33 @@ def updates(package, release="all", status="all", rows_per_page=10, return _make_request(path, query, strip_tags) -# TODO -- write the bugs query + +def bugs(package, rows_per_page=10, start_row=0, strip_tags=True): + raise NotImplementedError + + +def contents(package, arch="x86_64", release="Rawhide", strip_tags=True): + # This one behaves a little differently + + if release not in yum_releases: + raise ValueError("Invalid yum release. %r %r" % ( + release, yum_releases)) + + if arch not in yum_arches: + raise ValueError("Invalid yum arch. %r %r" % ( + arch, yum_arches)) + + path = "yum/get_file_tree" + query = { + "package": package, + "arch": arch, + "repo": release, + } + url = "/".join([BASE_URL, path]) + response = requests.get(url, params=query) + d = json.loads(response.text) + + if strip_tags: + d = pkgwat.utils.strip_tags(d) + + return d diff --git a/pkgwat/subcommands.py b/pkgwat/subcommands.py index 40d17c2..692b123 100644 --- a/pkgwat/subcommands.py +++ b/pkgwat/subcommands.py @@ -1,4 +1,5 @@ import logging +import sys import pkgwat.api @@ -189,3 +190,40 @@ def take_action(self, args): raise NotImplementedError( "We need to fix a bug in the upstream webapp first. Coming soon!" ) + + +class Contents(cliff.command.Command): + """ Show contents of a package """ + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(type(self), self).get_parser(prog_name) + parser.add_argument('package') + parser.add_argument('--arch', dest='arch', default='x86_64', + help="One of %s" % ( + ', '.join(pkgwat.api.yum_arches))) + parser.add_argument('--release', dest='release', default='Rawhide', + help="One of %s" % ( + ', '.join(pkgwat.api.yum_releases))) + return parser + + def take_action(self, args): + result = pkgwat.api.contents( + args.package, + arch=args.arch, + release=args.release, + ) + self._recursive_print(result) + sys.exit(0) + + def _recursive_print(self, d, prefix='/'): + if type(d) == list: + [self._recursive_print(element) for element in d] + + if type(d) == dict: + filename = prefix + d['data']['title'] + if 'children' not in d: + sys.stdout.write(filename + "\n") + for child in d.get('children', []): + self._recursive_print(child, prefix=filename + '/') diff --git a/setup.py b/setup.py index 525a1b8..30d4f8f 100755 --- a/setup.py +++ b/setup.py @@ -86,6 +86,7 @@ 'builds = pkgwat.subcommands:Builds', 'updates = pkgwat.subcommands:Updates', 'bugs = pkgwat.subcommands:Bugs', + 'contents = pkgwat.subcommands:Contents', ], }, )