# fw-meta - import meta templates/patterns ```python # easiest to experiment w/ extraction behavior in fw-meta: # > pip install fw-meta ipython && ipython from fw_meta import extract_meta # the input data can be a simple dict - for now we are limited to the path field data = {"path": "2023-04-05/projectlbl=emory_6_retrospective-form/naccid=NACC001504/visitlbl=FORMS-VISIT-10_UDSv3/my-filename-i-don't-care-about.json"} # let's start simple and build up to full solutions in steps # 1. just grab the things from the projectlbl=... directory # - use the default glob style (* and . have a different meanings in regex!) # - capture groups don't allow '/' chars by default to not cross dir boundaries # - note the double star '**' at the end - it's glob for "anything, even /" # - note that the uploader doesn't support setting project level fields! extract_meta(data, mappings=[ ("path", "*/projectlbl={grp}_{prj.info.ADCID}_{prj}/**"), ]) # 2/a it's straightforward to add the next 2 levels # - note single star ending glob - only matches if the file is at that level! extract_meta(data, mappings=[ ("path", "*/projectlbl={grp}_{prj.info.ADCID}_{prj}/naccid={sub}/visitlbl={ses}_{acq}/*"), ]) # 2/b note that the mappings is list[tuple] - we could split the extractions # - note that the left hand side (LHS) doesn't need to be a single data field # - it's a template for building a string to then extract from via a pattern # - docs: https://gitlab.com/flywheel-io/tools/lib/fw-utils/-/blob/main/fw_utils/formatters.py#L123 extract_meta(data, mappings=[ ("path", "*/projectlbl={grp}_*_{prj}/**"), ("{path}", "**/naccid={sub}/**"), ("{path} foo", "**/visitlbl={ses}_{acq}/**"), ]) # 3/a you can use previously extracted !meta fields on the LHS extract_meta(data, mappings=[ ("path", "*/projectlbl={grp}_*_{prj}/naccid={sub}/visitlbl={ses}_{acq}/*"), ("{!sub}-{!ses}-{!acq}.json", "file"), ]) # 3/b or you could use a re.sub pattern on the LHS, but escaping for paths is hard # - we should adjust the available templating options to be more CLI-friendly (/, $, ...) # - need customer / SSE feedback on needs - bash param expansions could give ideas: # https://wiki.bash-hackers.org/syntax/pe extract_meta(data, mappings=[ ("path", "*/projectlbl={grp}_*_{prj}/naccid={sub}/visitlbl={ses}_{acq}/*"), (r"{path/.*naccid=(.*?)\/visitlbl=(.*?)_(.*?)\/.*/\1-\2-\3}.json", "file"), ]) ```