def _calculate_extension_dir_hash(self): """Creates a unique hash # to represent state of directory.""" # search does not include png files: # if png files are added the parent folder mtime gets affected # cache only saves the png address and not the contents so they'll # get loaded everytime # see http://stackoverflow.com/a/5141710/2350244 pat = '(\\' + exts.TAB_POSTFIX + ')|(\\' + exts.PANEL_POSTFIX + ')' pat += '|(\\' + exts.PULLDOWN_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.SPLIT_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.SPLITPUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.STACK_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.PUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.SMART_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.LINK_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.PANEL_PUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.PANEL_PUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + exts.CONTENT_BUTTON_POSTFIX + ')' # tnteresting directories pat += '|(\\' + exts.COMP_LIBRARY_DIR_NAME + ')' pat += '|(\\' + exts.COMP_HOOKS_DIR_NAME + ')' # search for scripts, setting files (future support), and layout files patfile = '(\\' + exts.PYTHON_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.CSHARP_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.VB_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.RUBY_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.DYNAMO_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.GRASSHOPPER_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.GRASSHOPPERX_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + exts.CONTENT_FILE_FORMAT + ')' patfile += '|(\\' + exts.YAML_FILE_FORMAT + ')' patfile += '|(\\' + exts.JSON_FILE_FORMAT + ')' return coreutils.calculate_dir_hash(self.directory, pat, patfile)
def _is_record_info_current(source_path): # calculates a hash from the log files in the directory and compares it # with the _current_path_hash (to determine if the current _records list is up-to-date) dir_hash = calculate_dir_hash(source_path, '', FILE_LOG_EXT) if dir_hash == _current_path_hash: return True return False
def _calculate_extension_dir_hash(self): """Creates a unique hash # to represent state of directory.""" # search does not include png files: # if png files are added the parent folder mtime gets affected # cache only saves the png address and not the contents so they'll get loaded everytime # see http://stackoverflow.com/a/5141710/2350244 pat = '(\\' + TAB_POSTFIX + ')|(\\' + PANEL_POSTFIX + ')' pat += '|(\\' + PULLDOWN_BUTTON_POSTFIX + ')' pat += '|(\\' + SPLIT_BUTTON_POSTFIX + ')' pat += '|(\\' + SPLITPUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + STACKTWO_BUTTON_POSTFIX + ')' pat += '|(\\' + STACKTHREE_BUTTON_POSTFIX + ')' pat += '|(\\' + PUSH_BUTTON_POSTFIX + ')' pat += '|(\\' + SMART_BUTTON_POSTFIX + ')' pat += '|(\\' + TOGGLE_BUTTON_POSTFIX + ')' pat += '|(\\' + LINK_BUTTON_POSTFIX + ')' # seach for scripts, setting files (future support), and layout files patfile = '(\\' + PYTHON_SCRIPT_FILE_FORMAT + ')' patfile += '|(\\' + CSHARP_SCRIPT_FILE_FORMAT + ')' patfile += '|(' + DEFAULT_LAYOUT_FILE_NAME + ')' return calculate_dir_hash(self.directory, pat, patfile)
# template python command class CMD_EXECUTOR_TYPE_NAME = '{}.{}'.format(LOADER_BASE_NAMESPACE, 'PyRevitCommand') # template python command availability class CMD_AVAIL_TYPE_NAME = make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandDefaultAvail') CMD_AVAIL_TYPE_NAME_CATEGORY = make_canonical_name( LOADER_BASE_NAMESPACE, 'PyRevitCommandCategoryAvail') CMD_AVAIL_TYPE_NAME_SELECTION = make_canonical_name( LOADER_BASE_NAMESPACE, 'PyRevitCommandSelectionAvail') source_file_filter = '(\.cs)' if not EXEC_PARAMS.doc_mode: BASE_TYPES_DIR_HASH = calculate_dir_hash( INTERFACE_TYPES_DIR, '', source_file_filter)[:HASH_CUTOFF_LENGTH] BASE_TYPES_ASM_FILE_ID = '{}_{}'.format(BASE_TYPES_DIR_HASH, LOADER_BASE_NAMESPACE) BASE_TYPES_ASM_FILE = appdata.get_data_file(BASE_TYPES_ASM_FILE_ID, ASSEMBLY_FILE_TYPE) # taking the name of the generated data file and use it as assembly name BASE_TYPES_ASM_NAME = op.splitext(op.basename(BASE_TYPES_ASM_FILE))[0] logger.debug( 'Interface types assembly file is: {}'.format(BASE_TYPES_ASM_NAME)) else: BASE_TYPES_DIR_HASH = BASE_TYPES_ASM_FILE_ID = None BASE_TYPES_ASM_FILE = BASE_TYPES_ASM_NAME = None def _get_asm_attr_source(): asm_att_source = """
make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandExtendedAvail') CMD_AVAIL_TYPE_NAME_SELECTION = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandSelectionAvail') # template dynamobim command class DYNOCMD_EXECUTOR_TYPE_NAME = '{}.{}'\ .format(LOADER_BASE_NAMESPACE, 'PyRevitCommandDynamoBIM') SOURCE_FILE_EXT = '.cs' SOURCE_FILE_FILTER = r'(\.cs)' if not EXEC_PARAMS.doc_mode: BASE_TYPES_DIR_HASH = \ get_str_hash( calculate_dir_hash(INTERFACE_TYPES_DIR, '', SOURCE_FILE_FILTER) + EXEC_PARAMS.engine_ver )[:HASH_CUTOFF_LENGTH] BASE_TYPES_ASM_FILE_ID = '{}_{}'\ .format(BASE_TYPES_DIR_HASH, LOADER_BASE_NAMESPACE) BASE_TYPES_ASM_FILE = appdata.get_data_file(BASE_TYPES_ASM_FILE_ID, ASSEMBLY_FILE_TYPE) # taking the name of the generated data file and use it as assembly name BASE_TYPES_ASM_NAME = op.splitext(op.basename(BASE_TYPES_ASM_FILE))[0] mlogger.debug('Interface types assembly file is: %s', BASE_TYPES_ASM_NAME) else: BASE_TYPES_DIR_HASH = BASE_TYPES_ASM_FILE_ID = None BASE_TYPES_ASM_FILE = BASE_TYPES_ASM_NAME = None def _get_source_files_in(source_files_path):
# template python command availability class CMD_AVAIL_TYPE_NAME = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandDefaultAvail') CMD_AVAIL_TYPE_NAME_CATEGORY = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandCategoryAvail') CMD_AVAIL_TYPE_NAME_SELECTION = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandSelectionAvail') source_file_filter = '(\.cs)' if not EXEC_PARAMS.doc_mode: BASE_TYPES_DIR_HASH = \ get_str_hash( calculate_dir_hash(INTERFACE_TYPES_DIR, '', source_file_filter) + EXEC_PARAMS.engine_ver )[:HASH_CUTOFF_LENGTH] BASE_TYPES_ASM_FILE_ID = '{}_{}'\ .format(BASE_TYPES_DIR_HASH, LOADER_BASE_NAMESPACE) BASE_TYPES_ASM_FILE = appdata.get_data_file(BASE_TYPES_ASM_FILE_ID, ASSEMBLY_FILE_TYPE) # taking the name of the generated data file and use it as assembly name BASE_TYPES_ASM_NAME = op.splitext(op.basename(BASE_TYPES_ASM_FILE))[0] logger.debug( 'Interface types assembly file is: {}'.format(BASE_TYPES_ASM_NAME)) else: BASE_TYPES_DIR_HASH = BASE_TYPES_ASM_FILE_ID = None BASE_TYPES_ASM_FILE = BASE_TYPES_ASM_NAME = None