aa-fitting-mastery 0.1.0__tar.gz

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.
Files changed (100) hide show
  1. aa_fitting_mastery-0.1.0/.coveragerc +18 -0
  2. aa_fitting_mastery-0.1.0/.gitattributes +2 -0
  3. aa_fitting_mastery-0.1.0/.github/workflows/main.yml +55 -0
  4. aa_fitting_mastery-0.1.0/.github/workflows/publish.yml +33 -0
  5. aa_fitting_mastery-0.1.0/.gitignore +181 -0
  6. aa_fitting_mastery-0.1.0/.readthedocs.yml +19 -0
  7. aa_fitting_mastery-0.1.0/AGENTS.md +41 -0
  8. aa_fitting_mastery-0.1.0/CHANGELOG.md +25 -0
  9. aa_fitting_mastery-0.1.0/LICENSE +21 -0
  10. aa_fitting_mastery-0.1.0/Makefile +30 -0
  11. aa_fitting_mastery-0.1.0/PKG-INFO +304 -0
  12. aa_fitting_mastery-0.1.0/README.md +269 -0
  13. aa_fitting_mastery-0.1.0/docs/edit-fitting-skill-plans.png +0 -0
  14. aa_fitting_mastery-0.1.0/docs/view-character-progress.png +0 -0
  15. aa_fitting_mastery-0.1.0/mastery/__init__.py +7 -0
  16. aa_fitting_mastery-0.1.0/mastery/app_settings.py +8 -0
  17. aa_fitting_mastery-0.1.0/mastery/apps.py +7 -0
  18. aa_fitting_mastery-0.1.0/mastery/auth_hooks.py +29 -0
  19. aa_fitting_mastery-0.1.0/mastery/management/commands/__init__.py +0 -0
  20. aa_fitting_mastery-0.1.0/mastery/management/commands/import_sde_masteries.py +69 -0
  21. aa_fitting_mastery-0.1.0/mastery/migrations/0001_initial.py +133 -0
  22. aa_fitting_mastery-0.1.0/mastery/migrations/0002_doctrineskillsetgroupmap_default_mastery_level_and_more.py +23 -0
  23. aa_fitting_mastery-0.1.0/mastery/migrations/0003_make_fitting_mastery_override_nullable.py +25 -0
  24. aa_fitting_mastery-0.1.0/mastery/migrations/0004_fittingskillcontrol_recommended_level_override.py +20 -0
  25. aa_fitting_mastery-0.1.0/mastery/migrations/0005_fittingskillsetmap_last_synced_at.py +17 -0
  26. aa_fitting_mastery-0.1.0/mastery/migrations/0006_fittingskillcontrol_is_manual.py +17 -0
  27. aa_fitting_mastery-0.1.0/mastery/migrations/0007_general.py +26 -0
  28. aa_fitting_mastery-0.1.0/mastery/migrations/0008_summary_audience_groups.py +56 -0
  29. aa_fitting_mastery-0.1.0/mastery/migrations/__init__.py +0 -0
  30. aa_fitting_mastery-0.1.0/mastery/models/__init__.py +11 -0
  31. aa_fitting_mastery-0.1.0/mastery/models/certificate_skill.py +20 -0
  32. aa_fitting_mastery-0.1.0/mastery/models/doctrine_skill_snapshot.py +68 -0
  33. aa_fitting_mastery-0.1.0/mastery/models/doctrine_skillsetgroup_map.py +29 -0
  34. aa_fitting_mastery-0.1.0/mastery/models/fitting_skill_control.py +58 -0
  35. aa_fitting_mastery-0.1.0/mastery/models/fitting_skill_override.py +27 -0
  36. aa_fitting_mastery-0.1.0/mastery/models/fitting_skillset_map.py +47 -0
  37. aa_fitting_mastery-0.1.0/mastery/models/general.py +20 -0
  38. aa_fitting_mastery-0.1.0/mastery/models/sde_version.py +11 -0
  39. aa_fitting_mastery-0.1.0/mastery/models/ship_mastery.py +11 -0
  40. aa_fitting_mastery-0.1.0/mastery/models/ship_mastery_certificate.py +16 -0
  41. aa_fitting_mastery-0.1.0/mastery/models/summary_group.py +51 -0
  42. aa_fitting_mastery-0.1.0/mastery/services/__init__.py +0 -0
  43. aa_fitting_mastery-0.1.0/mastery/services/doctrine/__init__.py +1 -0
  44. aa_fitting_mastery-0.1.0/mastery/services/doctrine/doctrine_map_service.py +47 -0
  45. aa_fitting_mastery-0.1.0/mastery/services/doctrine/doctrine_skill_service.py +164 -0
  46. aa_fitting_mastery-0.1.0/mastery/services/fittings/__init__.py +2 -0
  47. aa_fitting_mastery-0.1.0/mastery/services/fittings/fitting_map_service.py +33 -0
  48. aa_fitting_mastery-0.1.0/mastery/services/fittings/skill_extractor.py +135 -0
  49. aa_fitting_mastery-0.1.0/mastery/services/pilots/__init__.py +5 -0
  50. aa_fitting_mastery-0.1.0/mastery/services/pilots/pilot_access_service.py +58 -0
  51. aa_fitting_mastery-0.1.0/mastery/services/pilots/pilot_progress_service.py +1025 -0
  52. aa_fitting_mastery-0.1.0/mastery/services/sde/__init__.py +3 -0
  53. aa_fitting_mastery-0.1.0/mastery/services/sde/importer.py +105 -0
  54. aa_fitting_mastery-0.1.0/mastery/services/sde/mastery_service.py +47 -0
  55. aa_fitting_mastery-0.1.0/mastery/services/sde/version_service.py +37 -0
  56. aa_fitting_mastery-0.1.0/mastery/services/skills/__init__.py +3 -0
  57. aa_fitting_mastery-0.1.0/mastery/services/skills/skill_control_service.py +114 -0
  58. aa_fitting_mastery-0.1.0/mastery/services/skills/skillcheck_service.py +58 -0
  59. aa_fitting_mastery-0.1.0/mastery/services/skills/suggestion_service.py +165 -0
  60. aa_fitting_mastery-0.1.0/mastery/tasks.py +29 -0
  61. aa_fitting_mastery-0.1.0/mastery/templates/mastery/base.html +48 -0
  62. aa_fitting_mastery-0.1.0/mastery/templates/mastery/doctrine_detail.html +172 -0
  63. aa_fitting_mastery-0.1.0/mastery/templates/mastery/doctrine_list.html +116 -0
  64. aa_fitting_mastery-0.1.0/mastery/templates/mastery/fitting_skills.html +315 -0
  65. aa_fitting_mastery-0.1.0/mastery/templates/mastery/index.html +313 -0
  66. aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/ajax_messages.html +7 -0
  67. aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/fitting_skill_preview.html +101 -0
  68. aa_fitting_mastery-0.1.0/mastery/templates/mastery/partials/fitting_skills_editor.html +356 -0
  69. aa_fitting_mastery-0.1.0/mastery/templates/mastery/pilot_fitting_detail.html +747 -0
  70. aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_doctrine_detail.html +92 -0
  71. aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_fitting_detail.html +199 -0
  72. aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_list_view.html +126 -0
  73. aa_fitting_mastery-0.1.0/mastery/templates/mastery/summary_settings.html +200 -0
  74. aa_fitting_mastery-0.1.0/mastery/templatetags/__init__.py +0 -0
  75. aa_fitting_mastery-0.1.0/mastery/templatetags/skill_render.py +63 -0
  76. aa_fitting_mastery-0.1.0/mastery/tests/__init__.py +0 -0
  77. aa_fitting_mastery-0.1.0/mastery/tests/test_auth_hooks.py +27 -0
  78. aa_fitting_mastery-0.1.0/mastery/tests/test_pilot_progress_service.py +167 -0
  79. aa_fitting_mastery-0.1.0/mastery/tests/test_services.py +616 -0
  80. aa_fitting_mastery-0.1.0/mastery/tests/test_tasks.py +55 -0
  81. aa_fitting_mastery-0.1.0/mastery/tests/test_views.py +1334 -0
  82. aa_fitting_mastery-0.1.0/mastery/urls.py +67 -0
  83. aa_fitting_mastery-0.1.0/mastery/views/__init__.py +72 -0
  84. aa_fitting_mastery-0.1.0/mastery/views/common.py +569 -0
  85. aa_fitting_mastery-0.1.0/mastery/views/deps.py +34 -0
  86. aa_fitting_mastery-0.1.0/mastery/views/doctrine.py +150 -0
  87. aa_fitting_mastery-0.1.0/mastery/views/fitting.py +499 -0
  88. aa_fitting_mastery-0.1.0/mastery/views/pilot.py +319 -0
  89. aa_fitting_mastery-0.1.0/mastery/views/summary.py +277 -0
  90. aa_fitting_mastery-0.1.0/mastery/views/summary_helpers.py +526 -0
  91. aa_fitting_mastery-0.1.0/pyproject.toml +96 -0
  92. aa_fitting_mastery-0.1.0/runtests.py +22 -0
  93. aa_fitting_mastery-0.1.0/testauth/__init__.py +1 -0
  94. aa_fitting_mastery-0.1.0/testauth/celery.py +42 -0
  95. aa_fitting_mastery-0.1.0/testauth/settings_aa4/__init__.py +0 -0
  96. aa_fitting_mastery-0.1.0/testauth/settings_aa4/base.py +319 -0
  97. aa_fitting_mastery-0.1.0/testauth/settings_aa4/local.py +91 -0
  98. aa_fitting_mastery-0.1.0/testauth/urls.py +12 -0
  99. aa_fitting_mastery-0.1.0/testauth/wsgi.py +14 -0
  100. aa_fitting_mastery-0.1.0/tox.ini +35 -0
@@ -0,0 +1,18 @@
1
+ [run]
2
+ branch = True
3
+ source = mastery
4
+
5
+ [report]
6
+ exclude_lines =
7
+ if self.debug:
8
+ pragma: no cover
9
+ raise NotImplementedError
10
+ if __name__ == .__main__.:
11
+ ignore_errors = True
12
+ omit =
13
+ setup.py
14
+ tests.py
15
+ */test_*.py
16
+ */tests/*
17
+ */migrations/*
18
+ doc/*
@@ -0,0 +1,2 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
@@ -0,0 +1,55 @@
1
+ # This is a basic workflow to help you get started with Actions
2
+ name: CI
3
+
4
+ # Controls when the workflow will run
5
+ on:
6
+ push:
7
+ branches:
8
+ - "**"
9
+ tags-ignore:
10
+ - "**"
11
+ pull_request:
12
+ branches:
13
+ - "**"
14
+ tags-ignore:
15
+ - "**"
16
+ # Allows you to run this workflow manually from the Actions tab
17
+ workflow_dispatch:
18
+
19
+ # A workflow run is made up of one or more jobs that can run sequentially or in parallel
20
+ jobs:
21
+ test:
22
+ runs-on: ubuntu-latest
23
+ strategy:
24
+ matrix:
25
+ python-version: ["3.10", "3.11", "3.12"]
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+
29
+ - uses: shogo82148/actions-setup-redis@v1
30
+ with:
31
+ redis-version: "latest"
32
+
33
+ - run: redis-cli ping
34
+
35
+ - uses: actions/setup-python@v5
36
+ with:
37
+ python-version: ${{ matrix.python-version }}
38
+
39
+ - name: install dependencies
40
+ run: make dev
41
+
42
+ - name: Run Tests
43
+ run: make test
44
+
45
+ - name: Upload test coverage
46
+ if: ${{ !env.ACT }}
47
+ uses: actions/upload-artifact@v4
48
+ with:
49
+ # Artifact name
50
+ name: Python${{ matrix.python-version }} Test Coverage
51
+ # A file, directory or wildcard pattern that describes what to upload
52
+ path: htmlcov/
53
+
54
+ - name: Build Projects
55
+ run: make package
@@ -0,0 +1,33 @@
1
+ name: Deploy to PyPi
2
+
3
+ on:
4
+ release:
5
+ types: [released, prereleased]
6
+ # Allows you to run this workflow manually from the Actions tab
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ release:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - uses: actions/setup-python@v4
16
+ with:
17
+ python-version: "3.11"
18
+
19
+ - name: install dependencies
20
+ run: make dev
21
+
22
+ - name: clean up
23
+ run: make clean
24
+
25
+ - name: Build Python
26
+ run: make package
27
+
28
+ - name: Upload Package
29
+ if: ${{ !env.ACT }} # Don't run in a local test environment
30
+ env:
31
+ TWINE_USERNAME: __token__
32
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
33
+ run: make deploy
@@ -0,0 +1,181 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ #pdm.lock
113
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
114
+ # in version control.
115
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
116
+ .pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
121
+ __pypackages__/
122
+
123
+ # Celery stuff
124
+ celerybeat-schedule
125
+ celerybeat.pid
126
+
127
+ # SageMath parsed files
128
+ *.sage.py
129
+
130
+ # Environments
131
+ .env
132
+ .venv
133
+ env/
134
+ venv/
135
+ ENV/
136
+ env.bak/
137
+ venv.bak/
138
+
139
+ # Spyder project settings
140
+ .spyderproject
141
+ .spyproject
142
+
143
+ # Rope project settings
144
+ .ropeproject
145
+
146
+ # mkdocs documentation
147
+ /site
148
+
149
+ # mypy
150
+ .mypy_cache/
151
+ .dmypy.json
152
+ dmypy.json
153
+
154
+ # Pyre type checker
155
+ .pyre/
156
+
157
+ # pytype static type analyzer
158
+ .pytype/
159
+
160
+ # Cython debug symbols
161
+ cython_debug/
162
+
163
+ # PyCharm
164
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
165
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
166
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
167
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
168
+ #.idea/
169
+
170
+ # Ruff stuff:
171
+ .ruff_cache/
172
+
173
+ # PyPI configuration file
174
+ .pypirc
175
+
176
+ # Cursor
177
+ # Cursor is an AI-powered code editor.`.cursorignore` specifies files/directories to
178
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
179
+ # refer to https://docs.cursor.com/context/ignore-files
180
+ .cursorignore
181
+ .cursorindexingignore
@@ -0,0 +1,19 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: "ubuntu-22.04"
5
+ apt_packages:
6
+ - redis
7
+ tools:
8
+ python: "3.11"
9
+
10
+ # Build from the docs/ directory with Sphinx
11
+ sphinx:
12
+ configuration: docs/conf.py
13
+
14
+ # Explicitly set the version of Python and its requirements
15
+ python:
16
+ install:
17
+ - method: pip
18
+ path: .
19
+ - requirements: docs/requirements.txt
@@ -0,0 +1,41 @@
1
+ # AGENTS.md
2
+
3
+ ## Scope and mental model
4
+ - This file is for work in `working/aa-fitting-mastery/` only. Treat other plugins as external dependencies unless a task explicitly crosses repo boundaries.
5
+ - `aa-fitting-mastery` is a Django app for Alliance Auth that bridges `fittings` and `memberaudit`: it turns doctrines/fittings into `SkillSetGroup` + `SkillSet` data, then augments them with EVE SDE masteries/certificates.
6
+ - The core flow is: doctrine -> doctrine map -> fitting map -> extracted required skills -> recommended mastery skills -> optional blacklist/suggestions.
7
+
8
+ ## Read these files first
9
+ - Start with `README.md`, `pyproject.toml`, and `mastery/apps.py` for package identity and hard dependencies.
10
+ - Read `mastery/urls.py`, `mastery/views.py`, and `mastery/api.py` to see the actual UI/API surface.
11
+ - For the main business logic, read `mastery/services/doctrine/doctrine_map_service.py` and `mastery/services/doctrine/doctrine_skill_service.py`.
12
+ - Then read `mastery/services/fittings/skill_extractor.py`, `mastery/services/sde/mastery_service.py`, and `mastery/services/skills/{skill_control_service.py,suggestion_service.py}`.
13
+ - Use `mastery/models/` and `mastery/migrations/` as the source of truth for persistence shape.
14
+
15
+ ## Architecture and data flow you should preserve
16
+ - `DoctrineMapService.create_doctrine_map()` creates one `memberaudit.SkillSetGroup` per `fittings.Doctrine`, stores it in `DoctrineSkillSetGroupMap`, then immediately calls `sync()`.
17
+ - `FittingMapService.create_fitting_map()` creates one `memberaudit.SkillSet` per `fittings.Fitting`, attaches it to the doctrine’s skillset group, and stores the mapping in `FittingSkillsetMap`.
18
+ - `DoctrineSkillService.generate_for_doctrine()` is the core orchestrator: it reads doctrine fittings, extracts hard requirements from `eve_sde.TypeDogma`, merges them with mastery recommendations from imported SDE data, wipes existing `skillset.skills`, bulk-creates new `SkillSetSkill` rows, then records suggestions in `FittingSkillControl`.
19
+ - Blacklist state is stored in `FittingSkillControl.is_blacklisted`; suggestion metadata also lives in `FittingSkillControl`, not in transient view state.
20
+ - `DoctrineSkillSnapshot` exists as persisted snapshot data for doctrine/fitting/skill combinations; inspect current usage before changing or deleting it.
21
+
22
+ ## Project-specific conventions
23
+ - Views in `mastery/views.py` are thin and instantiate service objects at module scope. Preserve that pattern unless you have a strong reason to change initialization behavior.
24
+ - This plugin uses service classes, not fat models, for most business logic. New behavior usually belongs under `mastery/services/`, not directly in views/API handlers.
25
+ - Data creation is intentionally idempotent-ish: `filter().first()`, `create()`, and `update_or_create()` are used heavily to avoid duplicate maps/control rows.
26
+ - `mastery/api.py` is minimal right now: `toggle_blacklist` is the real mutating endpoint; `update_skill_level` currently parses JSON and returns `{"status": "ok"}` without persistence.
27
+ - `auth_hooks.py` is the navigation/URL integration point: menu entry uses `mastery.basic_access`, while management screens require `mastery.manage_fittings`.
28
+ - `character_portrait_url` does not reliably support arbitrary sizes (e.g. 24). Use supported portrait sizes in templates (this plugin standardises on `32`).
29
+
30
+ ## External dependencies and integration points
31
+ - Hard package dependencies are declared in `pyproject.toml`: `allianceauth`, `aa-memberaudit`, `fittings`, `allianceauth-app-utils`, `django-esi`, and `django-eveonline-sde`.
32
+ - `skill_extractor.py` depends on `eve_sde` dogma attributes for skill requirements; changes there can alter every generated skillset.
33
+ - SDE mastery recommendations are imported from CCP static data by `mastery/services/sde/importer.py` and exposed through `MasteryService.get_ship_skills()`.
34
+ - If a task touches installation/runtime integration, check `working/myauth/myauth/settings/local.py`: this workspace already enables `'mastery'` and schedules `mastery.tasks.import_sde_masteries` under `CELERYBEAT_SCHEDULE['update_sde_masteries']`.
35
+
36
+ ## Testing and developer workflow
37
+ - `Makefile` assumes an active virtualenv; `make dev` installs editable mode and `make test` runs `tox`.
38
+ - `tox.ini` expects `testauth.settings_aa4.local` and `runtests.py`; keep those files in sync when changing test setup.
39
+ - For real validation, prefer focused checks in the integrated AA instance or targeted Django shell/management-command smoke tests over guessing from `tox.ini`.
40
+ - If you change SDE import logic, validate both the management command `python manage.py import_sde_masteries --dry-run` and the Celery task path in `mastery/tasks.py`.
41
+
@@ -0,0 +1,25 @@
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/)
6
+ and this project adheres to [Semantic Versioning](http://semver.org/).
7
+
8
+ ## [Unreleased] - yyyy-mm-dd
9
+
10
+ ### Added
11
+
12
+ - Nothing yet.
13
+
14
+ ## [0.1.0] - 2026-04-15
15
+
16
+ ### Added
17
+
18
+ - Initial public release of the Fitting Mastery plugin for Alliance Auth.
19
+ - Doctrine skill plan generation based on `fittings` doctrines and fittings.
20
+ - Mastery recommendation merge using imported EVE SDE certificates/masteries.
21
+ - Pilot-facing readiness views and skill plan export helpers.
22
+ - Summary/audience views to review readiness across selected member scopes.
23
+ - Skill control tooling: blacklist, manual skill overrides, and recommendation overrides.
24
+ - SDE import tooling with management command (`import_sde_masteries`) and Celery update task (`update_sde_masteries`).
25
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jay's
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,30 @@
1
+ .PHONY: help clean dev package test deploy
2
+
3
+ help:
4
+ @echo "This project assumes that an active Python virtualenv is present."
5
+ @echo "The following make targets are available:"
6
+ @echo " dev install all deps for dev environment"
7
+ @echo " clean remove all old packages"
8
+ @echo " test run tests"
9
+ @echo " package build the python package"
10
+ @echo " deploy Configure the PyPi config file in CI"
11
+
12
+ clean:
13
+ rm -rf dist/*
14
+
15
+ dev:
16
+ pip install --upgrade pip
17
+ pip install wheel -U
18
+ pip install tox -U
19
+ pip install -e .
20
+
21
+ test:
22
+ tox
23
+
24
+ deploy:
25
+ pip install twine
26
+ twine upload dist/*
27
+
28
+ package:
29
+ pip install flit
30
+ flit build