Skip to content

feat: Add configurable default difficulty via environment variable#7

Merged
Perafan18 merged 1 commit intomasterfrom
feature/v2-env-config
Nov 10, 2025
Merged

feat: Add configurable default difficulty via environment variable#7
Perafan18 merged 1 commit intomasterfrom
feature/v2-env-config

Conversation

@Perafan18
Copy link
Owner

@Perafan18 Perafan18 commented Nov 10, 2025

Summary

  • Makes the default mining difficulty configurable via DEFAULT_DIFFICULTY environment variable
  • Removes .env from git tracking (security best practice)
  • Creates .env.example as template for environment configuration

Changes

  • New file: .env.example with DEFAULT_DIFFICULTY=2 configuration
  • Updated: .env.test to include DEFAULT_DIFFICULTY=2
  • Updated: src/block.rb - Block model now reads default difficulty from environment
  • Updated: main.rb - API endpoint uses environment variable when difficulty not provided
  • Removed: .env from git tracking (already in .gitignore)

Benefits

  • Environment-specific configuration: Different difficulty settings per environment (dev/staging/prod)
  • No code changes needed: Adjust default difficulty by modifying .env file
  • 12-factor app compliance: Follows configuration best practices
  • Security: Sensitive environment files no longer tracked in git

Technical Details

# Block model (src/block.rb:30)
field :difficulty, type: Integer, default: -> { ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i }

# API endpoint (main.rb:48)
difficulty = validation[:difficulty] || ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i

Test plan

  • All tests passing (17 examples, 0 failures)
  • RuboCop clean (10 files, no offenses)
  • Verified default difficulty=2 when not specified
  • Verified custom difficulty values still work
  • Verified .env is not tracked by git

🤖 Generated with Claude Code

Summary by CodeRabbit

Notas de la Versión

  • Nuevas Funcionalidades

    • La dificultad del bloque ahora es configurable mediante la variable de entorno DEFAULT_DIFFICULTY.
  • Documentación

    • Guías de desarrollo actualizadas con información sobre la pila tecnológica, detalles de configuración y estructura del proyecto.
  • Tareas de Mantenimiento

    • Se agregó la variable de entorno DEFAULT_DIFFICULTY a los archivos de configuración.

Added DEFAULT_DIFFICULTY environment variable to allow configuring the default
mining difficulty without code changes.

Changes:
- Created .env.example with DEFAULT_DIFFICULTY=2
- Removed .env from git tracking (security best practice)
- Updated .env.test with DEFAULT_DIFFICULTY=2
- Updated Block model to use ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i as default
- Updated main.rb to use ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i when difficulty not provided

Benefits:
- Allows different difficulty settings per environment (dev/staging/prod)
- No code changes needed to adjust default difficulty
- Follows 12-factor app configuration principles

All tests passing (17 examples, 0 failures)
RuboCop clean (10 files, no offenses)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Nov 10, 2025

Walkthrough

Se introduce la variable de entorno DEFAULT_DIFFICULTY para parametrizar la dificultad por defecto de los bloques. Se actualiza main.rb y src/block.rb para utilizar esta configuración en lugar de valores hardcodeados. Se añaden las configuraciones a .env.example y .env.test, y se reorganiza la documentación de directrices.

Changes

Cohort / Archivo(s) Resumen de cambios
Configuración de variables de entorno
\.env\.example, \.env\.test
Se añade la variable DEFAULT_DIFFICULTY=2 a ambos archivos para permitir la configuración centralizada de la dificultad por defecto en diferentes entornos.
Lógica de dificultad por defecto
main\.rb, src/block\.rb
Se reemplaza el valor hardcodeado de dificultad (2) por la lectura dinámica de ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i. En src/block.rb, el campo difficulty utiliza ahora una función lambda como valor por defecto; en main.rb, se aplica la misma lógica como fallback.
Documentación de directrices
\.junie/guidelines\.md
Se reorganiza y reformatea completamente el documento. Se actualiza el encabezado con timestamp, se añade una sección "Tech stack" explícita, se reestructuran las instrucciones de compilación/configuración y pruebas, y se clarifican las variables de entorno y la estructura del proyecto.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutos

  • Áreas de atención especial:
    • Validar que la función lambda en src/block.rb se evalúe correctamente en cada inicialización de instancia
    • Confirmar que el fallback en main.rb sea coherente con el valor por defecto definido en src/block.rb
    • Revisar que los valores en .env.example y .env.test coincidan y sean documentados

Possibly related PRs

Poem

🐰 Un conejo saltarín, de configuración parlanchín,
hizo que la dificultad sea variable sin confusión,
DEFAULT_DIFFICULTY en el aire flota,
¡Bloques flexibles, la red se destrota!

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed El título describe con precisión el cambio principal: hacer que la dificultad por defecto sea configurable mediante una variable de entorno, lo que se refleja en todos los archivos modificados.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/v2-env-config

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
.env.example (1)

5-5: Variable de entorno agregada correctamente.

La adición de DEFAULT_DIFFICULTY=2 es correcta y se alinea con los cambios en el código.

Nota sobre ordenamiento (opcional): El linter sugiere ordenar las claves alfabéticamente (DEFAULT_DIFFICULTY antes de ENVIRONMENT). Esto es una convención de estilo menor y puede abordarse si se desea mantener consistencia con las reglas del linter.

main.rb (1)

48-48: Cambio correcto, pero considerar extracción para evitar duplicación.

La implementación funciona correctamente al leer la dificultad desde variables de entorno. Sin embargo, el patrón ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i se repite en src/block.rb:30, lo que viola el principio DRY.

Adicionalmente, no hay validación del valor leído desde ENV. Si alguien configura un valor inválido (ej: negativo, cero, o texto), .to_i puede producir resultados inesperados (ej: 'abc'.to_i retorna 0).

Refactor sugerido: Extraer a constante o método helper

Crea un helper compartido para centralizar la lógica:

# En helpers o en un módulo compartido
def default_difficulty
  value = ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i
  raise ArgumentError, 'DEFAULT_DIFFICULTY must be positive' if value <= 0
  value
end

Luego úsalo en main.rb:48:

-    difficulty = validation[:difficulty] || ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i
+    difficulty = validation[:difficulty] || default_difficulty

Y en src/block.rb:30:

-  field :difficulty, type: Integer, default: -> { ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i }
+  field :difficulty, type: Integer, default: -> { default_difficulty }
.env.test (1)

5-5: Variable de entorno agregada correctamente para el entorno de pruebas.

La adición de DEFAULT_DIFFICULTY=2 en el archivo de configuración de pruebas es correcta y asegura consistencia entre entornos.

Nota sobre ordenamiento (opcional): Similar a .env.example, el linter sugiere ordenar alfabéticamente las claves. Esto es una convención de estilo menor.

src/block.rb (1)

30-30: Uso correcto de lambda para default dinámico en Mongoid.

La implementación usando lambda es correcta para Mongoid - el valor se evalúa en tiempo de creación de cada instancia, no al cargar la clase. Esto permite que la variable de entorno sea leída dinámicamente.

Observaciones:

  1. El mismo patrón ENV.fetch('DEFAULT_DIFFICULTY', '2').to_i se repite en main.rb:48 (ver comentario en ese archivo sobre refactorización recomendada para eliminar duplicación).
  2. No hay validación del valor de la variable de entorno, lo que podría permitir valores problemáticos como cero o negativos.

La implementación funciona correctamente según está.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 188644d and 6b5bf62.

📒 Files selected for processing (5)
  • .env.example (1 hunks)
  • .env.test (1 hunks)
  • .junie/guidelines.md (1 hunks)
  • main.rb (1 hunks)
  • src/block.rb (1 hunks)
🧰 Additional context used
🪛 dotenv-linter (4.0.0)
.env.example

[warning] 5-5: [UnorderedKey] The DEFAULT_DIFFICULTY key should go before the ENVIRONMENT key

(UnorderedKey)

.env.test

[warning] 5-5: [UnorderedKey] The DEFAULT_DIFFICULTY key should go before the ENVIRONMENT key

(UnorderedKey)

🔇 Additional comments (1)
.junie/guidelines.md (1)

1-154: Las actualizaciones de documentación reflejan correctamente la nueva configuración basada en variables de entorno.

La reorganización y expansión de las guías de desarrollo están bien estructuradas y documentan adecuadamente el nuevo enfoque de configuración con DEFAULT_DIFFICULTY.

@Perafan18 Perafan18 merged commit 2ad4cc9 into master Nov 10, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant