isc-reporter 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 (36) hide show
  1. isc_reporter-0.1.0/LICENSE +21 -0
  2. isc_reporter-0.1.0/PKG-INFO +226 -0
  3. isc_reporter-0.1.0/README.md +190 -0
  4. isc_reporter-0.1.0/pyproject.toml +63 -0
  5. isc_reporter-0.1.0/setup.cfg +4 -0
  6. isc_reporter-0.1.0/src/isc_reporter/__init__.py +3 -0
  7. isc_reporter-0.1.0/src/isc_reporter/__main__.py +5 -0
  8. isc_reporter-0.1.0/src/isc_reporter/api.py +181 -0
  9. isc_reporter-0.1.0/src/isc_reporter/attribute_history.py +361 -0
  10. isc_reporter-0.1.0/src/isc_reporter/certification_reports.py +418 -0
  11. isc_reporter-0.1.0/src/isc_reporter/cli.py +351 -0
  12. isc_reporter-0.1.0/src/isc_reporter/client.py +135 -0
  13. isc_reporter-0.1.0/src/isc_reporter/csvio.py +149 -0
  14. isc_reporter-0.1.0/src/isc_reporter/dashboard.py +464 -0
  15. isc_reporter-0.1.0/src/isc_reporter/demo.py +349 -0
  16. isc_reporter-0.1.0/src/isc_reporter/errors.py +5 -0
  17. isc_reporter-0.1.0/src/isc_reporter/identity_profiles.py +533 -0
  18. isc_reporter-0.1.0/src/isc_reporter/logs.py +31 -0
  19. isc_reporter-0.1.0/src/isc_reporter/query.py +8 -0
  20. isc_reporter-0.1.0/src/isc_reporter/report_writers.py +316 -0
  21. isc_reporter-0.1.0/src/isc_reporter/reporting.py +462 -0
  22. isc_reporter-0.1.0/src/isc_reporter/search.py +102 -0
  23. isc_reporter-0.1.0/src/isc_reporter/source_migration.py +440 -0
  24. isc_reporter-0.1.0/src/isc_reporter.egg-info/PKG-INFO +226 -0
  25. isc_reporter-0.1.0/src/isc_reporter.egg-info/SOURCES.txt +34 -0
  26. isc_reporter-0.1.0/src/isc_reporter.egg-info/dependency_links.txt +1 -0
  27. isc_reporter-0.1.0/src/isc_reporter.egg-info/entry_points.txt +2 -0
  28. isc_reporter-0.1.0/src/isc_reporter.egg-info/requires.txt +9 -0
  29. isc_reporter-0.1.0/src/isc_reporter.egg-info/top_level.txt +1 -0
  30. isc_reporter-0.1.0/tests/test_attribute_history.py +193 -0
  31. isc_reporter-0.1.0/tests/test_certification_reports.py +198 -0
  32. isc_reporter-0.1.0/tests/test_core.py +102 -0
  33. isc_reporter-0.1.0/tests/test_demo.py +19 -0
  34. isc_reporter-0.1.0/tests/test_identity_profiles.py +146 -0
  35. isc_reporter-0.1.0/tests/test_reporting.py +186 -0
  36. isc_reporter-0.1.0/tests/test_source_migration.py +215 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ousmane N'Diaye
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,226 @@
1
+ Metadata-Version: 2.4
2
+ Name: isc-reporter
3
+ Version: 0.1.0
4
+ Summary: Excel dashboards and PDF reports for SailPoint Identity Security Cloud: search, certification campaigns, identity attribute history, identity profile mappings and source migrations.
5
+ Author: Ousmane N'Diaye
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/NDIAYE-baoussou/isc-reporter
8
+ Project-URL: Issues, https://github.com/NDIAYE-baoussou/isc-reporter/issues
9
+ Project-URL: Changelog, https://github.com/NDIAYE-baoussou/isc-reporter/blob/main/CHANGELOG.md
10
+ Keywords: sailpoint,identity-security-cloud,identitynow,iam,iga,reporting,excel,pdf,certification,audit
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: System Administrators
14
+ Classifier: Intended Audience :: Information Technology
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Security
22
+ Classifier: Topic :: System :: Systems Administration
23
+ Classifier: Topic :: Office/Business
24
+ Requires-Python: >=3.10
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: sailpoint<3,>=2.1
28
+ Requires-Dist: XlsxWriter>=3.1
29
+ Requires-Dist: reportlab>=4
30
+ Provides-Extra: dev
31
+ Requires-Dist: pytest>=8; extra == "dev"
32
+ Requires-Dist: ruff>=0.5; extra == "dev"
33
+ Requires-Dist: openpyxl>=3.1; extra == "dev"
34
+ Requires-Dist: build>=1; extra == "dev"
35
+ Dynamic: license-file
36
+
37
+ # isc-reporter
38
+
39
+ Excel dashboards and PDF reports for **SailPoint Identity Security Cloud (ISC)**, from the command line.
40
+
41
+ ![Certification campaign dashboard](docs/images/campaigns.png)
42
+
43
+ `isc-reporter` turns what ISC knows into reports people can read: workbooks with KPI tiles,
44
+ native Excel charts and filterable tables, and matching PDF files to send around.
45
+
46
+ | Command | What you get |
47
+ | --- | --- |
48
+ | `search` | Any search (identities, access profiles, roles, entitlements, events, account activities, workflows) with **one line per object**: an identity's roles, access profiles, entitlements and accounts are consolidated instead of repeated on many lines. |
49
+ | `campaigns` | Certification campaign dashboard: progress, approved / revoked / pending decisions by access type, reviewer workload, overdue certifications, and every reviewed item for audit evidence. |
50
+ | `changes` | Identity attribute changes **with old and new values** over a period (e.g. department and manager changes of the last 30 days), which ISC search cannot show. |
51
+ | `profiles` | How every identity attribute is built, profile by profile: source, account attribute, transforms, a plain-language explanation, and checks for likely mistakes. |
52
+ | `migration` | Impact analysis for replacing a source (typically a new HR system): impacted identity profiles, transforms and attribute mappings, before/after, and draft JSON for the new objects. |
53
+
54
+ **Read-only:** `isc-reporter` only reads from your tenant. It never creates, changes or deletes
55
+ anything; the migration analysis writes its drafts to local files for you to review.
56
+
57
+ > isc-reporter is a community project. It is not affiliated with, endorsed or supported by
58
+ > SailPoint Technologies. SailPoint and Identity Security Cloud are trademarks of SailPoint
59
+ > Technologies, Inc.
60
+
61
+ ## Install
62
+
63
+ Python 3.10 or later.
64
+
65
+ ```bash
66
+ pip install isc-reporter
67
+ ```
68
+
69
+ Or from a clone of this repository: `pip install .`
70
+
71
+ ## Try it without a tenant
72
+
73
+ ```bash
74
+ isc-reporter demo
75
+ ```
76
+
77
+ writes every report, built from fictional data, to `outputs/demo/`.
78
+
79
+ ## Connect to your tenant
80
+
81
+ Create a [personal access token](https://documentation.sailpoint.com/saas/help/common/api_keys.html)
82
+ for a user who can read what you want to report on, then either set environment variables:
83
+
84
+ ```bash
85
+ export SAIL_BASE_URL="https://<tenant>.api.identitynow.com" # Windows PowerShell: $env:SAIL_BASE_URL = "..."
86
+ export SAIL_CLIENT_ID="<client id>"
87
+ export SAIL_CLIENT_SECRET="<client secret>"
88
+ ```
89
+
90
+ or create a `config.json` in the folder you run from (or pass `--config path/to/file.json`):
91
+
92
+ ```json
93
+ {
94
+ "BaseURL": "https://<tenant>.api.identitynow.com",
95
+ "ClientId": "<client id>",
96
+ "ClientSecret": "<client secret>"
97
+ }
98
+ ```
99
+
100
+ The token needs read access to what each command uses: search (`sp:search:read`) for `search`
101
+ and `changes`, identity history (`idn:identity-history:read`) for `changes`, certification
102
+ campaigns and certifications for `campaigns`, identity profiles, transforms and identity
103
+ attributes for `profiles`, and sources for `migration`.
104
+
105
+ ## Reports
106
+
107
+ Every command writes to `outputs/` (change with `--output-dir`, or name the file with `-o`),
108
+ logs to `logs/`, and accepts `--format xlsx pdf` (plus `csv` where it makes sense).
109
+
110
+ ### Search reports
111
+
112
+ ![Identities report](docs/images/search.png)
113
+
114
+ ```bash
115
+ isc-reporter types # available report types
116
+ isc-reporter search identities
117
+ isc-reporter search identities -q "attributes.department:Finance" --expand access
118
+ isc-reporter search entitlements -q "privileged:true" --format xlsx csv
119
+ isc-reporter search events -q "status:FAILED AND created:[now-7d TO now]"
120
+ isc-reporter search identities --columns displayName,email,attributes.location --group-by attributes.location
121
+ ```
122
+
123
+ | Type | One line per | Consolidated into the line | `--expand` (one line per item) |
124
+ | --- | --- | --- | --- |
125
+ | `identities` | identity | roles, access profiles, entitlements, accounts (list + count) | `access`, `accounts`, `apps` |
126
+ | `access-profiles` | access profile | entitlements | `entitlements` |
127
+ | `roles` | role | access profiles, entitlements | `access-profiles` |
128
+ | `entitlements` | entitlement | | |
129
+ | `events` | event | | |
130
+ | `account-activities` | activity | account requests | `account-requests` |
131
+ | `workflows` | workflow execution | | |
132
+
133
+ The workbook has a *Summary* (key figures and a chart per breakdown), the *Data* as an Excel
134
+ table, a *Detail* sheet with `--expand`, and the *Query* used. Any other search index works too,
135
+ with columns chosen automatically or with `--columns`. Reports can be saved as JSON and shared:
136
+ see [`examples/reports/`](examples/reports) and `--definition`.
137
+
138
+ ### Certification campaigns
139
+
140
+ ```bash
141
+ isc-reporter campaigns # every campaign
142
+ isc-reporter campaigns --status ACTIVE
143
+ isc-reporter campaigns --since 2026-01-01 --items # with every reviewed access item
144
+ isc-reporter campaigns --campaign "Q3 Manager Certification" --format pdf
145
+ ```
146
+
147
+ Sheets: *Dashboard*, *Campaigns* (progress bars, revocation rate, days left), *Certifications*
148
+ (one per reviewer), *Reviewers* (workload, most pending first), with `--items` *Identities*
149
+ (access grouped by decision) and *Decisions* (every item with its reviewer comment), and
150
+ *Filters*. Overdue items are shown in red. Role composition campaigns are listed with their
151
+ progress but have no reviewer detail (their reviews are not identity certifications).
152
+
153
+ ### Identity attribute changes
154
+
155
+ ![Identity attribute changes](docs/images/changes.png)
156
+
157
+ ```bash
158
+ isc-reporter changes --attributes department,manager --days 30 --format xlsx pdf csv
159
+ isc-reporter changes --since 2026-10-01 -q "attributes.cloudLifecycleState:active"
160
+ isc-reporter changes --exclude someDailyAttribute
161
+ ```
162
+
163
+ ISC search does not keep previous attribute values, so this report finds the identities modified
164
+ in the period and reads their history. *By identity* gives one line per identity with
165
+ `Old <attribute>` / `New <attribute>` columns; *Changes* lists every change. Manager ids are
166
+ shown as names. Attributes that change on most days (typically computed from today's date by a
167
+ transform) are flagged, as they fire an attribute change event every day. One history call is
168
+ made per modified identity: narrow large tenants with `--query` or `--max-identities`.
169
+
170
+ ### Identity profile mappings
171
+
172
+ ![Identity profile mappings](docs/images/profiles.png)
173
+
174
+ ```bash
175
+ isc-reporter profiles
176
+ isc-reporter profiles --profile Employees --profile Contractors
177
+ isc-reporter profiles --from exports/ # offline, from exported JSON
178
+ ```
179
+
180
+ One sheet per profile with, for every identity attribute, the mapping kind, a plain-language
181
+ explanation (*"Value of 'hireDate' from HR System, converted by the transform 'Date to ISO8601'
182
+ (changes a date format)"*), sources, transforms and the definition. Also: a matrix comparing
183
+ profiles, attribute coverage, the transforms used, and checks: required or common attributes not
184
+ mapped, missing transforms, lifecycle state copied as is, identical mappings, other sources.
185
+ `--from` reads a profile, a list of profiles or a configuration export, with transforms found in
186
+ the same files.
187
+
188
+ ### Source migration analysis
189
+
190
+ ![Source migration](docs/images/migration.png)
191
+
192
+ ```bash
193
+ isc-reporter migration --old-source "HR System" --new-source "New HR"
194
+ # complete outputs/source-migration_<ts>/attribute-mapping.csv, then:
195
+ isc-reporter migration --old-source "HR System" --new-source "New HR" --attribute-map attribute-mapping.csv
196
+ ```
197
+
198
+ Finds the identity profiles authoritative on or reading the old source, the transforms reading
199
+ it and those calling them, matches each old account attribute to the new source (mapping file,
200
+ or same name in the new account schema), shows every mapping before and after, and writes draft
201
+ JSON for the new identity profiles and transforms. Transforms are copied with a suffix so both
202
+ sources can run in parallel (`--in-place` to update them instead). Lifecycle states, account
203
+ correlation, provisioning policies and workflows are listed as next steps, not analysed.
204
+
205
+ ## Privacy
206
+
207
+ Reports contain personal data (names, emails, access). The default `.gitignore` keeps
208
+ `outputs/`, `logs/`, spreadsheets, PDFs and `config.json` out of version control; handle the
209
+ reports under your organisation's data protection rules, and never attach real reports to
210
+ public issues.
211
+
212
+ ## Development
213
+
214
+ ```bash
215
+ python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
216
+ pip install -e ".[dev]"
217
+ pytest
218
+ ruff check src tests
219
+ ```
220
+
221
+ Tests need no tenant: the SDK is replaced by recording fakes and the real SDK models are used to
222
+ check what would be read. See [CONTRIBUTING.md](CONTRIBUTING.md).
223
+
224
+ ## License
225
+
226
+ [MIT](LICENSE)
@@ -0,0 +1,190 @@
1
+ # isc-reporter
2
+
3
+ Excel dashboards and PDF reports for **SailPoint Identity Security Cloud (ISC)**, from the command line.
4
+
5
+ ![Certification campaign dashboard](docs/images/campaigns.png)
6
+
7
+ `isc-reporter` turns what ISC knows into reports people can read: workbooks with KPI tiles,
8
+ native Excel charts and filterable tables, and matching PDF files to send around.
9
+
10
+ | Command | What you get |
11
+ | --- | --- |
12
+ | `search` | Any search (identities, access profiles, roles, entitlements, events, account activities, workflows) with **one line per object**: an identity's roles, access profiles, entitlements and accounts are consolidated instead of repeated on many lines. |
13
+ | `campaigns` | Certification campaign dashboard: progress, approved / revoked / pending decisions by access type, reviewer workload, overdue certifications, and every reviewed item for audit evidence. |
14
+ | `changes` | Identity attribute changes **with old and new values** over a period (e.g. department and manager changes of the last 30 days), which ISC search cannot show. |
15
+ | `profiles` | How every identity attribute is built, profile by profile: source, account attribute, transforms, a plain-language explanation, and checks for likely mistakes. |
16
+ | `migration` | Impact analysis for replacing a source (typically a new HR system): impacted identity profiles, transforms and attribute mappings, before/after, and draft JSON for the new objects. |
17
+
18
+ **Read-only:** `isc-reporter` only reads from your tenant. It never creates, changes or deletes
19
+ anything; the migration analysis writes its drafts to local files for you to review.
20
+
21
+ > isc-reporter is a community project. It is not affiliated with, endorsed or supported by
22
+ > SailPoint Technologies. SailPoint and Identity Security Cloud are trademarks of SailPoint
23
+ > Technologies, Inc.
24
+
25
+ ## Install
26
+
27
+ Python 3.10 or later.
28
+
29
+ ```bash
30
+ pip install isc-reporter
31
+ ```
32
+
33
+ Or from a clone of this repository: `pip install .`
34
+
35
+ ## Try it without a tenant
36
+
37
+ ```bash
38
+ isc-reporter demo
39
+ ```
40
+
41
+ writes every report, built from fictional data, to `outputs/demo/`.
42
+
43
+ ## Connect to your tenant
44
+
45
+ Create a [personal access token](https://documentation.sailpoint.com/saas/help/common/api_keys.html)
46
+ for a user who can read what you want to report on, then either set environment variables:
47
+
48
+ ```bash
49
+ export SAIL_BASE_URL="https://<tenant>.api.identitynow.com" # Windows PowerShell: $env:SAIL_BASE_URL = "..."
50
+ export SAIL_CLIENT_ID="<client id>"
51
+ export SAIL_CLIENT_SECRET="<client secret>"
52
+ ```
53
+
54
+ or create a `config.json` in the folder you run from (or pass `--config path/to/file.json`):
55
+
56
+ ```json
57
+ {
58
+ "BaseURL": "https://<tenant>.api.identitynow.com",
59
+ "ClientId": "<client id>",
60
+ "ClientSecret": "<client secret>"
61
+ }
62
+ ```
63
+
64
+ The token needs read access to what each command uses: search (`sp:search:read`) for `search`
65
+ and `changes`, identity history (`idn:identity-history:read`) for `changes`, certification
66
+ campaigns and certifications for `campaigns`, identity profiles, transforms and identity
67
+ attributes for `profiles`, and sources for `migration`.
68
+
69
+ ## Reports
70
+
71
+ Every command writes to `outputs/` (change with `--output-dir`, or name the file with `-o`),
72
+ logs to `logs/`, and accepts `--format xlsx pdf` (plus `csv` where it makes sense).
73
+
74
+ ### Search reports
75
+
76
+ ![Identities report](docs/images/search.png)
77
+
78
+ ```bash
79
+ isc-reporter types # available report types
80
+ isc-reporter search identities
81
+ isc-reporter search identities -q "attributes.department:Finance" --expand access
82
+ isc-reporter search entitlements -q "privileged:true" --format xlsx csv
83
+ isc-reporter search events -q "status:FAILED AND created:[now-7d TO now]"
84
+ isc-reporter search identities --columns displayName,email,attributes.location --group-by attributes.location
85
+ ```
86
+
87
+ | Type | One line per | Consolidated into the line | `--expand` (one line per item) |
88
+ | --- | --- | --- | --- |
89
+ | `identities` | identity | roles, access profiles, entitlements, accounts (list + count) | `access`, `accounts`, `apps` |
90
+ | `access-profiles` | access profile | entitlements | `entitlements` |
91
+ | `roles` | role | access profiles, entitlements | `access-profiles` |
92
+ | `entitlements` | entitlement | | |
93
+ | `events` | event | | |
94
+ | `account-activities` | activity | account requests | `account-requests` |
95
+ | `workflows` | workflow execution | | |
96
+
97
+ The workbook has a *Summary* (key figures and a chart per breakdown), the *Data* as an Excel
98
+ table, a *Detail* sheet with `--expand`, and the *Query* used. Any other search index works too,
99
+ with columns chosen automatically or with `--columns`. Reports can be saved as JSON and shared:
100
+ see [`examples/reports/`](examples/reports) and `--definition`.
101
+
102
+ ### Certification campaigns
103
+
104
+ ```bash
105
+ isc-reporter campaigns # every campaign
106
+ isc-reporter campaigns --status ACTIVE
107
+ isc-reporter campaigns --since 2026-01-01 --items # with every reviewed access item
108
+ isc-reporter campaigns --campaign "Q3 Manager Certification" --format pdf
109
+ ```
110
+
111
+ Sheets: *Dashboard*, *Campaigns* (progress bars, revocation rate, days left), *Certifications*
112
+ (one per reviewer), *Reviewers* (workload, most pending first), with `--items` *Identities*
113
+ (access grouped by decision) and *Decisions* (every item with its reviewer comment), and
114
+ *Filters*. Overdue items are shown in red. Role composition campaigns are listed with their
115
+ progress but have no reviewer detail (their reviews are not identity certifications).
116
+
117
+ ### Identity attribute changes
118
+
119
+ ![Identity attribute changes](docs/images/changes.png)
120
+
121
+ ```bash
122
+ isc-reporter changes --attributes department,manager --days 30 --format xlsx pdf csv
123
+ isc-reporter changes --since 2026-10-01 -q "attributes.cloudLifecycleState:active"
124
+ isc-reporter changes --exclude someDailyAttribute
125
+ ```
126
+
127
+ ISC search does not keep previous attribute values, so this report finds the identities modified
128
+ in the period and reads their history. *By identity* gives one line per identity with
129
+ `Old <attribute>` / `New <attribute>` columns; *Changes* lists every change. Manager ids are
130
+ shown as names. Attributes that change on most days (typically computed from today's date by a
131
+ transform) are flagged, as they fire an attribute change event every day. One history call is
132
+ made per modified identity: narrow large tenants with `--query` or `--max-identities`.
133
+
134
+ ### Identity profile mappings
135
+
136
+ ![Identity profile mappings](docs/images/profiles.png)
137
+
138
+ ```bash
139
+ isc-reporter profiles
140
+ isc-reporter profiles --profile Employees --profile Contractors
141
+ isc-reporter profiles --from exports/ # offline, from exported JSON
142
+ ```
143
+
144
+ One sheet per profile with, for every identity attribute, the mapping kind, a plain-language
145
+ explanation (*"Value of 'hireDate' from HR System, converted by the transform 'Date to ISO8601'
146
+ (changes a date format)"*), sources, transforms and the definition. Also: a matrix comparing
147
+ profiles, attribute coverage, the transforms used, and checks: required or common attributes not
148
+ mapped, missing transforms, lifecycle state copied as is, identical mappings, other sources.
149
+ `--from` reads a profile, a list of profiles or a configuration export, with transforms found in
150
+ the same files.
151
+
152
+ ### Source migration analysis
153
+
154
+ ![Source migration](docs/images/migration.png)
155
+
156
+ ```bash
157
+ isc-reporter migration --old-source "HR System" --new-source "New HR"
158
+ # complete outputs/source-migration_<ts>/attribute-mapping.csv, then:
159
+ isc-reporter migration --old-source "HR System" --new-source "New HR" --attribute-map attribute-mapping.csv
160
+ ```
161
+
162
+ Finds the identity profiles authoritative on or reading the old source, the transforms reading
163
+ it and those calling them, matches each old account attribute to the new source (mapping file,
164
+ or same name in the new account schema), shows every mapping before and after, and writes draft
165
+ JSON for the new identity profiles and transforms. Transforms are copied with a suffix so both
166
+ sources can run in parallel (`--in-place` to update them instead). Lifecycle states, account
167
+ correlation, provisioning policies and workflows are listed as next steps, not analysed.
168
+
169
+ ## Privacy
170
+
171
+ Reports contain personal data (names, emails, access). The default `.gitignore` keeps
172
+ `outputs/`, `logs/`, spreadsheets, PDFs and `config.json` out of version control; handle the
173
+ reports under your organisation's data protection rules, and never attach real reports to
174
+ public issues.
175
+
176
+ ## Development
177
+
178
+ ```bash
179
+ python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
180
+ pip install -e ".[dev]"
181
+ pytest
182
+ ruff check src tests
183
+ ```
184
+
185
+ Tests need no tenant: the SDK is replaced by recording fakes and the real SDK models are used to
186
+ check what would be read. See [CONTRIBUTING.md](CONTRIBUTING.md).
187
+
188
+ ## License
189
+
190
+ [MIT](LICENSE)
@@ -0,0 +1,63 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "isc-reporter"
7
+ dynamic = ["version"]
8
+ description = "Excel dashboards and PDF reports for SailPoint Identity Security Cloud: search, certification campaigns, identity attribute history, identity profile mappings and source migrations."
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ license-files = ["LICENSE"]
12
+ requires-python = ">=3.10"
13
+ authors = [{ name = "Ousmane N'Diaye" }]
14
+ keywords = ["sailpoint", "identity-security-cloud", "identitynow", "iam", "iga", "reporting",
15
+ "excel", "pdf", "certification", "audit"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Environment :: Console",
19
+ "Intended Audience :: System Administrators",
20
+ "Intended Audience :: Information Technology",
21
+ "Operating System :: OS Independent",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.10",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Topic :: Security",
28
+ "Topic :: System :: Systems Administration",
29
+ "Topic :: Office/Business",
30
+ ]
31
+ dependencies = [
32
+ "sailpoint>=2.1,<3",
33
+ "XlsxWriter>=3.1",
34
+ "reportlab>=4",
35
+ ]
36
+
37
+ [project.optional-dependencies]
38
+ dev = ["pytest>=8", "ruff>=0.5", "openpyxl>=3.1", "build>=1"]
39
+
40
+ [project.scripts]
41
+ isc-reporter = "isc_reporter.cli:main"
42
+
43
+ [project.urls]
44
+ Homepage = "https://github.com/NDIAYE-baoussou/isc-reporter"
45
+ Issues = "https://github.com/NDIAYE-baoussou/isc-reporter/issues"
46
+ Changelog = "https://github.com/NDIAYE-baoussou/isc-reporter/blob/main/CHANGELOG.md"
47
+
48
+ [tool.setuptools.dynamic]
49
+ version = { attr = "isc_reporter.__version__" }
50
+
51
+ [tool.setuptools.packages.find]
52
+ where = ["src"]
53
+
54
+ [tool.pytest.ini_options]
55
+ testpaths = ["tests"]
56
+
57
+ [tool.ruff]
58
+ line-length = 110
59
+ target-version = "py310"
60
+ src = ["src", "tests"]
61
+
62
+ [tool.ruff.lint]
63
+ select = ["E", "F", "W", "I", "B", "UP"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ """isc-reporter: reports and analysis for SailPoint Identity Security Cloud."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,5 @@
1
+ import sys
2
+
3
+ from isc_reporter.cli import main
4
+
5
+ sys.exit(main())