paramsx 2.2.1__tar.gz → 2.2.2__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.
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.2.2
4
+
5
+ Un renombrado de la configuración, sin cambios de comportamiento. **Los nombres antiguos
6
+ se siguen aceptando**, así que no tienes que tocar tu fichero para actualizar.
7
+
8
+ ### Cambiado
9
+
10
+ - **Un solo nombre para el concepto: `perfiles` / `perfil`.** El mismo concepto se llamaba de tres formas distintas: el diccionario era `naming`, la clave de cada entrada de `parameter_list` era `convencion` y la documentación decía "perfil". Explicárselo a alguien obligaba a traducir dos veces. Ahora:
11
+
12
+ | Antes | Ahora |
13
+ |---|---|
14
+ | `naming = {...}` | `perfiles = {...}` |
15
+ | `{"path": "/rds", "convencion": "min"}` | `{"path": "/rds", "perfil": "min"}` |
16
+ | `convencion_nuevos = "min"` | `perfil_nuevos = "min"` |
17
+
18
+ - `paramsx configure` te dice qué nombres antiguos usas y cómo se llaman ahora, incluidas las entradas de `parameter_list`. Los viejos (`naming`, `convencion`, `convencion_nuevos` y el `abac` de la 2.0) se traducen al cargar, así que dentro del programa solo existe el nombre nuevo.
19
+
3
20
  ## 2.2.1
4
21
 
5
22
  Solo comandos de terminal y documentación: no cambia nada de la lectura, la carga ni la
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramsx
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Librería para gestionar y respaldar parámetros de AWS SSM de manera sencilla y eficiente.
5
5
  Home-page: https://github.com/pistatxos/paramsx
6
6
  Author: Mariox
@@ -24,7 +24,7 @@ ParamsX es una herramienta diseñada para gestionar y organizar parámetros de A
24
24
 
25
25
  ## ⚠ Breaking change en la versión 2.0.0
26
26
 
27
- Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario con su convención de naming. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
27
+ Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario que declara su perfil. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
28
28
 
29
29
  ### Estructura Recomendada
30
30
  La convención de naming es de 5 niveles, donde los últimos segmentos son opcionales según el caso:
@@ -97,10 +97,10 @@ Esto te permitirá mantener respaldos seguros o realizar migraciones/reorganizac
97
97
 
98
98
  4. Crear nuevo parámetro
99
99
  - Crea un parámetro desde cero sin salir de la herramienta. Te pedirá, en este orden:
100
- - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil de naming se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
100
+ - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
101
101
  - El valor: texto plano o JSON en una línea (por ejemplo `{"host": "x", "user": "y", "pass": "z"}`), que se valida antes de continuar.
102
102
  - Las tags obligatorias, si tienes `tags_activas = True`.
103
- - El perfil que se usa es el que declares en `convencion_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
103
+ - El perfil que se usa es el que declares en `perfil_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
104
104
  - Antes de subirlo verás una pantalla de confirmación con la ruta, el valor y las tags. El parámetro se crea con `Overwrite=False`, así que nunca machaca uno existente.
105
105
  - Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
106
106
 
@@ -135,7 +135,7 @@ Ejemplo del contenido de paramsx_config.py:
135
135
  ```python
136
136
  ## Configuraciones ParamsX
137
137
 
138
- # --- Perfiles de naming -------------------------------------------------------------
138
+ # --- Perfiles -------------------------------------------------------------
139
139
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
140
140
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
141
141
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -177,7 +177,7 @@ Ejemplo del contenido de paramsx_config.py:
177
177
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
178
178
  # README tienes más ejemplos.
179
179
 
180
- naming = {
180
+ perfiles = {
181
181
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
182
182
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
183
183
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -190,19 +190,19 @@ configuraciones = {
190
190
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
191
191
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
192
192
  "parameter_list": [
193
- {"path": "/common", "convencion": "min"}, # -> /dev/common
194
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
195
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
196
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
193
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
194
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
195
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
196
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
197
197
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
198
198
  # todo lo que cuelga de /API/MULTIAPI/DEV
199
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
199
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
200
200
  ]
201
201
  }
202
202
 
203
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
204
- # Si no lo defines, se usa el primer perfil de 'naming'.
205
- convencion_nuevos = "min"
203
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
204
+ # Si no lo defines, se usa el primero de 'perfiles'.
205
+ perfil_nuevos = "min"
206
206
 
207
207
  # ¿El nombre del fichero exportado incluye la ruta leída?
208
208
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -244,9 +244,9 @@ tags_obligatorias = [
244
244
  ```
245
245
  Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
246
246
 
247
- ### Los perfiles de naming
247
+ ### Los perfiles
248
248
 
249
- Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `naming` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
249
+ Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `perfiles` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa, con la clave `perfil`. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
250
250
 
251
251
  **No hay una lista cerrada de perfiles.** Los tres campos se combinan libremente, así que la plantilla no intenta traértelos todos: define los dos o tres que use tu organización y olvídate del resto. `min` y `max` vienen predefinidos porque son los que ParamsX traía antes de que los perfiles fueran configurables.
252
252
 
@@ -266,15 +266,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
266
266
 
267
267
  | Entrada | Fichero |
268
268
  |---|---|
269
- | `{"path": "/API/STA", "convencion": "max"}` | `parameters_dev__API_STA__max.py` |
270
- | `{"path": "/API/*/STA", "convencion": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
269
+ | `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
270
+ | `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
271
271
 
272
272
  ### Cómo acotar tu parameter_list (recomendación)
273
273
 
274
274
  `parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
275
275
 
276
- - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "convencion": "min"}` → `/dev/rds`.
277
- - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "convencion": "min"}` → `/dev/rds/cee-dev/api`.
276
+ - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "min"}` → `/dev/rds`.
277
+ - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
278
278
 
279
279
  Si configuras una ruta más amplia que tus permisos, no pasa nada grave: ParamsX te avisará con un mensaje claro de acceso denegado en vez de una traza de boto3. Pero afinar la ruta te ahorra el error.
280
280
 
@@ -383,7 +383,7 @@ El programa mostrará un menú donde Podrás:
383
383
  - Crear un parámetro nuevo.
384
384
 
385
385
  ### Leer Parámetros:
386
- 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil de naming, por ejemplo `/rds [min]` o `/API/STA [max]`.
386
+ 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil, por ejemplo `/rds [min]` o `/API/STA [max]`.
387
387
  2. Elige el prefijo y el entorno que deseas consultar.
388
388
  3. Los parámetros serán descargados y guardados en archivos como:
389
389
  - parameters_dev.py
@@ -404,7 +404,7 @@ El programa mostrará un menú donde Podrás:
404
404
 
405
405
  ### Crear un parámetro nuevo:
406
406
  1. Selecciona la opción "Crear nuevo parámetro" y elige el entorno.
407
- 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `convencion_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
407
+ 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `perfil_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
408
408
  3. Escribe el valor: texto plano o JSON en una línea.
409
409
  4. Rellena las tags obligatorias (si `tags_activas = True`). `Environment` viene precargada con el entorno elegido. Con `obligatorias_vacias = True` puedes dejar alguna en blanco pulsando Enter: esas no se crearán en AWS.
410
410
  5. Confirma en la pantalla de resumen. Si es un parámetro de RDS y falta su contraparte (común o privado), verás el aviso de correlación de naming ahí mismo.
@@ -4,7 +4,7 @@ ParamsX es una herramienta diseñada para gestionar y organizar parámetros de A
4
4
 
5
5
  ## ⚠ Breaking change en la versión 2.0.0
6
6
 
7
- Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario con su convención de naming. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
7
+ Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario que declara su perfil. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
8
8
 
9
9
  ### Estructura Recomendada
10
10
  La convención de naming es de 5 niveles, donde los últimos segmentos son opcionales según el caso:
@@ -77,10 +77,10 @@ Esto te permitirá mantener respaldos seguros o realizar migraciones/reorganizac
77
77
 
78
78
  4. Crear nuevo parámetro
79
79
  - Crea un parámetro desde cero sin salir de la herramienta. Te pedirá, en este orden:
80
- - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil de naming se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
80
+ - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
81
81
  - El valor: texto plano o JSON en una línea (por ejemplo `{"host": "x", "user": "y", "pass": "z"}`), que se valida antes de continuar.
82
82
  - Las tags obligatorias, si tienes `tags_activas = True`.
83
- - El perfil que se usa es el que declares en `convencion_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
83
+ - El perfil que se usa es el que declares en `perfil_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
84
84
  - Antes de subirlo verás una pantalla de confirmación con la ruta, el valor y las tags. El parámetro se crea con `Overwrite=False`, así que nunca machaca uno existente.
85
85
  - Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
86
86
 
@@ -115,7 +115,7 @@ Ejemplo del contenido de paramsx_config.py:
115
115
  ```python
116
116
  ## Configuraciones ParamsX
117
117
 
118
- # --- Perfiles de naming -------------------------------------------------------------
118
+ # --- Perfiles -------------------------------------------------------------
119
119
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
120
120
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
121
121
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -157,7 +157,7 @@ Ejemplo del contenido de paramsx_config.py:
157
157
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
158
158
  # README tienes más ejemplos.
159
159
 
160
- naming = {
160
+ perfiles = {
161
161
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
162
162
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
163
163
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -170,19 +170,19 @@ configuraciones = {
170
170
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
171
171
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
172
172
  "parameter_list": [
173
- {"path": "/common", "convencion": "min"}, # -> /dev/common
174
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
175
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
176
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
173
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
174
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
175
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
176
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
177
177
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
178
178
  # todo lo que cuelga de /API/MULTIAPI/DEV
179
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
179
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
180
180
  ]
181
181
  }
182
182
 
183
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
184
- # Si no lo defines, se usa el primer perfil de 'naming'.
185
- convencion_nuevos = "min"
183
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
184
+ # Si no lo defines, se usa el primero de 'perfiles'.
185
+ perfil_nuevos = "min"
186
186
 
187
187
  # ¿El nombre del fichero exportado incluye la ruta leída?
188
188
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -224,9 +224,9 @@ tags_obligatorias = [
224
224
  ```
225
225
  Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
226
226
 
227
- ### Los perfiles de naming
227
+ ### Los perfiles
228
228
 
229
- Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `naming` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
229
+ Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `perfiles` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa, con la clave `perfil`. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
230
230
 
231
231
  **No hay una lista cerrada de perfiles.** Los tres campos se combinan libremente, así que la plantilla no intenta traértelos todos: define los dos o tres que use tu organización y olvídate del resto. `min` y `max` vienen predefinidos porque son los que ParamsX traía antes de que los perfiles fueran configurables.
232
232
 
@@ -246,15 +246,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
246
246
 
247
247
  | Entrada | Fichero |
248
248
  |---|---|
249
- | `{"path": "/API/STA", "convencion": "max"}` | `parameters_dev__API_STA__max.py` |
250
- | `{"path": "/API/*/STA", "convencion": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
249
+ | `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
250
+ | `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
251
251
 
252
252
  ### Cómo acotar tu parameter_list (recomendación)
253
253
 
254
254
  `parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
255
255
 
256
- - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "convencion": "min"}` → `/dev/rds`.
257
- - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "convencion": "min"}` → `/dev/rds/cee-dev/api`.
256
+ - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "min"}` → `/dev/rds`.
257
+ - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
258
258
 
259
259
  Si configuras una ruta más amplia que tus permisos, no pasa nada grave: ParamsX te avisará con un mensaje claro de acceso denegado en vez de una traza de boto3. Pero afinar la ruta te ahorra el error.
260
260
 
@@ -363,7 +363,7 @@ El programa mostrará un menú donde Podrás:
363
363
  - Crear un parámetro nuevo.
364
364
 
365
365
  ### Leer Parámetros:
366
- 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil de naming, por ejemplo `/rds [min]` o `/API/STA [max]`.
366
+ 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil, por ejemplo `/rds [min]` o `/API/STA [max]`.
367
367
  2. Elige el prefijo y el entorno que deseas consultar.
368
368
  3. Los parámetros serán descargados y guardados en archivos como:
369
369
  - parameters_dev.py
@@ -384,7 +384,7 @@ El programa mostrará un menú donde Podrás:
384
384
 
385
385
  ### Crear un parámetro nuevo:
386
386
  1. Selecciona la opción "Crear nuevo parámetro" y elige el entorno.
387
- 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `convencion_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
387
+ 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `perfil_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
388
388
  3. Escribe el valor: texto plano o JSON en una línea.
389
389
  4. Rellena las tags obligatorias (si `tags_activas = True`). `Environment` viene precargada con el entorno elegido. Con `obligatorias_vacias = True` puedes dejar alguna en blanco pulsando Enter: esas no se crearán en AWS.
390
390
  5. Confirma en la pantalla de resumen. Si es un parámetro de RDS y falta su contraparte (común o privado), verás el aviso de correlación de naming ahí mismo.
@@ -0,0 +1 @@
1
+ __version__ = "2.2.2"
@@ -30,7 +30,7 @@ def _codigo_error(error):
30
30
  return error.response.get("Error", {}).get("Code", "")
31
31
 
32
32
 
33
- # Valores admitidos en un perfil de naming
33
+ # Valores admitidos en un perfil
34
34
  POSICIONES_ENTORNO = ("inicio", "final", "mixto", "ninguno")
35
35
  CASES_ENTORNO = ("lower", "upper", "capitalize")
36
36
  CASES_RUTA = ("lower", "upper", "capitalize", "ninguno")
@@ -61,7 +61,7 @@ def aplicar_case_ruta(path, case_ruta):
61
61
  return path
62
62
 
63
63
 
64
- # Construir la ruta completa aplicando el perfil de naming de la entrada.
64
+ # Construir la ruta completa aplicando el perfil de la entrada.
65
65
  # Las tres posiciones son la misma operación: se normaliza la ruta a una plantilla con
66
66
  # un único marcador y se sustituye por el entorno. "ninguno" no lleva marcador.
67
67
  def build_full_path(path, perfil, entorno):
@@ -96,20 +96,20 @@ def build_full_path(path, perfil, entorno):
96
96
 
97
97
 
98
98
  # Trozo de nombre de fichero derivado de una entrada de parameter_list:
99
- # {"path": "/API/*/STA", "convencion": "mixto_max"} -> API_env_STA__mixto_max
99
+ # {"path": "/API/*/STA", "perfil": "mixto_max"} -> API_env_STA__mixto_max
100
100
  # Lleva la posición del marcador y el perfil porque dos entradas distintas pueden
101
101
  # compartir la ruta declarada (con perfiles distintos, o con el entorno en otro sitio)
102
102
  # y apuntar a rutas de AWS diferentes: sus ficheros no se pueden pisar.
103
103
  def slug_entrada(entrada):
104
104
  segmentos = [s for s in entrada["path"].strip("/").split("/") if s]
105
105
  ruta = "_".join("env" if s == MARCADOR_ENTORNO else s for s in segmentos)
106
- convencion = entrada.get("convencion")
107
- return f"{ruta}__{convencion}" if convencion else ruta
106
+ perfil = entrada.get("perfil")
107
+ return f"{ruta}__{perfil}" if perfil else ruta
108
108
 
109
109
 
110
110
  # Etiqueta legible de una entrada de parameter_list para los menús
111
111
  def etiqueta_entrada(entrada):
112
- return f"{entrada['path']} [{entrada['convencion']}]"
112
+ return f"{entrada['path']} [{entrada['perfil']}]"
113
113
 
114
114
 
115
115
  # Ficheros exportados que hay en el directorio actual listos para cargar: los que
@@ -31,17 +31,17 @@ PLANTILLA_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "param
31
31
  MENSAJE_MIGRACION = """BREAKING CHANGE en la configuración de ParamsX
32
32
  ------------------------------------------------
33
33
  'parameter_list' ya no es una lista de strings: ahora cada entrada es un diccionario
34
- que declara qué perfil de naming usa. Edita a mano ~/.xsoft/paramsx_config.py:
34
+ que declara qué perfil usa. Edita a mano ~/.xsoft/paramsx_config.py:
35
35
 
36
36
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula
37
37
  "parameter_list": [
38
- {"path": "/common", "convencion": "min"}, # /common + dev -> /dev/common
39
- {"path": "/rds", "convencion": "min"}, # /rds + dev -> /dev/rds
40
- {"path": "/EMAIL", "convencion": "max"}, # /EMAIL + dev -> /EMAIL/DEV
41
- {"path": "/API/STA", "convencion": "max"}, # /API/STA + dev -> /API/STA/DEV
38
+ {"path": "/common", "perfil": "min"}, # /common + dev -> /dev/common
39
+ {"path": "/rds", "perfil": "min"}, # /rds + dev -> /dev/rds
40
+ {"path": "/EMAIL", "perfil": "max"}, # /EMAIL + dev -> /EMAIL/DEV
41
+ {"path": "/API/STA", "perfil": "max"}, # /API/STA + dev -> /API/STA/DEV
42
42
  ]
43
43
 
44
- Los perfiles se definen en el diccionario 'naming' del mismo fichero, con la posición
44
+ Los perfiles se definen en el diccionario 'perfiles' del mismo fichero, con la posición
45
45
  y el case del entorno. 'min' y 'max' vienen predefinidos en la plantilla.
46
46
 
47
47
  Ya no existe 'entornos_old': el entorno se escribe a partir de la lista 'entornos',
@@ -51,10 +51,18 @@ que va siempre en minúscula, aplicándole el 'case_entorno' del perfil."""
51
51
  # Opciones que viven fuera de 'configuraciones' y son opcionales: si el usuario no las
52
52
  # tiene, se usa el valor de la plantilla. Se listan para poder decirle qué le falta.
53
53
  CLAVES_OPCIONALES = (
54
- "naming", "convencion_nuevos", "fichero_por_ruta",
54
+ "perfiles", "perfil_nuevos", "fichero_por_ruta",
55
55
  "tags_activas", "obligatorias_vacias", "tags_obligatorias",
56
56
  )
57
57
 
58
+ # Nombres antiguos que se siguen aceptando -> nombre actual. Se traducen al cargar, así
59
+ # que dentro del código solo existe el nombre nuevo.
60
+ NOMBRES_ANTIGUOS = {
61
+ "naming": "perfiles", # 2.2.0
62
+ "convencion_nuevos": "perfil_nuevos", # 2.2.0
63
+ "abac": "tags_activas", # 2.0.0 y 2.1.0
64
+ }
65
+
58
66
 
59
67
  # Ejecutar el fichero de configuración del usuario y devolver el módulo resultante
60
68
  def cargar_modulo_config():
@@ -73,7 +81,10 @@ def load_config():
73
81
  config = dict(modulo.configuraciones)
74
82
  # Todo lo que va fuera de 'configuraciones' es opcional en el fichero del usuario:
75
83
  # si no está, se usa el valor de la plantilla que trae el paquete.
76
- config["naming"] = dict(getattr(modulo, "naming", plantilla_config.naming))
84
+ # 'naming' es el nombre que tuvo 'perfiles' en la 2.2.0
85
+ config["perfiles"] = dict(
86
+ getattr(modulo, "perfiles", getattr(modulo, "naming", plantilla_config.perfiles))
87
+ )
77
88
  # 'abac' es el nombre antiguo (2.0/2.1) de 'tags_activas': se sigue aceptando.
78
89
  config["tags_activas"] = bool(
79
90
  getattr(modulo, "tags_activas", getattr(modulo, "abac", plantilla_config.tags_activas))
@@ -88,8 +99,13 @@ def load_config():
88
99
  getattr(modulo, "fichero_por_ruta", plantilla_config.fichero_por_ruta)
89
100
  )
90
101
  # Si no se declara, los parámetros nuevos usan el primer perfil definido
91
- primer_perfil = next(iter(config["naming"]), None)
92
- config["convencion_nuevos"] = getattr(modulo, "convencion_nuevos", None) or primer_perfil
102
+ # ('convencion_nuevos' es el nombre que tuvo en la 2.2.0)
103
+ primer_perfil = next(iter(config["perfiles"]), None)
104
+ config["perfil_nuevos"] = (
105
+ getattr(modulo, "perfil_nuevos", None)
106
+ or getattr(modulo, "convencion_nuevos", None)
107
+ or primer_perfil
108
+ )
93
109
  return config
94
110
 
95
111
 
@@ -112,21 +128,21 @@ def validate_config(config):
112
128
  elif "entornos" in config:
113
129
  errores.append("'entornos' debe ser una lista no vacía de entornos en minúscula.")
114
130
 
115
- naming = config.get("naming")
116
- if not isinstance(naming, dict) or not naming:
131
+ perfiles = config.get("perfiles")
132
+ if not isinstance(perfiles, dict) or not perfiles:
117
133
  errores.append(
118
- "'naming' debe ser un diccionario con al menos un perfil "
134
+ "'perfiles' debe ser un diccionario con al menos un perfil "
119
135
  "(ver la plantilla en el propio fichero de configuración)."
120
136
  )
121
- naming = {}
137
+ perfiles = {}
122
138
  else:
123
- errores.extend(validar_naming(naming))
139
+ errores.extend(validar_perfiles(perfiles))
124
140
 
125
- convencion_nuevos = config.get("convencion_nuevos")
126
- if naming and convencion_nuevos not in naming:
141
+ perfil_nuevos = config.get("perfil_nuevos")
142
+ if perfiles and perfil_nuevos not in perfiles:
127
143
  errores.append(
128
- f"'convencion_nuevos' apunta a un perfil que no existe: {convencion_nuevos!r}. "
129
- f"Perfiles definidos en 'naming': {', '.join(sorted(naming))}."
144
+ f"'perfil_nuevos' apunta a un perfil que no existe: {perfil_nuevos!r}. "
145
+ f"Perfiles definidos en 'perfiles': {', '.join(sorted(perfiles))}."
130
146
  )
131
147
 
132
148
  parameter_list = config.get("parameter_list")
@@ -144,26 +160,26 @@ def validate_config(config):
144
160
  errores.append(f"Entrada inválida en parameter_list: {entrada!r}")
145
161
  continue
146
162
  path = entrada.get("path")
147
- convencion = entrada.get("convencion")
163
+ nombre_perfil = perfil_de(entrada)
148
164
  if not isinstance(path, str) or not path.strip("/"):
149
165
  errores.append(f"'path' inválido o vacío en parameter_list: {entrada!r}")
150
166
  continue
151
167
  if not path.startswith("/"):
152
168
  errores.append(f"El 'path' debe empezar por '/': {path!r}")
153
- if convencion not in naming:
169
+ if nombre_perfil not in perfiles:
154
170
  errores.append(
155
- f"'convencion' inválida en {path!r}: {convencion!r}. "
156
- f"Perfiles definidos en 'naming': {', '.join(sorted(naming)) or '(ninguno)'}."
171
+ f"'perfil' inválido en {path!r}: {nombre_perfil!r}. "
172
+ f"Perfiles definidos en 'perfiles': {', '.join(sorted(perfiles)) or '(ninguno)'}."
157
173
  )
158
174
  continue
159
- errores.extend(validar_marcador(path, convencion, naming[convencion]))
175
+ errores.extend(validar_marcador(path, nombre_perfil, perfiles[nombre_perfil]))
160
176
 
161
177
  # Dos entradas que resuelvan a la misma ruta no rompen nada, pero duplican trabajo
162
178
  # y confunden en el menú, así que se avisa.
163
179
  vistas = {}
164
180
  entornos_muestra = config.get("entornos") or ["dev"]
165
181
  for entrada in parameter_list:
166
- perfil = naming.get(entrada.get("convencion")) if isinstance(entrada, dict) else None
182
+ perfil = perfiles.get(perfil_de(entrada)) if isinstance(entrada, dict) else None
167
183
  if not isinstance(perfil, dict):
168
184
  continue
169
185
  try:
@@ -181,12 +197,20 @@ def validate_config(config):
181
197
  return errores, avisos
182
198
 
183
199
 
184
- # Validar los perfiles de naming. Devuelve la lista de errores.
185
- def validar_naming(naming):
200
+ # Nombre del perfil que usa una entrada. 'convencion' es el nombre que tuvo esta clave
201
+ # en la 2.0, la 2.1 y la 2.2.0, y se sigue aceptando.
202
+ def perfil_de(entrada):
203
+ if not isinstance(entrada, dict):
204
+ return None
205
+ return entrada.get("perfil", entrada.get("convencion"))
206
+
207
+
208
+ # Validar los perfiles. Devuelve la lista de errores.
209
+ def validar_perfiles(perfiles):
186
210
  errores = []
187
- for nombre, perfil in naming.items():
211
+ for nombre, perfil in perfiles.items():
188
212
  if not isinstance(perfil, dict):
189
- errores.append(f"El perfil de naming {nombre!r} debe ser un diccionario.")
213
+ errores.append(f"El perfil {nombre!r} debe ser un diccionario.")
190
214
  continue
191
215
 
192
216
  posicion = perfil.get("posicion_entorno")
@@ -215,7 +239,7 @@ def validar_naming(naming):
215
239
 
216
240
  # El marcador '*' y la posición del perfil tienen que contar la misma historia: si no,
217
241
  # la ruta se construye mal y SSM devuelve cero parámetros sin decir por qué.
218
- def validar_marcador(path, convencion, perfil):
242
+ def validar_marcador(path, nombre_perfil, perfil):
219
243
  segmentos = [s for s in path.strip("/").split("/") if s]
220
244
  marcadores = segmentos.count(MARCADOR_ENTORNO)
221
245
  posicion = perfil.get("posicion_entorno")
@@ -228,14 +252,14 @@ def validar_marcador(path, convencion, perfil):
228
252
 
229
253
  if posicion == "mixto" and marcadores != 1:
230
254
  return [
231
- f"La ruta {path!r} usa el perfil {convencion!r} ('mixto') y debe llevar "
255
+ f"La ruta {path!r} usa el perfil {nombre_perfil!r} ('mixto') y debe llevar "
232
256
  f"exactamente un '{MARCADOR_ENTORNO}' que marque dónde va el entorno "
233
257
  f"(tiene {marcadores})."
234
258
  ]
235
259
 
236
260
  if posicion != "mixto" and marcadores:
237
261
  return [
238
- f"La ruta {path!r} lleva un '{MARCADOR_ENTORNO}' pero su perfil {convencion!r} "
262
+ f"La ruta {path!r} lleva un '{MARCADOR_ENTORNO}' pero su perfil {nombre_perfil!r} "
239
263
  f"tiene posicion_entorno='{posicion}', que ya decide dónde va el entorno. "
240
264
  "Usa un perfil 'mixto' o quita el marcador."
241
265
  ]
@@ -246,8 +270,10 @@ def validar_marcador(path, convencion, perfil):
246
270
  # Normalizar la configuración ya validada
247
271
  def normalize_config(config):
248
272
  config["entornos"] = [str(e).lower() for e in config["entornos"]]
273
+ # Se normaliza la clave del perfil: aunque el usuario haya escrito 'convencion',
274
+ # dentro del programa las entradas solo tienen 'perfil'.
249
275
  config["parameter_list"] = [
250
- {"path": "/" + entrada["path"].strip("/"), "convencion": entrada["convencion"]}
276
+ {"path": "/" + entrada["path"].strip("/"), "perfil": perfil_de(entrada)}
251
277
  for entrada in config["parameter_list"]
252
278
  ]
253
279
  return config
@@ -282,8 +308,8 @@ def leer_ruta(stdscr, ssm, full_path, tags_activas, tags_obligatorias):
282
308
  return parameters, avisos
283
309
 
284
310
 
285
- # Feature 2: crear un parámetro nuevo con el perfil de naming de 'convencion_nuevos'
286
- def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
311
+ # Feature 2: crear un parámetro nuevo con el perfil declarado en 'perfil_nuevos'
312
+ def crear_parametro(stdscr, ssm, entornos, perfil, nombre_perfil, tags_activas,
287
313
  tags_obligatorias, obligatorias_vacias=False):
288
314
  env_choice = show_environment_selection(stdscr, entornos)
289
315
  if env_choice is None:
@@ -309,7 +335,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
309
335
  path = prompt_input(
310
336
  stdscr,
311
337
  "Crear nuevo parámetro (1/4): ruta",
312
- f"Ruta del parámetro (convención '{convencion}', sin el entorno):",
338
+ f"Ruta del parámetro (perfil '{nombre_perfil}', sin el entorno):",
313
339
  valor=path,
314
340
  ayuda=ayudas.get(posicion, ""),
315
341
  )
@@ -323,7 +349,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
323
349
  show_message(stdscr, "La ruta no puede estar vacía.", 2)
324
350
  continue
325
351
 
326
- problemas = validar_marcador(path, convencion, perfil)
352
+ problemas = validar_marcador(path, nombre_perfil, perfil)
327
353
  if problemas:
328
354
  show_message(stdscr, problemas[0], 2)
329
355
  continue
@@ -335,7 +361,7 @@ def crear_parametro(stdscr, ssm, entornos, perfil, convencion, tags_activas,
335
361
 
336
362
  if not show_report(
337
363
  stdscr, "Crear nuevo parámetro (2/4): confirmar la ruta",
338
- [f"Convención: {convencion}",
364
+ [f"Perfil: {nombre_perfil}",
339
365
  f"Escrita: {path_declarado}",
340
366
  f"En AWS: {path}",
341
367
  "",
@@ -481,12 +507,12 @@ def main(stdscr, config=None):
481
507
 
482
508
  environments = config['entornos']
483
509
  PARAMETER_LIST = config['parameter_list']
484
- NAMING = config['naming']
510
+ PERFILES = config['perfiles']
485
511
  TAGS_ACTIVAS = config['tags_activas']
486
512
  TAGS_OBLIGATORIAS = config['tags_obligatorias']
487
513
  OBLIGATORIAS_VACIAS = config.get('obligatorias_vacias', False)
488
514
  FICHERO_POR_RUTA = config.get('fichero_por_ruta', False)
489
- CONVENCION_NUEVOS = config.get('convencion_nuevos')
515
+ PERFIL_NUEVOS = config.get('perfil_nuevos')
490
516
 
491
517
  # Nombre del fichero exportado: con fichero_por_ruta cada ruta tiene el suyo, así que
492
518
  # leer una segunda ruta del mismo entorno no machaca lo que estabas editando.
@@ -512,9 +538,9 @@ def main(stdscr, config=None):
512
538
 
513
539
  selected_env = environments[env_choice]
514
540
 
515
- # Crear el prefijo completo según el perfil de naming de la entrada
541
+ # Crear el prefijo completo según el perfil de la entrada
516
542
  full_path = build_full_path(
517
- selected_param["path"], NAMING[selected_param["convencion"]], selected_env
543
+ selected_param["path"], PERFILES[selected_param["perfil"]], selected_env
518
544
  )
519
545
  show_message(stdscr, f"Buscando parámetros en: {full_path}...", 3) # Mensaje inicial
520
546
 
@@ -727,7 +753,7 @@ def main(stdscr, config=None):
727
753
  for entrada in PARAMETER_LIST:
728
754
  for env in environments:
729
755
  full_path = build_full_path(
730
- entrada["path"], NAMING[entrada["convencion"]], env
756
+ entrada["path"], PERFILES[entrada["perfil"]], env
731
757
  )
732
758
  try:
733
759
  # Obtener parámetros desde AWS SSM
@@ -791,9 +817,9 @@ def main(stdscr, config=None):
791
817
 
792
818
  selected_env = environments[env_choice]
793
819
 
794
- # Crear el prefijo completo según el perfil de naming de la entrada
820
+ # Crear el prefijo completo según el perfil de la entrada
795
821
  full_path = build_full_path(
796
- selected_param["path"], NAMING[selected_param["convencion"]], selected_env
822
+ selected_param["path"], PERFILES[selected_param["perfil"]], selected_env
797
823
  )
798
824
 
799
825
  parameters, avisos = leer_ruta(stdscr, ssm, full_path, TAGS_ACTIVAS, TAGS_OBLIGATORIAS)
@@ -818,9 +844,9 @@ def main(stdscr, config=None):
818
844
  show_report(stdscr, "Backup creado", lineas, color_pair=3)
819
845
 
820
846
  elif choice == 4:
821
- # Crear nuevo parámetro con el perfil declarado en 'convencion_nuevos'
847
+ # Crear nuevo parámetro con el perfil declarado en 'perfil_nuevos'
822
848
  crear_parametro(
823
- stdscr, ssm, environments, NAMING[CONVENCION_NUEVOS], CONVENCION_NUEVOS,
849
+ stdscr, ssm, environments, PERFILES[PERFIL_NUEVOS], PERFIL_NUEVOS,
824
850
  TAGS_ACTIVAS, TAGS_OBLIGATORIAS, OBLIGATORIAS_VACIAS
825
851
  )
826
852
 
@@ -856,7 +882,7 @@ def create_config(escribir_ejemplo=False):
856
882
  print(" paramsx configure --ejemplo")
857
883
 
858
884
 
859
- # Valor por defecto en una línea: el repr de 'naming' o de las tags ocupa media pantalla
885
+ # Valor por defecto en una línea: el repr de 'perfiles' o de las tags ocupa media pantalla
860
886
  def resumir_valor(valor):
861
887
  if isinstance(valor, dict):
862
888
  return f"{len(valor)} perfiles ({', '.join(valor)})"
@@ -878,11 +904,27 @@ def revisar_config(config_file):
878
904
  return
879
905
 
880
906
  faltan = [clave for clave in CLAVES_OPCIONALES if not hasattr(modulo, clave)]
881
- # 'abac' es el nombre antiguo de 'tags_activas': teniéndolo no falta nada
882
- if "tags_activas" in faltan and hasattr(modulo, "abac"):
883
- faltan.remove("tags_activas")
884
- print("- 'abac' es el nombre antiguo de 'tags_activas'. Sigue funcionando, pero")
885
- print(" renómbralo cuando puedas: el nuevo dice lo que hace.")
907
+
908
+ # Los nombres antiguos siguen funcionando, así que lo que cubren no "falta":
909
+ # solo se avisa de que hay una forma más clara de escribirlo.
910
+ antiguos = [(v, n) for v, n in NOMBRES_ANTIGUOS.items() if hasattr(modulo, v)]
911
+ lista = getattr(modulo, "configuraciones", {})
912
+ lista = lista.get("parameter_list", []) if isinstance(lista, dict) else []
913
+ con_convencion = [
914
+ e for e in lista
915
+ if isinstance(e, dict) and "perfil" not in e and "convencion" in e
916
+ ]
917
+
918
+ if antiguos or con_convencion:
919
+ print("Nombres antiguos que sigues usando. Funcionan, pero el nuevo se entiende mejor:")
920
+ for viejo, nuevo in antiguos:
921
+ if nuevo in faltan:
922
+ faltan.remove(nuevo)
923
+ print(f" {viejo:20} -> {nuevo}")
924
+ if con_convencion:
925
+ print(f" {'convencion':20} -> perfil "
926
+ f"(en {len(con_convencion)} entrada(s) de parameter_list)")
927
+ print()
886
928
 
887
929
  if faltan:
888
930
  print("Opciones que no tienes y que ParamsX rellena con el valor por defecto:")
@@ -943,14 +985,14 @@ Opciones del menú:
943
985
  2. Cargar parámetros Elige uno de los ficheros exportados que tengas en el
944
986
  directorio, compara y aplica los cambios en AWS.
945
987
  3. Crear Backup de parámetros Respalda una ruta, la lista completa o toda la cuenta.
946
- 4. Crear nuevo parámetro Crea un parámetro nuevo con el perfil 'convencion_nuevos'.
988
+ 4. Crear nuevo parámetro Crea un parámetro nuevo con el perfil de 'perfil_nuevos'.
947
989
 
948
990
  Configuración (~/.xsoft/paramsx_config.py). El fichero trae comentada cada opción:
949
991
  profile_name Perfil de ~/.aws/credentials.
950
992
  region_name Región de AWS.
951
993
  entornos Lista de entornos, SIEMPRE en minúscula: ['dev', 'pre', 'prod'].
952
- Cada perfil de naming decide cómo se escriben en la ruta.
953
- naming Perfiles de naming: cómo se construye la ruta real en AWS. Los
994
+ Cada perfil decide cómo se escriben en la ruta.
995
+ perfiles Cómo se construye la ruta real en AWS. Los
954
996
  nombres los eliges tú y combinas estos tres campos:
955
997
  posicion_entorno 'inicio' /rds -> /dev/rds
956
998
  'final' /API/STA -> /API/STA/DEV
@@ -959,8 +1001,8 @@ Configuración (~/.xsoft/paramsx_config.py). El fichero trae comentada cada opci
959
1001
  case_entorno 'lower' | 'upper' | 'capitalize'
960
1002
  case_ruta 'lower' | 'upper' | 'capitalize' | 'ninguno'
961
1003
  (solo al crear parámetros, opción 4)
962
- parameter_list Lista de dicts {"path": "/rds", "convencion": "<perfil de naming>"}.
963
- convencion_nuevos Perfil que usan los parámetros creados con la opción 4.
1004
+ parameter_list Lista de dicts {"path": "/rds", "perfil": "<nombre de un perfil>"}.
1005
+ perfil_nuevos Perfil que usan los parámetros creados con la opción 4.
964
1006
  fichero_por_ruta True -> el fichero exportado lleva entorno, ruta y perfil en el
965
1007
  nombre, para que leer otra ruta del mismo entorno no machaque la
966
1008
  anterior: parameters_dev__API_STA__max.py
@@ -1,6 +1,6 @@
1
1
  ## Configuraciones ParamsX
2
2
 
3
- # --- Perfiles de naming -------------------------------------------------------------
3
+ # --- Perfiles -------------------------------------------------------------
4
4
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
5
5
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
6
6
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -42,7 +42,7 @@
42
42
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
43
43
  # README tienes más ejemplos.
44
44
 
45
- naming = {
45
+ perfiles = {
46
46
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
47
47
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
48
48
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -55,19 +55,19 @@ configuraciones = {
55
55
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
56
56
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
57
57
  "parameter_list": [
58
- {"path": "/common", "convencion": "min"}, # -> /dev/common
59
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
60
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
61
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
58
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
59
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
60
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
61
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
62
62
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
63
63
  # todo lo que cuelga de /API/MULTIAPI/DEV
64
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
64
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
65
65
  ]
66
66
  }
67
67
 
68
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
69
- # Si no lo defines, se usa el primer perfil de 'naming'.
70
- convencion_nuevos = "min"
68
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
69
+ # Si no lo defines, se usa el primero de 'perfiles'.
70
+ perfil_nuevos = "min"
71
71
 
72
72
  # ¿El nombre del fichero exportado incluye la ruta leída?
73
73
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramsx
3
- Version: 2.2.1
3
+ Version: 2.2.2
4
4
  Summary: Librería para gestionar y respaldar parámetros de AWS SSM de manera sencilla y eficiente.
5
5
  Home-page: https://github.com/pistatxos/paramsx
6
6
  Author: Mariox
@@ -24,7 +24,7 @@ ParamsX es una herramienta diseñada para gestionar y organizar parámetros de A
24
24
 
25
25
  ## ⚠ Breaking change en la versión 2.0.0
26
26
 
27
- Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario con su convención de naming. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
27
+ Si vienes de la 1.x tienes que **actualizar a mano tu `~/.xsoft/paramsx_config.py`**: `parameter_list` ya no es una lista de strings, ahora cada entrada es un diccionario que declara su perfil. La versión antigua **no es compatible** y ParamsX se niega a arrancar mostrando cómo migrarla. Detalle completo en el [CHANGELOG](CHANGELOG.md).
28
28
 
29
29
  ### Estructura Recomendada
30
30
  La convención de naming es de 5 niveles, donde los últimos segmentos son opcionales según el caso:
@@ -97,10 +97,10 @@ Esto te permitirá mantener respaldos seguros o realizar migraciones/reorganizac
97
97
 
98
98
  4. Crear nuevo parámetro
99
99
  - Crea un parámetro desde cero sin salir de la herramienta. Te pedirá, en este orden:
100
- - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil de naming se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
100
+ - La ruta **sin el entorno**, igual que la declaras en `parameter_list`: el perfil se encarga de colocarlo. Verás en pantalla la ruta resultante en AWS antes de seguir.
101
101
  - El valor: texto plano o JSON en una línea (por ejemplo `{"host": "x", "user": "y", "pass": "z"}`), que se valida antes de continuar.
102
102
  - Las tags obligatorias, si tienes `tags_activas = True`.
103
- - El perfil que se usa es el que declares en `convencion_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
103
+ - El perfil que se usa es el que declares en `perfil_nuevos`. Si tu perfil es de tipo `mixto`, escribe el `*` en la ruta para indicar dónde va el entorno.
104
104
  - Antes de subirlo verás una pantalla de confirmación con la ruta, el valor y las tags. El parámetro se crea con `Overwrite=False`, así que nunca machaca uno existente.
105
105
  - Tras crearlo aparecerá la próxima vez que leas la ruta correspondiente de tu `parameter_list`.
106
106
 
@@ -135,7 +135,7 @@ Ejemplo del contenido de paramsx_config.py:
135
135
  ```python
136
136
  ## Configuraciones ParamsX
137
137
 
138
- # --- Perfiles de naming -------------------------------------------------------------
138
+ # --- Perfiles -------------------------------------------------------------
139
139
  # Un perfil dice CÓMO se construye la ruta real en AWS a partir de la ruta que declaras
140
140
  # en 'parameter_list' y del entorno que eliges en el menú. Los nombres son tuyos: define
141
141
  # solo los que uses y llámalos como quieras. Un perfil tiene tres campos:
@@ -177,7 +177,7 @@ Ejemplo del contenido de paramsx_config.py:
177
177
  # Combina los tres campos como necesites: no hay una lista cerrada de perfiles. En el
178
178
  # README tienes más ejemplos.
179
179
 
180
- naming = {
180
+ perfiles = {
181
181
  "min": {"posicion_entorno": "inicio", "case_entorno": "lower", "case_ruta": "lower"},
182
182
  "max": {"posicion_entorno": "final", "case_entorno": "upper", "case_ruta": "ninguno"},
183
183
  "mixto_max": {"posicion_entorno": "mixto", "case_entorno": "upper", "case_ruta": "ninguno"},
@@ -190,19 +190,19 @@ configuraciones = {
190
190
  "region_name": "eu-south-2", # Cambiar por tu región de AWS
191
191
  "entornos": ['dev', 'pre', 'prod'], # SIEMPRE en minúscula, es la lista canónica única
192
192
  "parameter_list": [
193
- {"path": "/common", "convencion": "min"}, # -> /dev/common
194
- {"path": "/rds", "convencion": "min"}, # -> /dev/rds
195
- {"path": "/EMAIL", "convencion": "max"}, # -> /EMAIL/DEV
196
- {"path": "/API/STA", "convencion": "max"}, # -> /API/STA/DEV
193
+ {"path": "/common", "perfil": "min"}, # -> /dev/common
194
+ {"path": "/rds", "perfil": "min"}, # -> /dev/rds
195
+ {"path": "/EMAIL", "perfil": "max"}, # -> /EMAIL/DEV
196
+ {"path": "/API/STA", "perfil": "max"}, # -> /API/STA/DEV
197
197
  # Con 'mixto' acotas por debajo del entorno: esto lee solo stan_ai, en vez de
198
198
  # todo lo que cuelga de /API/MULTIAPI/DEV
199
- {"path": "/API/MULTIAPI/*/stan_ai", "convencion": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
199
+ {"path": "/API/MULTIAPI/*/stan_ai", "perfil": "mixto_max"}, # -> /API/MULTIAPI/DEV/stan_ai
200
200
  ]
201
201
  }
202
202
 
203
- # Perfil de naming que se usa al crear un parámetro nuevo (opción 4 del menú).
204
- # Si no lo defines, se usa el primer perfil de 'naming'.
205
- convencion_nuevos = "min"
203
+ # Perfil que se usa al crear un parámetro nuevo (opción 4 del menú).
204
+ # Si no lo defines, se usa el primero de 'perfiles'.
205
+ perfil_nuevos = "min"
206
206
 
207
207
  # ¿El nombre del fichero exportado incluye la ruta leída?
208
208
  # False -> parameters_dev.py (comportamiento de siempre)
@@ -244,9 +244,9 @@ tags_obligatorias = [
244
244
  ```
245
245
  Nota: Si el archivo paramsx_config.py ya existe, no será sobrescrito durante la instalación para proteger las configuraciones personalizadas.
246
246
 
247
- ### Los perfiles de naming
247
+ ### Los perfiles
248
248
 
249
- Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `naming` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
249
+ Cada organización nombra sus parámetros a su manera, así que ParamsX no impone ninguna convención: **tú defines los perfiles que uses en el diccionario `perfiles` y les pones el nombre que quieras**. Cada entrada de `parameter_list` declara con qué perfil se construye su ruta completa, con la clave `perfil`. Los tres campos de un perfil y sus valores están explicados en el propio fichero de configuración, ahí arriba.
250
250
 
251
251
  **No hay una lista cerrada de perfiles.** Los tres campos se combinan libremente, así que la plantilla no intenta traértelos todos: define los dos o tres que use tu organización y olvídate del resto. `min` y `max` vienen predefinidos porque son los que ParamsX traía antes de que los perfiles fueran configurables.
252
252
 
@@ -266,15 +266,15 @@ En el nombre van el entorno, la ruta y el perfil, porque dos entradas pueden com
266
266
 
267
267
  | Entrada | Fichero |
268
268
  |---|---|
269
- | `{"path": "/API/STA", "convencion": "max"}` | `parameters_dev__API_STA__max.py` |
270
- | `{"path": "/API/*/STA", "convencion": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
269
+ | `{"path": "/API/STA", "perfil": "max"}` | `parameters_dev__API_STA__max.py` |
270
+ | `{"path": "/API/*/STA", "perfil": "mixto_max"}` | `parameters_dev__API_env_STA__mixto_max.py` |
271
271
 
272
272
  ### Cómo acotar tu parameter_list (recomendación)
273
273
 
274
274
  `parameter_list` es solo tu vista de trabajo: **la seguridad real la impone IAM, no este fichero**. La recomendación de uso es:
275
275
 
276
- - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "convencion": "min"}` → `/dev/rds`.
277
- - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "convencion": "min"}` → `/dev/rds/cee-dev/api`.
276
+ - **Admins**: pueden configurar rutas raíz amplias, por ejemplo `{"path": "/rds", "perfil": "min"}` → `/dev/rds`.
277
+ - **Usuarios normales**: conviene acotar la ruta a lo que su rol IAM tiene realmente autorizado, por ejemplo `{"path": "/rds/cee-dev/api", "perfil": "min"}` → `/dev/rds/cee-dev/api`.
278
278
 
279
279
  Si configuras una ruta más amplia que tus permisos, no pasa nada grave: ParamsX te avisará con un mensaje claro de acceso denegado en vez de una traza de boto3. Pero afinar la ruta te ahorra el error.
280
280
 
@@ -383,7 +383,7 @@ El programa mostrará un menú donde Podrás:
383
383
  - Crear un parámetro nuevo.
384
384
 
385
385
  ### Leer Parámetros:
386
- 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil de naming, por ejemplo `/rds [min]` o `/API/STA [max]`.
386
+ 1. Selecciona la opción "Leer parámetros" en el menú. La lista muestra cada ruta con su perfil, por ejemplo `/rds [min]` o `/API/STA [max]`.
387
387
  2. Elige el prefijo y el entorno que deseas consultar.
388
388
  3. Los parámetros serán descargados y guardados en archivos como:
389
389
  - parameters_dev.py
@@ -404,7 +404,7 @@ El programa mostrará un menú donde Podrás:
404
404
 
405
405
  ### Crear un parámetro nuevo:
406
406
  1. Selecciona la opción "Crear nuevo parámetro" y elige el entorno.
407
- 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `convencion_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
407
+ 2. Escribe la ruta **sin el entorno**, como en tu `parameter_list`: ParamsX le aplica el perfil de `perfil_nuevos` y te enseña la ruta resultante en AWS para que la confirmes.
408
408
  3. Escribe el valor: texto plano o JSON en una línea.
409
409
  4. Rellena las tags obligatorias (si `tags_activas = True`). `Environment` viene precargada con el entorno elegido. Con `obligatorias_vacias = True` puedes dejar alguna en blanco pulsando Enter: esas no se crearán en AWS.
410
410
  5. Confirma en la pantalla de resumen. Si es un parámetro de RDS y falta su contraparte (común o privado), verás el aviso de correlación de naming ahí mismo.
@@ -1 +0,0 @@
1
- __version__ = "2.2.1"
File without changes
File without changes
File without changes
File without changes
File without changes