def test_format_json(): # Arrange # Data from pycodestyle in 2017-10 # pypinfo -sd 2017-10-01 -ed 2017-10-31 -pc -l 100 --json pycodestyle pyversion rows = [ ['python_version', 'percent', 'download_count'], ['2.7', '0.54', '587705'], ['3.6', '0.21', '227800'], ['3.5', '0.16', '169851'], ['3.4', '0.078', '84599'], ['3.3', '0.0091', '9953'], ['3.7', '0.0044', '4770'], ['2.6', '0.0041', '4476'], ['3.2', '0.0003', '326'], ['2.8', '3.7e-06', '4'], ['None', '2.8e-06', '3'], ] query_info = { 'cached': False, 'bytes_processed': 18087095002, 'bytes_billed': 18087936000, 'estimated_cost': '0.09', } indent = None expected = ( '{"last_update":"2020-07-14 07:11:49",' '"query":' '{"bytes_billed":18087936000,' '"bytes_processed":18087095002,' '"cached":false,' '"estimated_cost":"0.09"},' '"rows":[' '{"download_count":587705,"percent":"0.54","python_version":"2.7"},' '{"download_count":227800,"percent":"0.21","python_version":"3.6"},' '{"download_count":169851,"percent":"0.16","python_version":"3.5"},' '{"download_count":84599,"percent":"0.078","python_version":"3.4"},' '{"download_count":9953,"percent":"0.0091","python_version":"3.3"},' '{"download_count":4770,"percent":"0.0044","python_version":"3.7"},' '{"download_count":4476,"percent":"0.0041","python_version":"2.6"},' '{"download_count":326,"percent":"0.0003","python_version":"3.2"},' '{"download_count":4,"percent":"3.7e-06","python_version":"2.8"},' '{"download_count":3,"percent":"2.8e-06","python_version":"None"}]}' ) # Act output = core.format_json(rows, query_info, indent) # Assert assert output == expected
def pypinfo(ctx, project, fields, auth, run, json, timeout, limit, days, start_date, end_date, where, order): """Valid fields are:\n project | version | pyversion | percent3 | percent2 | impl | impl-version |\n openssl | date | month | year | country | installer | installer-version |\n setuptools-version | system | system-release | distro | distro-version | cpu """ if auth: set_credentials(auth) click.echo('Credentials location set to "{}".'.format( get_credentials())) return if project is None and not fields: click.echo(ctx.get_help()) return parsed_fields = [] for field in fields: parsed = FIELD_MAP.get(field) if parsed is None: raise ValueError('"{}" is an unsupported field.'.format(field)) parsed_fields.append(parsed) built_query = build_query(project, parsed_fields, limit=limit, days=days, start_date=start_date, end_date=end_date, where=where, order=order) if run: client = create_client(get_credentials()) query = client.run_sync_query(built_query) query.timeout_ms = timeout query.run() rows = parse_query_result(query) if not json: click.echo(tabulate(rows)) else: click.echo(format_json(rows)) else: click.echo(built_query)
def pypinfo( ctx, project, fields, auth, run, json, indent, timeout, limit, days, start_date, end_date, month, where, order, all_installers, percent, markdown, verbose, ): """Valid fields are:\n project | version | file | pyversion | percent3 | percent2 | impl | impl-version |\n openssl | date | month | year | country | installer | installer-version |\n setuptools-version | system | system-release | distro | distro-version | cpu """ if auth: set_credentials(auth) click.echo('Credentials location set to "{}".'.format(get_credentials())) return if verbose: click.echo('Credentials location set to "{}".'.format(get_credentials()), err=True) if project is None and not fields: click.echo(ctx.get_help()) return parsed_fields = [] for field in fields: parsed = FIELD_MAP.get(field) if parsed is None: raise ValueError('"{}" is an unsupported field.'.format(field)) parsed_fields.append(parsed) order_name = order order = FIELD_MAP.get(order) if order: order_name = order.name parsed_fields.insert(0, order) if month: start_date, end_date = month_ends(month) built_query = build_query( project, parsed_fields, limit=limit, days=days, start_date=start_date, end_date=end_date, where=where, order=order_name, pip=not all_installers, ) if run: client = create_client(get_credentials()) query_job = client.query(built_query, job_config=create_config()) query_rows = query_job.result(timeout=timeout // 1000) # Cached from_cache = not not query_job.cache_hit # Processed bytes_processed = query_job.total_bytes_processed or 0 processed_amount, processed_unit = convert_units(bytes_processed) # Billed bytes_billed = query_job.total_bytes_billed or 0 billed_amount, billed_unit = convert_units(bytes_billed) # Cost billing_tier = query_job.billing_tier or 1 estimated_cost = Decimal(TIER_COST * billing_tier) / TB * Decimal(bytes_billed) estimated_cost = str(estimated_cost.quantize(TO_CENTS, rounding=ROUND_UP)) rows = parse_query_result(query_job, query_rows) if len(rows) == 1 and not json: # Only headers returned click.echo("No data returned, check project name") return if percent: rows = add_percentages(rows, include_sign=not json) # Only for tables, and if more than the header row + a single data row if len(rows) > 2 and not json: rows = add_download_total(rows) if not json: click.echo('Served from cache: {}'.format(from_cache)) click.echo('Data processed: {:.2f} {}'.format(processed_amount, processed_unit)) click.echo('Data billed: {:.2f} {}'.format(billed_amount, billed_unit)) click.echo('Estimated cost: ${}'.format(estimated_cost)) click.echo() click.echo(tabulate(rows, markdown)) else: query_info = { 'cached': from_cache, 'bytes_processed': bytes_processed, 'bytes_billed': bytes_billed, 'estimated_cost': estimated_cost, } click.echo(format_json(rows, query_info, indent)) else: click.echo(built_query)