def zip_sources(zip_path): if not os.path.exists(zip_path): os.makedirs(zip_path) zip_filename = os.path.normpath( os.path.sep.join([zip_path, "skeletons.zip"])) try: zip = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) except: zip = zipfile.ZipFile(zip_filename, 'w') try: try: while True: line = sys.stdin.readline() if not line: # TextIOWrapper.readline returns an empty string if EOF is hit immediately. break line = line.strip() if line == '-': break if line: # This line will break the split: # /.../dist-packages/setuptools/script template (dev).py setuptools/script template (dev).py split_items = line.split() if len(split_items) > 2: # Currently it doesn't work for remote files like # /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/setuptools/script (dev).tmpl # TODO handle paths containing whitespaces more robustly match_two_files = re.match(r'^(.+\.py)\s+(.+\.py)$', line) if not match_two_files: report("Error(zip_sources): invalid line '%s'" % line) continue split_items = match_two_files.group(1, 2) (path, arcpath) = split_items # An attempt to recursively pack an archive leads to unlimited explosion of its size if os.path.samefile(path, zip_filename): continue zip.write(path, arcpath) say('OK: ' + zip_filename) sys.stdout.flush() except: import traceback traceback.print_exc() say('Error creating archive.') sys.exit(1) finally: zip.close()
def list_sources(paths): # noinspection PyBroadException try: for path in paths: path = os.path.normpath(path) if path.endswith('.egg') and os.path.isfile(path): say("%s\t%s\t%d", path, path, os.path.getsize(path)) for root, files in walk_python_path(path): for name in files: file_path = os.path.join(root, name) if is_source_file(file_path): say("%s\t%s\t%d", os.path.normpath(file_path), path, os.path.getsize(file_path)) say('END') sys.stdout.flush() except: import traceback traceback.print_exc() sys.exit(1)
def main(): import generator3.core import generator3.extra from generator3.clr_tools import get_namespace_by_name from generator3.constants import Timer from generator3.core import version, GenerationStatus, SkeletonGenerator from generator3.util_methods import set_verbose, say, note, print_profile args = parse_args(version()) generator3.core.quiet = args.quiet set_verbose(args.verbose) if args.roots: for p in args.roots: if p and p not in sys.path: sys.path.append( p ) # we need this to make things in additional dirs importable note("Altered sys.path: %r", sys.path) if args.state_file_policy == 'readwrite': # We can't completely shut off stdin in case Docker-based interpreter to use json.load() # and have to retreat to reading the content line-wise state_json = json.loads(sys.stdin.readline(), encoding='utf-8') else: state_json = None target_roots = _cleanup_sys_path() if args.list_sources_mode: say(version()) generator3.extra.list_sources(target_roots) sys.exit(0) if args.zip_sources_archive: generator3.extra.zip_sources(args.zip_sources_archive) sys.exit(0) if args.zip_roots_archive: generator3.extra.zip_stdlib(target_roots, args.zip_roots_archive) sys.exit(0) generator = SkeletonGenerator(output_dir=args.output_dir, roots=target_roots, state_json=state_json, write_state_json=args.state_file_policy is not None) timer = Timer() if not args.mod_name: generator.discover_and_process_all_modules( name_pattern=args.name_pattern, builtins_only=args.builtins_only) sys.exit(0) if sys.platform == 'cli': # noinspection PyUnresolvedReferences import clr for ref in args.clr_assemblies: clr.AddReferenceByPartialName(ref) if args.run_clr_profiler: atexit.register(print_profile) # We take module name from import statement args.mod_name = get_namespace_by_name(args.mod_name) if generator.process_module(args.mod_name, args.mod_path) == GenerationStatus.FAILED: sys.exit(1) say("Generation completed in %d ms", timer.elapsed())