AdvancedAnalysisFileParser 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,9 +3,7 @@ import argparse
3
3
  import json
4
4
  import logging
5
5
  import os
6
- import re
7
6
  from typing import Optional
8
- from pathlib import Path
9
7
  from .Models import *
10
8
  from .Warnings import *
11
9
  from .Parsers import *
@@ -13,17 +11,58 @@ from .AdvancedAnalysisConstants import AdvancedAnalysisConstants
13
11
 
14
12
  class AdvancedAnalysisParser:
15
13
  """
16
- Parse special callers outputs into unified JSON format.
17
- The input files are specified in a configuration JSON file.
18
- The output is a JSON file with the parsed data and warnings.
14
+ AdvancedAnalysisParser
15
+
16
+ Parses special callers outputs (TSV/JSON) into a unified JSON format.
17
+
18
+ Usage:
19
+ - Instantiate with a config dict (JsonDict) specifying input/output files and directories.
20
+ - Call run() to parse and write output JSON.
21
+ - Use from_cli() for command-line usage.
22
+
23
+ Parameters for constructor (json_request: JsonDict):
24
+ - input_files: List[str] (optional) - List of input file paths to parse.
25
+ - input_dir: str (optional) - Directory containing input files.
26
+ - output_dir: str (optional) - Directory to write output JSON.
27
+ - output_json: str (optional) - Output JSON filename.
28
+ - MAP_FILES: dict (optional) - Mapping for file-specific configs.
29
+
30
+ Returns:
31
+ - run(return_dict=True): Returns parsed result as JsonDict.
32
+ - run(return_dict=False): Writes output JSON file, returns None.
33
+
34
+ Example:
35
+ config = {
36
+ "input_files": ["file1.json", "file2.tsv"],
37
+ "input_dir": "./inputs",
38
+ "output_dir": "./outputs",
39
+ "output_json": "result.json"
40
+ }
41
+ parser = AdvancedAnalysisParser(config)
42
+ parser.run()
19
43
  """
20
44
  def __init__(self, json_request: JsonDict) -> None:
45
+ """
46
+ Initialize parser with configuration.
47
+
48
+ Args:
49
+ json_request (JsonDict): Configuration dict. See class docstring for keys.
50
+ """
21
51
  self.output_dir: str = json_request.get(AdvancedAnalysisConstants.OUTPUT_DIR, '.')
22
52
  self.output_json: str = json_request.get(AdvancedAnalysisConstants.OUTPUT_JSON, 'adv_analysis_output.json')
23
53
  self.input_dir: str = json_request.get(AdvancedAnalysisConstants.INPUT_DIR, '.')
24
54
  self.input_files: list[str] = json_request.get('input_files', [])
25
55
 
26
56
  def run(self, return_dict: bool = False) -> Optional[JsonDict]:
57
+ """
58
+ Parse files and output unified JSON.
59
+
60
+ Args:
61
+ return_dict (bool): If True, returns parsed result as dict. If False, writes output file.
62
+
63
+ Returns:
64
+ JsonDict if return_dict is True, else None.
65
+ """
27
66
  result = self.parse_files()
28
67
  if return_dict:
29
68
  return result
@@ -34,6 +73,14 @@ class AdvancedAnalysisParser:
34
73
  return None
35
74
 
36
75
  def parse_files(self) -> JsonDict:
76
+ """
77
+ Parse all input files specified in config.
78
+
79
+ Returns:
80
+ JsonDict: Unified parsed result from all files.
81
+ Raises:
82
+ ValueError: If no input files found.
83
+ """
37
84
  logging.info("Started parsing Advanced Analysis files")
38
85
  if not self.input_files or self.input_files == [] and self.input_dir and os.path.exists(self.input_dir):
39
86
  folder_files = [
@@ -59,11 +106,33 @@ class AdvancedAnalysisParser:
59
106
  return result
60
107
 
61
108
  def parse_by_config(self,parser : IAdvancedAnalysisFileParser) -> JsonDict:
109
+ """
110
+ Parse a single file using its parser and build result.
111
+
112
+ Args:
113
+ parser (IAdvancedAnalysisFileParser): Parser instance for the file.
114
+
115
+ Returns:
116
+ JsonDict: Parsed and formatted result for the file.
117
+ """
62
118
  caller_data: JsonDict = parser.parse()
63
119
  return parser.build_result(caller_data)
64
120
 
65
121
  @staticmethod
66
122
  def _threshold_warning(w: JsonDict, parsed: JsonDict, value_key: str, threshold_key: str, label: str) -> str:
123
+ """
124
+ Helper to generate threshold warning string if value exceeds threshold.
125
+
126
+ Args:
127
+ w (JsonDict): Warning config dict.
128
+ parsed (JsonDict): Parsed data dict.
129
+ value_key (str): Key for value to check.
130
+ threshold_key (str): Key for threshold value.
131
+ label (str): Label for warning.
132
+
133
+ Returns:
134
+ str: Warning message or empty string.
135
+ """
67
136
  name = w.get("caller_name")
68
137
  key = w.get(value_key)
69
138
  threshold = w.get(threshold_key)
@@ -74,6 +143,12 @@ class AdvancedAnalysisParser:
74
143
 
75
144
  @staticmethod
76
145
  def parse_args() -> argparse.Namespace:
146
+ """
147
+ Parse command-line arguments for CLI usage.
148
+
149
+ Returns:
150
+ argparse.Namespace: Parsed CLI arguments.
151
+ """
77
152
  parser = argparse.ArgumentParser(
78
153
  description="Parse special callers outputs into unified JSON"
79
154
  )
@@ -86,6 +161,10 @@ class AdvancedAnalysisParser:
86
161
 
87
162
  @classmethod
88
163
  def from_cli(cls) -> None:
164
+ """
165
+ Entry point for command-line usage.
166
+ Loads config from file and/or CLI args, runs parser.
167
+ """
89
168
  args = cls.parse_args()
90
169
  config = {}
91
170
  # Load config file if provided
@@ -3,15 +3,39 @@ from .ConditionOperator import ConditionOperator
3
3
 
4
4
  class FieldCondition:
5
5
  def __init__(self, operator: ConditionOperator, value: Any, message: str, field: Optional[str] = None):
6
+ """
7
+ Create a condition to check a field value against a target value using an operator.
8
+
9
+ Args:
10
+ operator (ConditionOperator): The comparison operator (e.g., EQ, GT, CONTAINS).
11
+ value (Any): The value to compare against.
12
+ message (str): Message to return if the condition is met.
13
+ field (Optional[str]): Name of the field to check (optional, for context).
14
+ """
6
15
  self.operator = operator
7
16
  self.value = value
8
17
  self.message = message
9
18
 
10
19
  def check(self, value: Any) -> bool:
20
+ """
21
+ Check if the provided value satisfies the condition.
22
+
23
+ Args:
24
+ value (Any): The value to check.
25
+
26
+ Returns:
27
+ bool: True if the condition is met, False otherwise.
28
+ """
11
29
  func = OPERATOR_FUNCS[self.operator]
12
30
  return func(value, self.value)
13
31
 
14
32
  def __str__(self) -> str:
33
+ """
34
+ Return the message associated with this condition.
35
+
36
+ Returns:
37
+ str: The message string.
38
+ """
15
39
  return self.message
16
40
 
17
41
  # map each operator to a function that compares (field_value, target_value) → bool
@@ -5,13 +5,24 @@ from typing import Any
5
5
 
6
6
  from ..Warnings import IWarning
7
7
 
8
- from AdvancedAnalysis.AdvancedAnalysisFileParser.AdvancedAnalysisConstants import AdvancedAnalysisConstants
9
- from AdvancedAnalysis.AdvancedAnalysisFileParser.Warnings.WarningFactory import WarningFactory
8
+ from AdvancedAnalysisFileParser.AdvancedAnalysisConstants import AdvancedAnalysisConstants
9
+ from AdvancedAnalysisFileParser.Warnings.WarningFactory import WarningFactory
10
10
  from ..Models import JsonDict
11
11
  class IAdvancedAnalysisFileParser(ABC):
12
12
  section_config : JsonDict
13
13
  file_config : JsonDict
14
14
  def __init__(self,section_config: JsonDict, file_path: str) -> None:
15
+ """
16
+ Initialize a file parser for advanced analysis.
17
+
18
+ Args:
19
+ section_config (JsonDict): Section configuration for parsing.
20
+ file_path (str): Path to the file to parse (must be .json or .tsv).
21
+
22
+ Raises:
23
+ ValueError: If file_path is empty or not a string.
24
+ FileNotFoundError: If the file does not exist.
25
+ """
15
26
  self.section_config = section_config
16
27
  if not file_path:
17
28
  raise ValueError("Filename cannot be empty")
@@ -29,9 +40,24 @@ class IAdvancedAnalysisFileParser(ABC):
29
40
 
30
41
  @abstractmethod
31
42
  def parse(self) -> JsonDict:
43
+ """
44
+ Parse the file and return its data as a JsonDict.
45
+
46
+ Returns:
47
+ JsonDict: Parsed data from the file.
48
+ """
32
49
  pass
33
50
 
34
51
  def build_result(self,data: JsonDict) -> JsonDict:
52
+ """
53
+ Build a result dictionary from parsed data and section config.
54
+
55
+ Args:
56
+ data (JsonDict): Parsed data from the file.
57
+
58
+ Returns:
59
+ JsonDict: Result dictionary with formatted values and warnings.
60
+ """
35
61
  result: JsonDict = {}
36
62
  for caller_name, caller_config in self.section_config.items():
37
63
  caller_title = caller_config.get("caller_name", None)
@@ -2,6 +2,16 @@ from .IWarning import IWarning
2
2
  from ..Models import *
3
3
  class CarrierPositiveWarning(IWarning):
4
4
  def format(self, config: JsonDict, data: JsonDict) -> str:
5
+ """
6
+ Generate a warning message for carrier/positive status based on conditions.
7
+
8
+ Args:
9
+ config (JsonDict): Configuration dict with 'conditions' (list of dicts).
10
+ data (JsonDict): Data dict to check conditions against.
11
+
12
+ Returns:
13
+ str: Warning message if a condition is met, else empty string.
14
+ """
5
15
  name = config.get("caller_name") or config.get("name")
6
16
  disease = config.get("disease_name") or config.get("disease")
7
17
  conditions = config.get("conditions",{})
@@ -3,7 +3,25 @@ from ..Models import JsonDict, FieldCondition, ConditionOperator
3
3
 
4
4
  class ConditionWarning(IWarning):
5
5
  def format(self, config: JsonDict, data: JsonDict) -> str:
6
- # config["conditions"] is expected to be a list of FieldCondition-like dicts
6
+ """
7
+ Generate warning messages based on a list of conditions.
8
+
9
+ Args:
10
+ config (JsonDict): Configuration dictionary. Must contain a "conditions" key with a list of dicts,
11
+ each representing a FieldCondition (keys: operator, value, message, field [optional]).
12
+ data (JsonDict): Data dictionary to check conditions against. If a condition specifies a field, that field's value is used.
13
+
14
+ Returns:
15
+ str: Concatenated warning messages for all triggered conditions, separated by ". ". Returns an empty string if no conditions are met.
16
+
17
+ Example config:
18
+ config = {
19
+ "conditions": [
20
+ {"operator": "GT", "value": 10, "message": "Value is too high", "field": "score"},
21
+ {"operator": "EQ", "value": 0, "message": "Value is zero"}
22
+ ]
23
+ }
24
+ """
7
25
  msgs = []
8
26
  for cond_dict in config.get("conditions", []):
9
27
  cond_dict["operator"] = ConditionOperator[cond_dict["operator"]]
@@ -3,6 +3,16 @@ from ..Models import JsonDict
3
3
 
4
4
  class GbaWarning(IWarning):
5
5
  def format(self, config: JsonDict, data: JsonDict) -> str:
6
+ """
7
+ Generate a warning message for GBA gene analysis (e.g., Gaucher disease risk).
8
+
9
+ Args:
10
+ config (JsonDict): Configuration dict with keys like 'caller_name', 'disease_name'.
11
+ data (JsonDict): Data dict with keys like 'recombinantHaplotypes', 'variants'.
12
+
13
+ Returns:
14
+ str: Warning message if a relevant condition is met, else empty string.
15
+ """
6
16
  name = config.get("caller_name") or config.get("name") or "GBA Caller"
7
17
  disease = config.get("disease_name") or config.get("disease") or "Gaucher disease"
8
18
 
@@ -2,6 +2,16 @@ from .IWarning import IWarning
2
2
  from ..Models import JsonDict
3
3
  class GenotypeWarning(IWarning):
4
4
  def format(self, config: JsonDict, data: JsonDict) -> str:
5
+ """
6
+ Generate a warning message based on genotype-to-phenotype mapping.
7
+
8
+ Args:
9
+ config (JsonDict): Configuration dict with mapping info.
10
+ data (JsonDict): Data dict with genotype info.
11
+
12
+ Returns:
13
+ str: Warning message if mapping found, else empty string.
14
+ """
5
15
  name = config.get("caller_name") or config.get("name")
6
16
  genotype_key = config.get("genotype_data_key", "genotype")
7
17
  sample = data.get(genotype_key)
@@ -12,11 +22,14 @@ class GenotypeWarning(IWarning):
12
22
  if all(isinstance(v, str) for v in mapping.values()):
13
23
  # Old format: genotype→phenotype
14
24
  if sample in mapping:
15
- warning = f"Based on {name}, this sample is defined as <b>{mapping[sample]}</b>"
25
+ phenotype = mapping[sample]
26
+ if phenotype != "normal":
27
+ warning = f"Based on {name}, this sample is defined as <b>{phenotype}</b>"
16
28
  elif all(isinstance(v, list) for v in mapping.values()):
17
29
  # New format: phenotype→[genotypes]
18
30
  for phenotype, genotypes in mapping.items():
19
31
  if sample in genotypes:
20
- warning = f"Based on {name}, this sample is defined as <b>{phenotype}</b>"
32
+ if phenotype != "normal":
33
+ warning = f"Based on {name}, this sample is defined as <b>{phenotype}</b>"
21
34
  break
22
35
  return warning
@@ -3,6 +3,16 @@ from ..Models import JsonDict
3
3
 
4
4
  class SmnWarning(IWarning):
5
5
  def format(self, config: JsonDict, data: JsonDict) -> str:
6
+ """
7
+ Generate a warning message for SMN gene copy number analysis.
8
+
9
+ Args:
10
+ config (JsonDict): Configuration dict with keys like 'caller_name', 'disease_name'.
11
+ data (JsonDict): Data dict with keys like 'smn1CopyNumber', 'variants'.
12
+
13
+ Returns:
14
+ str: Warning message if a relevant condition is met, else empty string.
15
+ """
6
16
  name = config.get("caller_name") or config.get("name") or "SMN Caller"
7
17
  disease = config.get("disease_name") or config.get("disease") or "Spinal Muscular Atrophy"
8
18
  smn1_cn = data.get("smn1CopyNumber")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AdvancedAnalysisFileParser
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Parse Illumina-DRAGEN TSV/JSON outputs to unified geneyx JSON with warnings.
5
5
  Author: Bar Cohen
6
6
  Author-email: Bar Cohen <bar@geneyx.com>
@@ -13,6 +13,12 @@ License: MIT License
13
13
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14
14
 
15
15
  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
16
+ Project-URL: homepage, https://github.com/geneyx/AdvancedAnalysisFileParser
17
+ Project-URL: repository, https://github.com/geneyx/AdvancedAnalysisFileParser
18
+ Project-URL: documentation, https://geneyx.com/docs
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: License :: OSI Approved :: MIT License
21
+ Classifier: Operating System :: OS Independent
16
22
  Requires-Python: >=3.7
17
23
  Description-Content-Type: text/markdown
18
24
  License-File: LICENSE
@@ -1,5 +1,5 @@
1
1
  AdvancedAnalysisFileParser/AdvancedAnalysisConstants.py,sha256=K7hjlqtK9mZseMkku7XapoLS8laF5R9NftXPPzukkYA,338
2
- AdvancedAnalysisFileParser/AdvancedAnalysisParser.py,sha256=wthDgpNMXg7v5REHLbZXKJNnSwpdiJeAg91ffilkEbI,5594
2
+ AdvancedAnalysisFileParser/AdvancedAnalysisParser.py,sha256=30bTkjRyjOJi7T5bqnJzza211HAXl3l0zg_5w1W7Rck,8176
3
3
  AdvancedAnalysisFileParser/README.md,sha256=7WzqoQNz7YUSFzihCU6DCIwuIClPNidu8Y9xM5oIP2g,16032
4
4
  AdvancedAnalysisFileParser/Test_AdvancedAnalysisParser.py,sha256=fgBNiZwSYDfC49dvjF38p3_MprDZ1bohr4aRKekoAus,12127
5
5
  AdvancedAnalysisFileParser/__init__.py,sha256=W164sLWIb-KpHkkzcasves9lrfh0lv8905uXKxewsLY,653
@@ -9,14 +9,14 @@ AdvancedAnalysisFileParser/gba_tsv_config.json,sha256=rfxxXM_raswCqrNmJ1Fvrn9Mqp
9
9
  AdvancedAnalysisFileParser/run_test_parser.py,sha256=JwOlEPRltESNFELalFuVmmjjV8NDtkzMitqm4Itqicw,759
10
10
  AdvancedAnalysisFileParser/smn_tsv_config.json,sha256=nuS8Q2AqQr3AGN0TAdgp1yvESjvHAJkQzkGexMm9qPY,748
11
11
  AdvancedAnalysisFileParser/Models/ConditionOperator.py,sha256=Ut8Mw5lYpQdoV2K8vQg1HMr6QeIOcBZHXbugOKPqDVU,309
12
- AdvancedAnalysisFileParser/Models/FieldCondition.py,sha256=ZNm0rxBcoyokpoMU0fG9ZEXhDn7jmz7wIWoPWaeuoSw,1262
12
+ AdvancedAnalysisFileParser/Models/FieldCondition.py,sha256=zY7bD-45D21czrMr8g-jcpDxCJkK9ZXXMkYz8foLREg,2063
13
13
  AdvancedAnalysisFileParser/Models/FieldWarningConfig.py,sha256=tFp9KQfS-ooQPZKYW73Hscxq2lXlKlwLsMx4VBEQUuM,141
14
14
  AdvancedAnalysisFileParser/Models/JsonDict.py,sha256=28NijxJIOuLBaHYuXMg-m-FMy4w_yWG-vIghuYMMWlQ,54
15
15
  AdvancedAnalysisFileParser/Models/SectionConfig.py,sha256=0RwZgl2SO1LVPtkMOWsK_nd8qzViTN8g91zmIv1Wzwo,234
16
16
  AdvancedAnalysisFileParser/Models/__init__.py,sha256=S3N8EbMLfYxf7vAwmW_AZTUhNzT06rm-45nSOnJY5QM,338
17
17
  AdvancedAnalysisFileParser/Parsers/AdvancedAnalysisFileParserFactory.py,sha256=OVv4p7U1C_RTDwapxFEspnHNQOnqsOkLQUxbwOmL4ZI,2130
18
18
  AdvancedAnalysisFileParser/Parsers/DragenTruSightOncology500TSVParser.py,sha256=80e1-hgrgfXMW_vP3b-VkeGcaRWfP4lNyzAw5htQRS8,4277
19
- AdvancedAnalysisFileParser/Parsers/IAdvancedAnalysisFileParser.py,sha256=MoF4Uc1sufDLA5bATZnjWU7GHivytqCeLncGYATIYyo,3769
19
+ AdvancedAnalysisFileParser/Parsers/IAdvancedAnalysisFileParser.py,sha256=b00FAdqA8enEi7jKGqKhSwfD0_i-4zsjIKhHAo30E9I,4532
20
20
  AdvancedAnalysisFileParser/Parsers/JsonSectionParser.py,sha256=yRFhIaCmXHrXoPdqcNkWUwYGSAmatGytEppC9HrXrXE,1712
21
21
  AdvancedAnalysisFileParser/Parsers/OneLineTsvParser.py,sha256=0Ri-4HOjRFuhPC1m-LQ7Yrtdf8mwSrLSxbLHFygzMGU,1079
22
22
  AdvancedAnalysisFileParser/Parsers/__init__.py,sha256=_EhznMIotrjrQR-rf65rp7_XSJa6RUZlKV031p1w6CA,240
@@ -45,16 +45,17 @@ AdvancedAnalysisFileParser/Test/smn.tsv,sha256=RZDqQB8vbSK3AZMd03-K_m6OOqLRGfULs
45
45
  AdvancedAnalysisFileParser/Test/smn_carrier.json,sha256=24aLs-ha8YmmwpoFgKTkQ8jNSQxSGeI1T0UUUZ6kPME,2189
46
46
  AdvancedAnalysisFileParser/Test/smn_positive.json,sha256=mmGAdUWTmG3WBbYP6PrQnLlLO4pwiBYzYifEmPd3FcE,2189
47
47
  AdvancedAnalysisFileParser/Test/smn_silent_carrier_risk.json,sha256=CMn_hEz-yR2AFg44ifiGCWiPA39f5RN0go4_qPnW41I,2286
48
- AdvancedAnalysisFileParser/Warnings/CarrierPositiveWarning.py,sha256=MQt-HjlkGemMVrS4FRaCi8qgzFTLo_xvfiCOXtMP1P0,866
49
- AdvancedAnalysisFileParser/Warnings/ConditionWarning.py,sha256=VqPHn2f_wBt8R_vddpm3wWCkCfgeKEKIBiRpmhhtIj4,880
50
- AdvancedAnalysisFileParser/Warnings/GbaWarning.py,sha256=CX3rlXd9Gn1lPA_r_GFRb8Ju76h_nN326HZFuiCuGeU,2166
51
- AdvancedAnalysisFileParser/Warnings/GenotypeWarning.py,sha256=qZO6txKAMTBcBH3FJ2ttCsu4uHVj-SeyUI5_jPSGTfk,1161
48
+ AdvancedAnalysisFileParser/Warnings/CarrierPositiveWarning.py,sha256=Ky137f_jnzYV4BjgyeZQCfRQatpgfjYLwc9kdAMn5VM,1235
49
+ AdvancedAnalysisFileParser/Warnings/ConditionWarning.py,sha256=PQizdGpXVfqgFTeAAKrdXAQQxwiuhWkUABSOX2jrlEU,1707
50
+ AdvancedAnalysisFileParser/Warnings/GbaWarning.py,sha256=oJHRDrocdect-xyCxe_xpP9sp1XP0aZmExb_cwQjoeA,2581
51
+ AdvancedAnalysisFileParser/Warnings/GenotypeWarning.py,sha256=jbIigpjORSGOQqrMO-gvG8PpnB1GNZ9z9bLN2O_n0ZU,1637
52
52
  AdvancedAnalysisFileParser/Warnings/IWarning.py,sha256=DCfpTdSEzeVjrB1yYEP83w-v-OrjJO5lHpdd5Jzkk20,184
53
- AdvancedAnalysisFileParser/Warnings/SmnWarning.py,sha256=VXj-fy40ywZmzLcCwdq_CheKjK0DrrZao0QNQuVsnqY,1779
53
+ AdvancedAnalysisFileParser/Warnings/SmnWarning.py,sha256=-ZoZHOvHlXD5KoJ372-fZQLCJzOMd8Ac-V3atT9w2uA,2170
54
54
  AdvancedAnalysisFileParser/Warnings/WarningFactory.py,sha256=RYwyONBpA84GL-1hIWjR4C9mGuSBthUcDJfX1eui3uU,1340
55
55
  AdvancedAnalysisFileParser/Warnings/__init__.py,sha256=v8-22YDAbR87sZdFRpEUmXIQzmXhE-Eq9wa9sC6qoaM,127
56
- advancedanalysisfileparser-0.1.0.dist-info/licenses/LICENSE,sha256=-qHDWhmLWnBi2Pz88Kd-wacLV754EhSbV6jV0rcOn-s,1070
57
- advancedanalysisfileparser-0.1.0.dist-info/METADATA,sha256=w_7FT-Qu1JxVh063ZPTNgTEtHQ7FIqYGcUlUJLqTw3A,4742
58
- advancedanalysisfileparser-0.1.0.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
59
- advancedanalysisfileparser-0.1.0.dist-info/top_level.txt,sha256=qktb0ZKlTD_sOMGxTg44cJ3zwuHamcsYPVwXHBCSF5U,27
60
- advancedanalysisfileparser-0.1.0.dist-info/RECORD,,
56
+ advancedanalysisfileparser-0.1.2.dist-info/licenses/LICENSE,sha256=-qHDWhmLWnBi2Pz88Kd-wacLV754EhSbV6jV0rcOn-s,1070
57
+ advancedanalysisfileparser-0.1.2.dist-info/METADATA,sha256=SAqPnLpK0BkX7GgLUWctT5b7gZI-TLxfzje_T-03uY4,5094
58
+ advancedanalysisfileparser-0.1.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
59
+ advancedanalysisfileparser-0.1.2.dist-info/entry_points.txt,sha256=qWyot7L31WqH2O-F0ie0Negr-MbwANuF6vJ_4MVE_sk,175
60
+ advancedanalysisfileparser-0.1.2.dist-info/top_level.txt,sha256=qktb0ZKlTD_sOMGxTg44cJ3zwuHamcsYPVwXHBCSF5U,27
61
+ advancedanalysisfileparser-0.1.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (82.0.0)
2
+ Generator: setuptools (82.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ advanced-analysis = AdvancedAnalysisFileParser.AdvancedAnalysisParser:from_cli
3
+ function-data = AdvancedAnalysisFileParser.AdvancedAnalysisParser:parse_files