greenmining 1.0.4__py3-none-any.whl → 1.0.6__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.
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: greenmining
3
- Version: 1.0.4
4
- Summary: Analyze GitHub repositories to identify green software engineering patterns and energy-efficient practices
3
+ Version: 1.0.6
4
+ Summary: An empirical Python library for Mining Software Repositories (MSR) in Green IT research
5
5
  Author-email: Adam Bouafia <a.bouafia@student.vu.nl>
6
6
  License: MIT
7
7
  Project-URL: Homepage, https://github.com/adam-bouafia/greenmining
@@ -9,7 +9,7 @@ Project-URL: Documentation, https://github.com/adam-bouafia/greenmining#readme
9
9
  Project-URL: Repository, https://github.com/adam-bouafia/greenmining
10
10
  Project-URL: Issues, https://github.com/adam-bouafia/greenmining/issues
11
11
  Project-URL: Changelog, https://github.com/adam-bouafia/greenmining/blob/main/CHANGELOG.md
12
- Keywords: green-software,gsf,sustainability,carbon-footprint,microservices,mining,repository-analysis,energy-efficiency,github-analysis
12
+ Keywords: green-software,gsf,msr,mining-software-repositories,green-it,sustainability,carbon-footprint,energy-efficiency,repository-analysis,github-analysis,pydriller,empirical-software-engineering
13
13
  Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Intended Audience :: Science/Research
@@ -43,8 +43,13 @@ Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
43
43
  Requires-Dist: black>=23.12.0; extra == "dev"
44
44
  Requires-Dist: ruff>=0.1.9; extra == "dev"
45
45
  Requires-Dist: mypy>=1.8.0; extra == "dev"
46
- Requires-Dist: build>=1.0.4; extra == "dev"
46
+ Requires-Dist: build>=1.0.5; extra == "dev"
47
47
  Requires-Dist: twine>=4.0.2; extra == "dev"
48
+ Provides-Extra: energy
49
+ Requires-Dist: psutil>=5.9.0; extra == "energy"
50
+ Requires-Dist: codecarbon>=2.3.0; extra == "energy"
51
+ Provides-Extra: dashboard
52
+ Requires-Dist: flask>=3.0.0; extra == "dashboard"
48
53
  Provides-Extra: docs
49
54
  Requires-Dist: sphinx>=7.2.0; extra == "docs"
50
55
  Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == "docs"
@@ -53,15 +58,30 @@ Dynamic: license-file
53
58
 
54
59
  # greenmining
55
60
 
56
- Green mining for microservices repositories.
61
+ An empirical Python library for Mining Software Repositories (MSR) in Green IT research.
57
62
 
58
63
  [![PyPI](https://img.shields.io/pypi/v/greenmining)](https://pypi.org/project/greenmining/)
59
64
  [![Python](https://img.shields.io/pypi/pyversions/greenmining)](https://pypi.org/project/greenmining/)
60
65
  [![License](https://img.shields.io/github/license/adam-bouafia/greenmining)](LICENSE)
66
+ [![Documentation](https://img.shields.io/badge/docs-readthedocs-blue)](https://greenmining.readthedocs.io/)
61
67
 
62
68
  ## Overview
63
69
 
64
- `greenmining` is a Python library and CLI tool for analyzing GitHub repositories to identify green software engineering practices and energy-efficient patterns. It detects sustainable software patterns across cloud, web, AI, database, networking, and general categories.
70
+ `greenmining` is a research-grade Python library designed for **empirical Mining Software Repositories (MSR)** studies in **Green IT**. It enables researchers and practitioners to:
71
+
72
+ - **Mine repositories at scale** - Fetch and analyze GitHub repositories via GraphQL API with configurable filters
73
+ - **Batch analysis with parallelism** - Analyze multiple repositories concurrently with configurable worker pools
74
+ - **Classify green commits** - Detect 122 sustainability patterns from the Green Software Foundation (GSF) catalog
75
+ - **Analyze any repository by URL** - Direct PyDriller-based analysis with support for private repositories
76
+ - **Measure energy consumption** - RAPL, CodeCarbon, and CPU Energy Meter backends for power profiling
77
+ - **Carbon footprint reporting** - CO2 emissions calculation with 20+ country profiles and cloud region support
78
+ - **Power regression detection** - Identify commits that increased energy consumption
79
+ - **Method-level analysis** - Per-method complexity and metrics via Lizard integration
80
+ - **Version power comparison** - Compare power consumption across software versions
81
+ - **Generate research datasets** - Statistical analysis, temporal trends, and publication-ready reports
82
+ - **Web dashboard** - Flask-based interactive visualization of analysis results
83
+
84
+ Whether you're conducting MSR research, analyzing green software adoption, or measuring the energy footprint of codebases, GreenMining provides the empirical toolkit you need.
65
85
 
66
86
  ## Installation
67
87
 
@@ -105,7 +125,7 @@ if is_green_aware(commit_msg):
105
125
  # Output: ['Cache Static Data', 'Use Efficient Cache Strategies']
106
126
  ```
107
127
 
108
- #### Fetch Repositories with Custom Keywords (NEW)
128
+ #### Fetch Repositories with Custom Keywords
109
129
 
110
130
  ```python
111
131
  from greenmining import fetch_repositories
@@ -144,8 +164,6 @@ for repo in repos[:5]:
144
164
  ```python
145
165
  from greenmining.services.commit_extractor import CommitExtractor
146
166
  from greenmining.services.data_analyzer import DataAnalyzer
147
- from greenmining.analyzers.nlp_analyzer import NLPAnalyzer
148
- from greenmining.analyzers.ml_feature_extractor import MLFeatureExtractor
149
167
  from greenmining import fetch_repositories
150
168
 
151
169
  # Fetch repositories with custom keywords
@@ -195,18 +213,6 @@ for commit in commits:
195
213
  results.append(result)
196
214
  print(f"Green commit found: {commit.message[:50]}...")
197
215
  print(f" Patterns: {result['known_pattern']}")
198
-
199
- # Access NLP analysis results (NEW)
200
- if 'nlp_analysis' in result:
201
- nlp = result['nlp_analysis']
202
- print(f" NLP: {nlp['morphological_count']} morphological matches, "
203
- f"{nlp['semantic_count']} semantic matches")
204
-
205
- # Access ML features (NEW)
206
- if 'ml_features' in result:
207
- ml = result['ml_features']['text']
208
- print(f" ML Features: {ml['word_count']} words, "
209
- f"keyword density: {ml['keyword_density']:.2f}")
210
216
  ```
211
217
 
212
218
  #### Access Sustainability Patterns Data
@@ -242,7 +248,7 @@ print(f"Available categories: {sorted(categories)}")
242
248
  # 'monitoring', 'network', 'networking', 'resource', 'web']
243
249
  ```
244
250
 
245
- #### Advanced Analysis: Temporal Trends (NEW)
251
+ #### Advanced Analysis: Temporal Trends
246
252
 
247
253
  ```python
248
254
  from greenmining.services.data_aggregator import DataAggregator
@@ -374,7 +380,7 @@ repositories = fetch_repositories(
374
380
  min_stars=10,
375
381
  keywords="software engineering",
376
382
  )
377
- print(f"Fetched {len(repositories)} repositories")
383
+ print(f"Fetched {len(repositories)} repositories")
378
384
 
379
385
  # STAGE 2: Extract Commits
380
386
  print("\nExtracting commits...")
@@ -386,7 +392,7 @@ extractor = CommitExtractor(
386
392
  timeout=120,
387
393
  )
388
394
  all_commits = extractor.extract_from_repositories(repositories)
389
- print(f"Extracted {len(all_commits)} commits")
395
+ print(f"Extracted {len(all_commits)} commits")
390
396
 
391
397
  # Save commits
392
398
  extractor.save_results(
@@ -405,8 +411,8 @@ analyzed_commits = analyzer.analyze_commits(all_commits)
405
411
  # Count green-aware commits
406
412
  green_count = sum(1 for c in analyzed_commits if c.get("green_aware", False))
407
413
  green_percentage = (green_count / len(analyzed_commits) * 100) if analyzed_commits else 0
408
- print(f"Analyzed {len(analyzed_commits)} commits")
409
- print(f"Green-aware: {green_count} ({green_percentage:.1f}%)")
414
+ print(f"Analyzed {len(analyzed_commits)} commits")
415
+ print(f"Green-aware: {green_count} ({green_percentage:.1f}%)")
410
416
 
411
417
  # Save analysis
412
418
  analyzer.save_results(analyzed_commits, output_dir / "analyzed.json")
@@ -434,7 +440,7 @@ print("\n" + "="*80)
434
440
  print("ANALYSIS COMPLETE")
435
441
  print("="*80)
436
442
  aggregator.print_summary(results)
437
- print(f"\n📁 Results saved in: {output_dir.absolute()}")
443
+ print(f"\nResults saved in: {output_dir.absolute()}")
438
444
  ```
439
445
 
440
446
  **What this example does:**
@@ -567,38 +573,44 @@ greenmining includes built-in energy measurement capabilities for tracking the c
567
573
  |---------|----------|---------|--------------|
568
574
  | **RAPL** | Linux (Intel/AMD) | CPU/RAM energy (Joules) | `/sys/class/powercap/` access |
569
575
  | **CodeCarbon** | Cross-platform | Energy + Carbon emissions (gCO2) | `pip install codecarbon` |
576
+ | **CPU Meter** | All platforms | Estimated CPU energy (Joules) | Optional: `pip install psutil` |
577
+ | **Auto** | All platforms | Best available backend | Automatic detection |
570
578
 
571
579
  #### Python API
572
580
 
573
581
  ```python
574
- from greenmining.energy import RAPLEnergyMeter, CodeCarbonMeter
575
-
576
- # RAPL (Linux only)
577
- rapl = RAPLEnergyMeter()
578
- if rapl.is_available():
579
- rapl.start()
580
- # ... run analysis ...
581
- result = rapl.stop()
582
- print(f"Energy: {result.energy_joules:.2f} J")
583
-
584
- # CodeCarbon (cross-platform)
585
- cc = CodeCarbonMeter()
586
- if cc.is_available():
587
- cc.start()
588
- # ... run analysis ...
589
- result = cc.stop()
590
- print(f"Energy: {result.energy_joules:.2f} J")
591
- print(f"Carbon: {result.carbon_grams:.4f} gCO2")
582
+ from greenmining.energy import RAPLEnergyMeter, CPUEnergyMeter, get_energy_meter
583
+
584
+ # Auto-detect best backend
585
+ meter = get_energy_meter("auto")
586
+ meter.start()
587
+ # ... run analysis ...
588
+ result = meter.stop()
589
+ print(f"Energy: {result.joules:.2f} J")
590
+ print(f"Power: {result.watts_avg:.2f} W")
591
+
592
+ # Integrated energy tracking during analysis
593
+ from greenmining.services.local_repo_analyzer import LocalRepoAnalyzer
594
+
595
+ analyzer = LocalRepoAnalyzer(energy_tracking=True, energy_backend="auto")
596
+ result = analyzer.analyze_repository("https://github.com/pallets/flask")
597
+ print(f"Analysis energy: {result.energy_metrics['joules']:.2f} J")
592
598
  ```
593
599
 
594
- #### Experiment Results
600
+ #### Carbon Footprint Reporting
601
+
602
+ ```python
603
+ from greenmining.energy import CarbonReporter
595
604
 
596
- CodeCarbon was verified with a real experiment:
597
- - **Repository**: flask (pallets/flask)
598
- - **Commits analyzed**: 10
599
- - **Energy measured**: 160.6 J
600
- - **Carbon emissions**: 0.0119 gCO2
601
- - **Duration**: 11.28 seconds
605
+ reporter = CarbonReporter(
606
+ country_iso="USA",
607
+ cloud_provider="aws",
608
+ region="us-east-1",
609
+ )
610
+ report = reporter.generate_report(total_joules=3600.0)
611
+ print(f"CO2: {report.total_emissions_kg * 1000:.4f} grams")
612
+ print(f"Equivalent: {report.tree_months:.2f} tree-months to offset")
613
+ ```
602
614
 
603
615
  ### Pattern Database
604
616
 
@@ -700,8 +712,7 @@ ruff check greenmining/ tests/
700
712
  - Python 3.9+
701
713
  - PyGithub >= 2.1.1
702
714
  - PyDriller >= 2.5
703
- - pandas >= 2.2.0
704
- - click >= 8.1.7
715
+ - pandas >= 2.2.0
705
716
  - codecarbon >= 2.0.0 (optional, for cross-platform energy measurement)
706
717
 
707
718
  ## License
@@ -0,0 +1,44 @@
1
+ greenmining/__init__.py,sha256=wbMwJYwC1HKIPn4w5N6Ux8GV5fAohevW7iO_BYuFuA4,2637
2
+ greenmining/__main__.py,sha256=NYOVS7D4w2XDLn6SyXHXPKE5GrNGOeoWSTb_KazgK5c,590
3
+ greenmining/__version__.py,sha256=xZc02a8bS3vUJlzh8k9RoxemB1irQmq_SpVVj6Cg5M0,62
4
+ greenmining/config.py,sha256=M4a7AwM1ErCmOY0n5Vmyoo9HPblSkTZ-HD3k2YHzs4A,8340
5
+ greenmining/gsf_patterns.py,sha256=hnd9GuWB8GEflrusEib5hjvl8CD5TSbGcBtb0gfxFp4,54193
6
+ greenmining/utils.py,sha256=dSFwQzQwbS8rYZSgwLIxM_geLqbldwqVOIXMqEg08Qs,5609
7
+ greenmining/analyzers/__init__.py,sha256=rTgpDfFE6za4QAHW59ncnS6TW02omn-TZMnYNVUIZp0,753
8
+ greenmining/analyzers/code_diff_analyzer.py,sha256=1dk68R3O0RZG8gx1cm9B_UlZ1Uwyb_Q3oScRbCVx4tM,10950
9
+ greenmining/analyzers/metrics_power_correlator.py,sha256=qMKr4hSTzT0Un3vsGZNkPCp9TxyzdFwrhjw5M1IKOgk,5964
10
+ greenmining/analyzers/power_regression.py,sha256=5pxs7IoTtGcwwX5KzGeM5hOm2I9Axr-0X4N_4007iMw,7387
11
+ greenmining/analyzers/qualitative_analyzer.py,sha256=RcjOMLj_DPH869ey9J0uI7JK_krCefMhNkPLOJUDFF8,15391
12
+ greenmining/analyzers/statistical_analyzer.py,sha256=DzWAcCyw42Ig3FIxTwPPBikgt2uzMdktxklonOYfnOk,7166
13
+ greenmining/analyzers/temporal_analyzer.py,sha256=JfTcAoI20oCFMehGrSRnDqhJTXI-RUbdCTMwDOTW9-g,14259
14
+ greenmining/analyzers/version_power_analyzer.py,sha256=2P6zOqBg-ButtIhF-4cutiwD2Q1geMY49VFUghHXXoI,8119
15
+ greenmining/controllers/__init__.py,sha256=UiAT6zBvC1z_9cJWfzq1cLA0I4r9b2vURHipj8oDczI,180
16
+ greenmining/controllers/repository_controller.py,sha256=fyL6Y8xpoixDplP4_rKWiwak42M2DaIihzyKVaBlivA,9680
17
+ greenmining/dashboard/__init__.py,sha256=Ig_291-hLrH9k3rV0whhQ1EkhiaRR8ciHiJ5s5OCBf4,141
18
+ greenmining/dashboard/app.py,sha256=Hk6_i2qmcg6SGW7UzxglEIvUBJiloRA-hMYI-YSORcA,8604
19
+ greenmining/energy/__init__.py,sha256=GoCYh7hitWBoPMtan1HF1yezCHi7o4sa_YUJgGkeJc8,558
20
+ greenmining/energy/base.py,sha256=mVdp-E04KWu3UnHFL61pzrI-OP-KsUshAmXHwgsJkRU,5749
21
+ greenmining/energy/carbon_reporter.py,sha256=bKIFlLhHfYzI4DBu_ff4GW1Psz4oSCAF4NmzQb-EShA,8298
22
+ greenmining/energy/codecarbon_meter.py,sha256=HyQptyEaS1ZMu_qdxg0Tyuly1PCmmbbNwwYX8qYsTs4,4927
23
+ greenmining/energy/cpu_meter.py,sha256=mhEG3Y7fjz3wV5lojcYeFXvCXXgmelGQaBfN2q7yTNc,5007
24
+ greenmining/energy/rapl.py,sha256=b63M1mS7uF9Uo0vFi0z7Qwdo56U1TqxIYQXINhYp9Jo,5292
25
+ greenmining/models/__init__.py,sha256=2hkB0quhMePvvA1AkYfj5uiF_HyGtXVxn0BU-5m_oSg,302
26
+ greenmining/models/aggregated_stats.py,sha256=N-ZGcQO7IJ33Joa8luMVjtHhKYzNe48VW8hFqs9a5Jc,1016
27
+ greenmining/models/analysis_result.py,sha256=YICTCEcrJxZ1R8Xaio3AZOjCGwMzC_62BMAL0J_XY1w,1509
28
+ greenmining/models/commit.py,sha256=mnRDWSiIyGtJeGXI8sav9hukWUyVFpoNe6GixRlZjY4,2439
29
+ greenmining/models/repository.py,sha256=SKjS01onOptpMioumtAPZxKpKheHAeVXnXyvatl7CfM,2856
30
+ greenmining/presenters/__init__.py,sha256=d1CMtqtUAHYHYNzigPyjtGOUtnH1drtUwf7-bFQq2B8,138
31
+ greenmining/presenters/console_presenter.py,sha256=XOahvlcr4qLbUdhk8cGq1ZWagvemEd3Wgriu8T5EI3s,4896
32
+ greenmining/services/__init__.py,sha256=ZEMOVut0KRdume_vz58beSNps3YgeoGBXmUjEqNgIhc,690
33
+ greenmining/services/commit_extractor.py,sha256=Fz2WTWjIZ_vQhSfkJKnWpJnBpI2nm0KacA4qYAvCpSE,8451
34
+ greenmining/services/data_aggregator.py,sha256=TsFT0oGOnnHk0QGZ1tT6ZhKGc5X1H1D1u7-7OpiPo7Y,19566
35
+ greenmining/services/data_analyzer.py,sha256=f0nlJkPAclHHCzzTyQW5bjhYrgE0XXiR1x7_o3fJaDs,9732
36
+ greenmining/services/github_fetcher.py,sha256=mUcmQevhdDRYX72O-M7Vi-s3y4ZwNyKewleti838cqU,8285
37
+ greenmining/services/github_graphql_fetcher.py,sha256=p76vp5EgStzkmTcws__jb90za8m61toW0CBrwrm5Ew4,11972
38
+ greenmining/services/local_repo_analyzer.py,sha256=5DMN9RIyGXNdsOlIDV4Mp0fPavbB69oBA9us17P5cNo,24668
39
+ greenmining/services/reports.py,sha256=Vrw_pBNmVw2mTAf1dpcAqjBe6gXv-O4w_XweoVTt7L8,23392
40
+ greenmining-1.0.6.dist-info/licenses/LICENSE,sha256=M7ma3JHGeiIZIs3ea0HTcFl_wLFPX2NZElUliYs4bCA,1083
41
+ greenmining-1.0.6.dist-info/METADATA,sha256=cd82RQon4bIBdJT85mcCeZuXL3evl4N9YkcqywDw41k,26920
42
+ greenmining-1.0.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
+ greenmining-1.0.6.dist-info/top_level.txt,sha256=nreXgXxZIWI-42yQknQ0HXtUrFnzZ8N1ra4Mdy2KcsI,12
44
+ greenmining-1.0.6.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- greenmining/__init__.py,sha256=m1foz4CUfEgBsgyWHEjehsT3qt1vogyer1fjhIVFqjg,992
2
- greenmining/__main__.py,sha256=NYOVS7D4w2XDLn6SyXHXPKE5GrNGOeoWSTb_KazgK5c,590
3
- greenmining/__version__.py,sha256=QpL6VzwpRtOZiXqutOetZBUCoiJKYFeTosucueZ4gpQ,62
4
- greenmining/config.py,sha256=00v1Ln8eZE0RxMrLxvonf8XOWqeRYaIme_iC1yDLR90,8228
5
- greenmining/gsf_patterns.py,sha256=hnd9GuWB8GEflrusEib5hjvl8CD5TSbGcBtb0gfxFp4,54193
6
- greenmining/utils.py,sha256=dSFwQzQwbS8rYZSgwLIxM_geLqbldwqVOIXMqEg08Qs,5609
7
- greenmining/analyzers/__init__.py,sha256=VI22zb3TnhZrwEuBy0J3pIbqNVVZl1wx8NYRlhR6Wok,362
8
- greenmining/analyzers/code_diff_analyzer.py,sha256=1dk68R3O0RZG8gx1cm9B_UlZ1Uwyb_Q3oScRbCVx4tM,10950
9
- greenmining/analyzers/qualitative_analyzer.py,sha256=RcjOMLj_DPH869ey9J0uI7JK_krCefMhNkPLOJUDFF8,15391
10
- greenmining/analyzers/statistical_analyzer.py,sha256=DzWAcCyw42Ig3FIxTwPPBikgt2uzMdktxklonOYfnOk,7166
11
- greenmining/analyzers/temporal_analyzer.py,sha256=JfTcAoI20oCFMehGrSRnDqhJTXI-RUbdCTMwDOTW9-g,14259
12
- greenmining/controllers/__init__.py,sha256=UiAT6zBvC1z_9cJWfzq1cLA0I4r9b2vURHipj8oDczI,180
13
- greenmining/controllers/repository_controller.py,sha256=fyL6Y8xpoixDplP4_rKWiwak42M2DaIihzyKVaBlivA,9680
14
- greenmining/energy/__init__.py,sha256=Y9RkNuZ3T6npEBxOZJhVc8wy6feXQePdXojLaZxkfGM,308
15
- greenmining/energy/base.py,sha256=s0yyRDhnEkrkCE5cgp2yHOrIhKbCpU9V7n4Rf1ejWLM,5559
16
- greenmining/energy/codecarbon_meter.py,sha256=z4T63qunEsU2R2qylZdGCtk3e-y_HYaBjBMD3nuFRU0,5102
17
- greenmining/energy/rapl.py,sha256=nZoVmdZshSsFLEYWNQxYyNg8fhhzgNME02bpQuIQL_U,5584
18
- greenmining/models/__init__.py,sha256=2hkB0quhMePvvA1AkYfj5uiF_HyGtXVxn0BU-5m_oSg,302
19
- greenmining/models/aggregated_stats.py,sha256=N-ZGcQO7IJ33Joa8luMVjtHhKYzNe48VW8hFqs9a5Jc,1016
20
- greenmining/models/analysis_result.py,sha256=YICTCEcrJxZ1R8Xaio3AZOjCGwMzC_62BMAL0J_XY1w,1509
21
- greenmining/models/commit.py,sha256=mnRDWSiIyGtJeGXI8sav9hukWUyVFpoNe6GixRlZjY4,2439
22
- greenmining/models/repository.py,sha256=SKjS01onOptpMioumtAPZxKpKheHAeVXnXyvatl7CfM,2856
23
- greenmining/presenters/__init__.py,sha256=d1CMtqtUAHYHYNzigPyjtGOUtnH1drtUwf7-bFQq2B8,138
24
- greenmining/presenters/console_presenter.py,sha256=XOahvlcr4qLbUdhk8cGq1ZWagvemEd3Wgriu8T5EI3s,4896
25
- greenmining/services/__init__.py,sha256=UhjS2X9x2v5iH991UDPazP3dTPuSgylMq4kQJaueQYs,481
26
- greenmining/services/commit_extractor.py,sha256=3EfUVBwd8hGSbl7pS-_jAL8gX8RxIASXTX5EZBbKQPI,8387
27
- greenmining/services/data_aggregator.py,sha256=TsFT0oGOnnHk0QGZ1tT6ZhKGc5X1H1D1u7-7OpiPo7Y,19566
28
- greenmining/services/data_analyzer.py,sha256=f0nlJkPAclHHCzzTyQW5bjhYrgE0XXiR1x7_o3fJaDs,9732
29
- greenmining/services/github_fetcher.py,sha256=WFyowC0tROKAhP3bA4QXH7QIYf42yaZf2ePpUEvOZ6s,8266
30
- greenmining/services/github_graphql_fetcher.py,sha256=mQOUZZEltYWusA7TR6Q7BZrHZ-N1Ijt0Wg2kV5T7lFM,11958
31
- greenmining/services/local_repo_analyzer.py,sha256=IrfqY1L6peGO78zufEj4uAU1N7nskc0edAYVzE0Ew_w,14785
32
- greenmining/services/reports.py,sha256=7Smc7a4KtpmkAJ8UoMlzH5BZerC_iO_jMyQw3_42n1s,23387
33
- greenmining-1.0.4.dist-info/licenses/LICENSE,sha256=M7ma3JHGeiIZIs3ea0HTcFl_wLFPX2NZElUliYs4bCA,1083
34
- greenmining-1.0.4.dist-info/METADATA,sha256=rP_4u0fkgp_Bmq2txIpBTLa7ZMj3By2ylTjoej7RSEw,25610
35
- greenmining-1.0.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
36
- greenmining-1.0.4.dist-info/top_level.txt,sha256=nreXgXxZIWI-42yQknQ0HXtUrFnzZ8N1ra4Mdy2KcsI,12
37
- greenmining-1.0.4.dist-info/RECORD,,