Skip to content

Global configuration#187

Merged
rhannequin merged 5 commits intomainfrom
global-configuration
Jun 6, 2025
Merged

Global configuration#187
rhannequin merged 5 commits intomainfrom
global-configuration

Conversation

@rhannequin
Copy link
Owner

With #186, global cache was introduced to increase the performance of the library on the main features. However, because this caching implementation goes with a small reduction of precision (instants are rounded to increase the chance of hitting it), it felt odd to force the user to use it, and to use it exclusively of the author decided.

This introduces a global configuration with a nice API to let the user customise it.

Usage

Currently, the configuration has two purposes:

  • enabling/disabling caching
  • set customised rounding values for the features using cache
Astronoby.configuration.cache_enabled = true
Astronoby.cache_precision(:geometric, 5)

This will enable caching globally and geometric positions will be cached based on a rounding of 0.00001 on the instant. As the instant is stored as a Julian Day, this represents 0.1 seconds: the same geometric position won't be re-computed if its instant falls into 0.1 seconds of a previously computed one.

Defaults

By default, caching is disabled. I want to avoid new users discovering the library and having unexpected results. The default behaviour is to compute everything from scratch constantly, except positions in the RTS calculator during computation.

Performance

With no cache by default, the performance is back to a few commits before, even slightly less performant due to the new added complexity. However, with cache enabled, we're back to interesting performance, with the added bonus of customisable configuration.

require_relative "benchmarks/performance"
PerformanceBenchmark.new.run

# Astronoby Performance Benchmark
#   Ruby version : 3.4.3
#   Date         : 2025-05-26
#
# Warming up (2 runs, not measured)...
#
# Measuring (3 runs, each 10 iterations)...
#   Run 1/3 complete.
#   Run 2/3 complete.
#   Run 3/3 complete.
#
# RESULTS (averaged over 3 runs, each 10 iterations):
#   rts_event_on:          22.20  ±  0.06 sec
#   rts_events_between:     17.23  ±  0.05 sec
#   twilight_event_on:     23.83  ±  0.30 sec
#   moon_phases:           22.66  ±  0.06 sec
#   total:                 85.92  ±  0.32 sec
Astronoby.configuration.cache_enabled = true
require_relative "benchmarks/performance"
PerformanceBenchmark.new.run

# Astronoby Performance Benchmark
#   Ruby version : 3.4.3
#   Date         : 2025-05-26
#
# Warming up (2 runs, not measured)...
#
# Measuring (3 runs, each 10 iterations)...
#   Run 1/3 complete.
#   Run 2/3 complete.
#   Run 3/3 complete.
#
# RESULTS (averaged over 3 runs, each 10 iterations):
#   rts_event_on:          10.23  ±  0.04 sec
#   rts_events_between:      8.60  ±  0.07 sec
#   twilight_event_on:      8.18  ±  0.04 sec
#   moon_phases:            0.06  ±  0.00 sec
#   total:                 27.06  ±  0.06 sec

@rhannequin rhannequin self-assigned this May 26, 2025
@rhannequin rhannequin requested a review from Copilot May 26, 2025 21:01
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

Introduces a global configuration for caching that lets users enable/disable cache and customize rounding precision, and applies it throughout the library.

  • Add Astronoby.configuration API to toggle cache and set per-feature precision
  • Implement CacheKey.generate and NullCache for precision-based caching
  • Update core modules (precession, nutation, RTS calculator, moon phases, geometric) and specs to use the new configuration

Reviewed Changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
lib/astronoby/configuration.rb Add global configuration class for enabling/disabling cache and setting precisions
lib/astronoby/cache.rb Introduce NullCache and CacheKey.generate for precision-aware cache keys
lib/astronoby/precession.rb Refactor to use Astronoby.cache and flat cache keys via CacheKey.generate
lib/astronoby/nutation.rb Refactor to use Astronoby.cache and CacheKey.generate
lib/astronoby/events/rise_transit_set_calculator.rb Replace inline cache logic with global config + CacheKey.generate integration
lib/astronoby/events/moon_phases.rb Use Astronoby.cache for moon phases with configurable precision
lib/astronoby/bodies/solar_system_body.rb Integrate global cache and CacheKey.generate in geometric position calculations
lib/astronoby.rb Require the new configuration file
spec/astronoby/configuration_spec.rb Add tests for cache enable/disable and precision settings
spec/astronoby/cache_spec.rb Update cache tests to clear state after each example
spec/astronoby/bodies/*_spec.rb (venus, uranus, sun, saturn, etc.) Update expected values and add with cache enabled contexts

Comment on lines +58 to +59
@cache_instance = nil
Cache.instance.clear if cache_enabled
Copy link

Copilot AI May 26, 2025

Choose a reason for hiding this comment

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

In reset_cache!, @cache_instance is unused and clearing via Cache.instance.clear may bypass NullCache. Consider removing @cache_instance, calling cache.clear (which respects NullCache), and simplifying the reset logic.

Suggested change
@cache_instance = nil
Cache.instance.clear if cache_enabled
cache.clear

Copilot uses AI. Check for mistakes.
Base automatically changed from internal-global-lru-cache to main May 28, 2025 20:10
@rhannequin rhannequin force-pushed the global-configuration branch from 698ce14 to d986fa2 Compare May 28, 2025 20:18
@rhannequin rhannequin force-pushed the global-configuration branch from d986fa2 to d913757 Compare June 1, 2025 19:16
@rhannequin rhannequin merged commit 036c11e into main Jun 6, 2025
42 checks passed
@rhannequin rhannequin deleted the global-configuration branch June 6, 2025 13:03
@rhannequin rhannequin mentioned this pull request Jun 10, 2025
rhannequin added a commit that referenced this pull request Sep 1, 2025
## 0.8.0 - 2025-09-01

_If you are upgrading: please see [UPGRADING.md]._

### Bug fixes

* Fix UPGRADING documentation ([#178])
* Fix possible division by zero in RTS ([#185])

### Features

* Introduce performance benchmark ([#183])
* Cache positions in RTS calculator ([#182])
* Internal global LRU cache ([#186])
* Global configuration ([#187])
* Compute the constellation a body is in ([#199])
* Add `#phase_angle` and `#illuminated_fraction` to planets ([#200])
* Apparent magnitude ([#201])
* Add #events_between to TwilightCalculator with better accuracy ([#204])
* `#angular_diameter` on Solar System bodies ([#207])
* Fix constellation boundaries near 24h right ascension ([#209])

### Improvements

* Bump standard from 1.49.0 to 1.50.0 by @dependabot ([#177])
* Bump ephem from 0.3.0 to 0.4.1 by @dependabot ([#181], [#191])
* Bump irb from 1.14.3 to 1.15.2 by @dependabot ([#184])
* Bump rspec from 3.13.0 to 3.13.1 by @dependabot ([#188])
* Bump benchmark from 0.4.0 to 0.4.1 by @dependabot ([#189])
* Bump rake from 13.2.1 to 13.3.0 by @dependabot ([#190])
* Bump matrix from 0.4.2 to 0.4.3 by @dependabot ([#193])
* Update rubyzip requirement from ~> 2.3 to ~> 3.0 by @dependabot ([#194])
* Bump rubyzip from 3.0.0 to 3.0.2 by @dependabot ([#202], [#206])
* Exclude benchmarks from release ([#196])
* `Epoch` refactoring into `JulianDate` ([#197])
* Support Ruby 3.4.4 ([#198])
* Bump actions/checkout from 4 to 5 ([#203])
* Internal documentation ([#205])

### Backward-incompatible changes

* `Epoch` refactoring into `JulianDate` ([#197])
* `#angular_diameter` on Solar System bodies ([#207])
* Rename "epoch" ([#208])

### Closed issues

* Consider adding typical usage/deployment info ([#179])
* Performance degradation in v0.7 ([#180])

**Full Changelog**: v0.7.0...v0.8.0

[#177]: #177
[#178]: #178
[#179]: #179
[#180]: #180
[#181]: #181
[#182]: #182
[#183]: #183
[#184]: #184
[#185]: #185
[#186]: #186
[#187]: #187
[#188]: #188
[#189]: #189
[#190]: #190
[#191]: #191
[#193]: #193
[#194]: #194
[#196]: #196
[#197]: #197
[#198]: #198
[#199]: #199
[#200]: #200
[#201]: #201
[#202]: #202
[#203]: #203
[#204]: #204
[#205]: #205
[#206]: #206
[#207]: #207
[#208]: #208
[#209]: #209
[UPGRADING.md]: https://github.com/rhannequin/astronoby/blob/main/UPGRADING.md
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.

2 participants