greenmining 1.0.5__py3-none-any.whl → 1.0.7__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.5
4
- Summary: Analyze GitHub repositories to identify green software engineering patterns and energy-efficient practices
3
+ Version: 1.0.7
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
@@ -45,6 +45,11 @@ Requires-Dist: ruff>=0.1.9; extra == "dev"
45
45
  Requires-Dist: mypy>=1.8.0; extra == "dev"
46
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 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
 
@@ -310,7 +330,137 @@ print(f"Top patterns: {stats['top_patterns'][:5]}")
310
330
  aggregator.export_to_csv(results, "output.csv")
311
331
  ```
312
332
 
313
- #### Batch Analysis
333
+ #### URL-Based Repository Analysis
334
+
335
+ ```python
336
+ from greenmining.services.local_repo_analyzer import LocalRepoAnalyzer
337
+
338
+ analyzer = LocalRepoAnalyzer(
339
+ max_commits=200,
340
+ cleanup_after=True,
341
+ )
342
+
343
+ result = analyzer.analyze_repository("https://github.com/pallets/flask")
344
+
345
+ print(f"Repository: {result.name}")
346
+ print(f"Commits analyzed: {result.total_commits}")
347
+ print(f"Green-aware: {result.green_commits} ({result.green_commit_rate:.1%})")
348
+
349
+ for commit in result.commits[:5]:
350
+ if commit.green_aware:
351
+ print(f" {commit.message[:60]}...")
352
+ ```
353
+
354
+ #### Batch Analysis with Parallelism
355
+
356
+ ```python
357
+ from greenmining import analyze_repositories
358
+
359
+ results = analyze_repositories(
360
+ urls=[
361
+ "https://github.com/kubernetes/kubernetes",
362
+ "https://github.com/istio/istio",
363
+ "https://github.com/envoyproxy/envoy",
364
+ ],
365
+ max_commits=100,
366
+ parallel_workers=3,
367
+ energy_tracking=True,
368
+ energy_backend="auto",
369
+ )
370
+
371
+ for result in results:
372
+ print(f"{result.name}: {result.green_commit_rate:.1%} green")
373
+ ```
374
+
375
+ #### Private Repository Analysis
376
+
377
+ ```python
378
+ from greenmining.services.local_repo_analyzer import LocalRepoAnalyzer
379
+
380
+ # HTTPS with token
381
+ analyzer = LocalRepoAnalyzer(github_token="ghp_xxxx")
382
+ result = analyzer.analyze_repository("https://github.com/company/private-repo")
383
+
384
+ # SSH with key
385
+ analyzer = LocalRepoAnalyzer(ssh_key_path="~/.ssh/id_rsa")
386
+ result = analyzer.analyze_repository("git@github.com:company/private-repo.git")
387
+ ```
388
+
389
+ #### Power Regression Detection
390
+
391
+ ```python
392
+ from greenmining.analyzers import PowerRegressionDetector
393
+
394
+ detector = PowerRegressionDetector(
395
+ test_command="pytest tests/ -x",
396
+ energy_backend="rapl",
397
+ threshold_percent=5.0,
398
+ iterations=5,
399
+ )
400
+
401
+ regressions = detector.detect(
402
+ repo_path="/path/to/repo",
403
+ baseline_commit="v1.0.0",
404
+ target_commit="HEAD",
405
+ )
406
+
407
+ for regression in regressions:
408
+ print(f"Commit {regression.sha[:8]}: +{regression.power_increase:.1f}%")
409
+ ```
410
+
411
+ #### Version Power Comparison
412
+
413
+ ```python
414
+ from greenmining.analyzers import VersionPowerAnalyzer
415
+
416
+ analyzer = VersionPowerAnalyzer(
417
+ test_command="pytest tests/",
418
+ energy_backend="rapl",
419
+ iterations=10,
420
+ warmup_iterations=2,
421
+ )
422
+
423
+ report = analyzer.analyze_versions(
424
+ repo_path="/path/to/repo",
425
+ versions=["v1.0", "v1.1", "v1.2", "v2.0"],
426
+ )
427
+
428
+ print(report.summary())
429
+ print(f"Trend: {report.trend}")
430
+ print(f"Most efficient: {report.most_efficient}")
431
+ ```
432
+
433
+ #### Metrics-to-Power Correlation
434
+
435
+ ```python
436
+ from greenmining.analyzers import MetricsPowerCorrelator
437
+
438
+ correlator = MetricsPowerCorrelator()
439
+ correlator.fit(
440
+ metrics=["complexity", "nloc", "code_churn"],
441
+ metrics_values={
442
+ "complexity": [10, 20, 30, 40],
443
+ "nloc": [100, 200, 300, 400],
444
+ "code_churn": [50, 100, 150, 200],
445
+ },
446
+ power_measurements=[5.0, 8.0, 12.0, 15.0],
447
+ )
448
+
449
+ print(f"Pearson: {correlator.pearson}")
450
+ print(f"Spearman: {correlator.spearman}")
451
+ print(f"Feature importance: {correlator.feature_importance}")
452
+ ```
453
+
454
+ #### Web Dashboard
455
+
456
+ ```python
457
+ from greenmining.dashboard import run_dashboard
458
+
459
+ # Launch interactive dashboard (requires pip install greenmining[dashboard])
460
+ run_dashboard(data_dir="./data", host="127.0.0.1", port=5000)
461
+ ```
462
+
463
+ #### Pipeline Batch Analysis
314
464
 
315
465
  ```python
316
466
  from greenmining.controllers.repository_controller import RepositoryController
@@ -531,17 +681,24 @@ config = Config(
531
681
 
532
682
  ### Core Capabilities
533
683
 
534
- - **Pattern Detection**: Automatically identifies 122 sustainability patterns across 15 categories
535
- - **Keyword Analysis**: Scans commit messages using 321 green software keywords
536
- - **Custom Repository Fetching**: Fetch repositories with custom search keywords (not limited to microservices)
537
- - **Repository Analysis**: Analyzes repositories from GitHub with flexible filtering
538
- - **Batch Processing**: Analyze hundreds of repositories and thousands of commits
539
- - **Multi-format Output**: Generates Markdown reports, CSV exports, and JSON data
540
- - **Statistical Analysis**: Calculates green-awareness metrics, pattern distribution, and trends
684
+ - **Pattern Detection**: 122 sustainability patterns across 15 categories from the GSF catalog
685
+ - **Keyword Analysis**: 321 green software detection keywords
686
+ - **Repository Fetching**: GraphQL API with date, star, and language filters
687
+ - **URL-Based Analysis**: Direct PyDriller analysis from GitHub URLs (HTTPS and SSH)
688
+ - **Batch Processing**: Parallel analysis of multiple repositories with configurable workers
689
+ - **Private Repository Support**: Authentication via SSH keys or GitHub tokens
690
+ - **Energy Measurement**: RAPL, CodeCarbon, and CPU Energy Meter backends
691
+ - **Carbon Footprint Reporting**: CO2 emissions with 20+ country profiles and cloud region support (AWS, GCP, Azure)
692
+ - **Power Regression Detection**: Identify commits that increased energy consumption
693
+ - **Metrics-to-Power Correlation**: Pearson and Spearman analysis between code metrics and power
694
+ - **Version Power Comparison**: Compare power consumption across software versions with trend detection
695
+ - **Method-Level Analysis**: Per-method complexity metrics via Lizard integration
696
+ - **Source Code Access**: Before/after source code for refactoring detection
697
+ - **Full Process Metrics**: All 8 PyDriller process metrics (ChangeSet, CodeChurn, CommitsCount, ContributorsCount, ContributorsExperience, HistoryComplexity, HunksCount, LinesCount)
698
+ - **Statistical Analysis**: Correlations, effect sizes, and temporal trends
699
+ - **Multi-format Output**: Markdown reports, CSV exports, JSON data
700
+ - **Web Dashboard**: Flask-based interactive visualization (`pip install greenmining[dashboard]`)
541
701
  - **Docker Support**: Pre-built images for containerized analysis
542
- - **Programmatic API**: Full Python API for custom workflows and integrations
543
- - **Clean Architecture**: Modular design with services layer (Fetcher, Extractor, Analyzer, Aggregator, Reports)
544
- - **Energy Measurement**: Real-time energy consumption tracking via RAPL (Linux) or CodeCarbon (cross-platform)
545
702
 
546
703
  ### Energy Measurement
547
704
 
@@ -553,38 +710,44 @@ greenmining includes built-in energy measurement capabilities for tracking the c
553
710
  |---------|----------|---------|--------------|
554
711
  | **RAPL** | Linux (Intel/AMD) | CPU/RAM energy (Joules) | `/sys/class/powercap/` access |
555
712
  | **CodeCarbon** | Cross-platform | Energy + Carbon emissions (gCO2) | `pip install codecarbon` |
713
+ | **CPU Meter** | All platforms | Estimated CPU energy (Joules) | Optional: `pip install psutil` |
714
+ | **Auto** | All platforms | Best available backend | Automatic detection |
556
715
 
557
716
  #### Python API
558
717
 
559
718
  ```python
560
- from greenmining.energy import RAPLEnergyMeter, CodeCarbonMeter
561
-
562
- # RAPL (Linux only)
563
- rapl = RAPLEnergyMeter()
564
- if rapl.is_available():
565
- rapl.start()
566
- # ... run analysis ...
567
- result = rapl.stop()
568
- print(f"Energy: {result.energy_joules:.2f} J")
569
-
570
- # CodeCarbon (cross-platform)
571
- cc = CodeCarbonMeter()
572
- if cc.is_available():
573
- cc.start()
574
- # ... run analysis ...
575
- result = cc.stop()
576
- print(f"Energy: {result.energy_joules:.2f} J")
577
- print(f"Carbon: {result.carbon_grams:.4f} gCO2")
719
+ from greenmining.energy import RAPLEnergyMeter, CPUEnergyMeter, get_energy_meter
720
+
721
+ # Auto-detect best backend
722
+ meter = get_energy_meter("auto")
723
+ meter.start()
724
+ # ... run analysis ...
725
+ result = meter.stop()
726
+ print(f"Energy: {result.joules:.2f} J")
727
+ print(f"Power: {result.watts_avg:.2f} W")
728
+
729
+ # Integrated energy tracking during analysis
730
+ from greenmining.services.local_repo_analyzer import LocalRepoAnalyzer
731
+
732
+ analyzer = LocalRepoAnalyzer(energy_tracking=True, energy_backend="auto")
733
+ result = analyzer.analyze_repository("https://github.com/pallets/flask")
734
+ print(f"Analysis energy: {result.energy_metrics['joules']:.2f} J")
578
735
  ```
579
736
 
580
- #### Experiment Results
737
+ #### Carbon Footprint Reporting
581
738
 
582
- CodeCarbon was verified with a real experiment:
583
- - **Repository**: flask (pallets/flask)
584
- - **Commits analyzed**: 10
585
- - **Energy measured**: 160.6 J
586
- - **Carbon emissions**: 0.0119 gCO2
587
- - **Duration**: 11.28 seconds
739
+ ```python
740
+ from greenmining.energy import CarbonReporter
741
+
742
+ reporter = CarbonReporter(
743
+ country_iso="USA",
744
+ cloud_provider="aws",
745
+ region="us-east-1",
746
+ )
747
+ report = reporter.generate_report(total_joules=3600.0)
748
+ print(f"CO2: {report.total_emissions_kg * 1000:.4f} grams")
749
+ print(f"Equivalent: {report.tree_months:.2f} tree-months to offset")
750
+ ```
588
751
 
589
752
  ### Pattern Database
590
753
 
@@ -687,8 +850,14 @@ ruff check greenmining/ tests/
687
850
  - PyGithub >= 2.1.1
688
851
  - PyDriller >= 2.5
689
852
  - pandas >= 2.2.0
690
- - click >= 8.1.7
691
- - codecarbon >= 2.0.0 (optional, for cross-platform energy measurement)
853
+
854
+ **Optional dependencies:**
855
+
856
+ ```bash
857
+ pip install greenmining[energy] # psutil, codecarbon (energy measurement)
858
+ pip install greenmining[dashboard] # flask (web dashboard)
859
+ pip install greenmining[dev] # pytest, black, ruff, mypy (development)
860
+ ```
692
861
 
693
862
  ## License
694
863
 
@@ -1,20 +1,27 @@
1
- greenmining/__init__.py,sha256=wlLxbv7hzKNy1yWAEZckcSpYkC1rYDIHU9bjQZHs9es,992
1
+ greenmining/__init__.py,sha256=C9NT6lUmL91LkE0eGUFPrMLvZJYpdhTNYePqZxn1fpg,2909
2
2
  greenmining/__main__.py,sha256=NYOVS7D4w2XDLn6SyXHXPKE5GrNGOeoWSTb_KazgK5c,590
3
3
  greenmining/__version__.py,sha256=xZc02a8bS3vUJlzh8k9RoxemB1irQmq_SpVVj6Cg5M0,62
4
- greenmining/config.py,sha256=00v1Ln8eZE0RxMrLxvonf8XOWqeRYaIme_iC1yDLR90,8228
4
+ greenmining/config.py,sha256=M4a7AwM1ErCmOY0n5Vmyoo9HPblSkTZ-HD3k2YHzs4A,8340
5
5
  greenmining/gsf_patterns.py,sha256=hnd9GuWB8GEflrusEib5hjvl8CD5TSbGcBtb0gfxFp4,54193
6
6
  greenmining/utils.py,sha256=dSFwQzQwbS8rYZSgwLIxM_geLqbldwqVOIXMqEg08Qs,5609
7
- greenmining/analyzers/__init__.py,sha256=VI22zb3TnhZrwEuBy0J3pIbqNVVZl1wx8NYRlhR6Wok,362
7
+ greenmining/analyzers/__init__.py,sha256=rTgpDfFE6za4QAHW59ncnS6TW02omn-TZMnYNVUIZp0,753
8
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
9
11
  greenmining/analyzers/qualitative_analyzer.py,sha256=RcjOMLj_DPH869ey9J0uI7JK_krCefMhNkPLOJUDFF8,15391
10
12
  greenmining/analyzers/statistical_analyzer.py,sha256=DzWAcCyw42Ig3FIxTwPPBikgt2uzMdktxklonOYfnOk,7166
11
13
  greenmining/analyzers/temporal_analyzer.py,sha256=JfTcAoI20oCFMehGrSRnDqhJTXI-RUbdCTMwDOTW9-g,14259
14
+ greenmining/analyzers/version_power_analyzer.py,sha256=2P6zOqBg-ButtIhF-4cutiwD2Q1geMY49VFUghHXXoI,8119
12
15
  greenmining/controllers/__init__.py,sha256=UiAT6zBvC1z_9cJWfzq1cLA0I4r9b2vURHipj8oDczI,180
13
16
  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
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
18
25
  greenmining/models/__init__.py,sha256=2hkB0quhMePvvA1AkYfj5uiF_HyGtXVxn0BU-5m_oSg,302
19
26
  greenmining/models/aggregated_stats.py,sha256=N-ZGcQO7IJ33Joa8luMVjtHhKYzNe48VW8hFqs9a5Jc,1016
20
27
  greenmining/models/analysis_result.py,sha256=YICTCEcrJxZ1R8Xaio3AZOjCGwMzC_62BMAL0J_XY1w,1509
@@ -22,16 +29,16 @@ greenmining/models/commit.py,sha256=mnRDWSiIyGtJeGXI8sav9hukWUyVFpoNe6GixRlZjY4,
22
29
  greenmining/models/repository.py,sha256=SKjS01onOptpMioumtAPZxKpKheHAeVXnXyvatl7CfM,2856
23
30
  greenmining/presenters/__init__.py,sha256=d1CMtqtUAHYHYNzigPyjtGOUtnH1drtUwf7-bFQq2B8,138
24
31
  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
32
+ greenmining/services/__init__.py,sha256=ZEMOVut0KRdume_vz58beSNps3YgeoGBXmUjEqNgIhc,690
33
+ greenmining/services/commit_extractor.py,sha256=Fz2WTWjIZ_vQhSfkJKnWpJnBpI2nm0KacA4qYAvCpSE,8451
27
34
  greenmining/services/data_aggregator.py,sha256=TsFT0oGOnnHk0QGZ1tT6ZhKGc5X1H1D1u7-7OpiPo7Y,19566
28
35
  greenmining/services/data_analyzer.py,sha256=f0nlJkPAclHHCzzTyQW5bjhYrgE0XXiR1x7_o3fJaDs,9732
29
36
  greenmining/services/github_fetcher.py,sha256=mUcmQevhdDRYX72O-M7Vi-s3y4ZwNyKewleti838cqU,8285
30
37
  greenmining/services/github_graphql_fetcher.py,sha256=p76vp5EgStzkmTcws__jb90za8m61toW0CBrwrm5Ew4,11972
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.5.dist-info/licenses/LICENSE,sha256=M7ma3JHGeiIZIs3ea0HTcFl_wLFPX2NZElUliYs4bCA,1083
34
- greenmining-1.0.5.dist-info/METADATA,sha256=UIp-sji0KZ4GOtLaZOsPjaT9Qb0uDfuzFSIpw-UEcjQ,24899
35
- greenmining-1.0.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
36
- greenmining-1.0.5.dist-info/top_level.txt,sha256=nreXgXxZIWI-42yQknQ0HXtUrFnzZ8N1ra4Mdy2KcsI,12
37
- greenmining-1.0.5.dist-info/RECORD,,
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.7.dist-info/licenses/LICENSE,sha256=M7ma3JHGeiIZIs3ea0HTcFl_wLFPX2NZElUliYs4bCA,1083
41
+ greenmining-1.0.7.dist-info/METADATA,sha256=p0Go_jSsrZ04Lvi0-I2HQY1ycWloEbD3agXZnioCFB4,30913
42
+ greenmining-1.0.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
+ greenmining-1.0.7.dist-info/top_level.txt,sha256=nreXgXxZIWI-42yQknQ0HXtUrFnzZ8N1ra4Mdy2KcsI,12
44
+ greenmining-1.0.7.dist-info/RECORD,,