configurability 4.2.0 → 5.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90db460a224cb22dc552c50e39a5f78af6599d01502dfc97a72c52afcbfb4dcf
4
- data.tar.gz: a8d656fd6844cc7df9d04248d9418962ff286004f652185a517fc834e302dab4
3
+ metadata.gz: a3d72bd8604379adbc7d7cc9fcaad9cbf5e05f506b4d5f2b91bcee03b31d980d
4
+ data.tar.gz: 82d58d94493be733dd8141dce382c644667c439bddfc29e3656c93938695dbd9
5
5
  SHA512:
6
- metadata.gz: fd4959e2e09463fe43ea49216b53f2d98b211183fe7b2cf294069a241c1983cb8c4b9573daa1d677c79e35153a26c323aa6ea26edcd88c78a6ce8690df3d0e8b
7
- data.tar.gz: 1b87c87a150ab5604ab0b370e9429aec1d5ce9325998f305ad12e6352be187421e6bb8821f08c6f479bf68f26338e77c9a1790a8d99d4cca8292899e6ca8691d
6
+ metadata.gz: 0ad8db05f08251e67fb781321f3c245d26f4619a0a5b1e506b1c90f360241a9c881362c27f980b243fffd535baaeeb50136f8b7f30e18265a63b22bba77c2ef5
7
+ data.tar.gz: d572f4feb1372d71b3676f1e128dfafb38b3b3ccf947873385e3e6d87d61321fee5c04c2e12e2244fcd337cc9c989c9c3ec6f59c6610e567dd4609bd174bff85
checksums.yaml.gz.sig CHANGED
Binary file
data/History.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ---
4
4
 
5
+ ## v5.0.0 [2025-01-29] Michael Granger <ged@faeriemud.org>
6
+
7
+ Improvements:
8
+
9
+ - Detect and raise an error when declaring a setting if it
10
+ would have replaced an existing method
11
+ - Add setting aliases
12
+ - Add a `setting_default` declaration for overriding the
13
+ settings defaults for subclasses.
14
+ - Add an accessor that can fetch embedded comments for
15
+ DSL-style settings
16
+
17
+
5
18
  ## v4.2.0 [2020-12-28] Michael Granger <ged@faeriemud.org>
6
19
 
7
20
  Improvements:
data/README.md CHANGED
@@ -32,7 +32,7 @@ single action.
32
32
 
33
33
  # user.rb
34
34
  require 'configurability'
35
-
35
+
36
36
  class User
37
37
  extend Configurability
38
38
 
@@ -104,7 +104,7 @@ You can configure the `Database` class (and all other objects extended with
104
104
  Configurability) with it like so:
105
105
 
106
106
  require 'configurability/config'
107
-
107
+
108
108
  config = Configurability::Config.load( 'config.yml' )
109
109
  Configurability.configure_objects( config )
110
110
 
@@ -153,6 +153,56 @@ alongside its getter and setter:
153
153
  Mailer.use_whitelist?
154
154
  # => true
155
155
 
156
+ If you want additional ways to check/set the setting, you can provide one or
157
+ more aliases for a settings which will cause additional setting methods to be
158
+ created:
159
+
160
+ class Server
161
+ extend Configurability
162
+ configurability( :server ) do
163
+ setting :environment, default: :development, alias: :host_env
164
+ end
165
+ end
166
+
167
+ Server.environment = :staging
168
+ Server.host_env
169
+ # => :staging
170
+
171
+
172
+ ### Inheritance
173
+
174
+ Subclasses inherit settings from their parents, but their setting values are
175
+ independent:
176
+
177
+ class Server
178
+ extend Configurability
179
+ configurability( :server ) do
180
+ setting :host, default: 'localhost'
181
+ setting :port, default: nil
182
+ end
183
+ end
184
+
185
+ class MailServer < Server; end
186
+
187
+ Server.host = '0.0.0.0'
188
+ MailServer.host
189
+ # => 'localhost'
190
+
191
+ If you wish to override the default setting value of the parent class, you can't
192
+ re-declare the setting but you can explicitly set the default:
193
+
194
+ class WebServer < Server
195
+ configurability( :server ) do
196
+ setting_default :port, 80
197
+ end
198
+ end
199
+
200
+ Server.port
201
+ # => nil
202
+
203
+ WebServer.port
204
+ # => 80
205
+
156
206
 
157
207
  ### More Details
158
208
 
@@ -374,8 +424,8 @@ write the modified config back out to the same file:
374
424
  then dump it to a YAML string:
375
425
 
376
426
  config.dump
377
- # => "--- \ndatabase: \n development: \n adapter: sqlite3\n
378
- database: db/dev.db\n pool: 5\n timeout: 5000\n testing: \n
427
+ # => "--- \ndatabase: \n development: \n adapter: sqlite3\n
428
+ database: db/dev.db\n pool: 5\n timeout: 5000\n testing: \n
379
429
  adapter: mysql\n database: t_fixedassets\n pool: 2\n timeout:
380
430
  5000\n production: \n adapter: postgres\n database:
381
431
  fixedassets\n pool: 25\n timeout: 50\nldap: \n uri:
@@ -443,7 +493,7 @@ and generate the API documentation.
443
493
 
444
494
  ## License
445
495
 
446
- Copyright (c) 2010-2020 Michael Granger and Mahlon E. Smith
496
+ Copyright (c) 2010-2025 Michael Granger and Mahlon E. Smith
447
497
  All rights reserved.
448
498
 
449
499
  Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,6 @@
1
1
  # -*- ruby -*-
2
- #encoding: utf-8
2
+
3
+ require 'prism'
3
4
 
4
5
  require 'loggability'
5
6
  require 'configurability' unless defined?( Configurability )
@@ -17,6 +18,7 @@ class Configurability::SettingInstaller
17
18
  ### constants to the specified +target+ object.
18
19
  def initialize( target )
19
20
  @target = target
21
+ @lexed = nil
20
22
  end
21
23
 
22
24
 
@@ -28,8 +30,17 @@ class Configurability::SettingInstaller
28
30
  ### Declare a config setting with the specified +name+.
29
31
  def setting( name, **options, &block )
30
32
  self.log.debug " adding %s setting to %p" % [ name, self.target ]
33
+
34
+ options[:alias] = Array( options[:alias] )
35
+ self.add_comment_accessor( name, options )
31
36
  self.add_setting_accessors( name, options, &block )
32
- self.add_default( name, options )
37
+ self.add_default( name, options[:default] )
38
+ end
39
+
40
+
41
+ ### Declare a new default for the setting with the specified +name+.
42
+ def setting_default( name, new_default )
43
+ self.add_default( name, new_default )
33
44
  end
34
45
 
35
46
 
@@ -39,6 +50,8 @@ class Configurability::SettingInstaller
39
50
 
40
51
  ### Add accessors with the specified +name+ to the target.
41
52
  def add_setting_accessors( name, options, &writer_hook )
53
+ self.check_for_duplicates( name, options )
54
+
42
55
  if options[:use_class_vars]
43
56
  self.target.class_variable_set( "@@#{name}", nil )
44
57
  else
@@ -47,13 +60,58 @@ class Configurability::SettingInstaller
47
60
 
48
61
  reader = self.make_setting_reader( name, options )
49
62
  writer = self.make_setting_writer( name, options, &writer_hook )
63
+ predicate = self.make_setting_predicate( name, options )
64
+ names = [ name ] + options[:alias]
65
+
66
+ names.each do |setting_name|
67
+ self.target.define_singleton_method( "#{setting_name}", &reader )
68
+ self.target.define_singleton_method( "#{setting_name}=", &writer )
69
+ self.target.define_singleton_method( "#{setting_name}?", &predicate ) if
70
+ options[:predicate]
71
+ end
72
+ end
73
+
74
+
75
+ ### Create a reader that returns any raw comments found immediately above the
76
+ ### specified +name+.
77
+ def add_comment_accessor( name, options )
78
+ # The source file with the configurablity block.
79
+ loc = caller_locations( 2, 1 ).first
50
80
 
51
- self.target.define_singleton_method( "#{name}", &reader )
52
- self.target.define_singleton_method( "#{name}=", &writer )
81
+ @lexed ||= Prism.lex_file( loc.path ).value
82
+ comments = @lexed.
83
+ take_while{|node| node.first.location.start_line < loc.lineno }.
84
+ reverse_each.
85
+ take_while{|node| node.first.type == :COMMENT }.
86
+ reverse_each.
87
+ map{|node| node.first.value }.
88
+ join
53
89
 
54
- if options[:predicate]
55
- predicate = self.make_setting_predicate( name, options )
56
- self.target.define_singleton_method( "#{name}?", &predicate )
90
+ if options[:use_class_vars]
91
+ self.target.class_variable_set( "@@#{name}_comments", comments )
92
+ else
93
+ self.target.instance_variable_set( "@#{name}_comments", comments )
94
+ end
95
+
96
+ reader = self.make_setting_reader( "#{name}_comments", options )
97
+ self.target.define_singleton_method( "#{name}_comments", &reader )
98
+ end
99
+
100
+
101
+ ### Check that there are not already accessors for the setting with the given +name+
102
+ ### and +options+.
103
+ def check_for_duplicates( name, options )
104
+ names = [ name.to_sym ] + options[:alias]
105
+
106
+ names.each do |method_name|
107
+ raise ScriptError, "setting %p collides with method #%s" % [ name, method_name ] if
108
+ self.target.singleton_methods.include?( name )
109
+ raise ScriptError, "setting %p collides with method #%s=" % [ name, method_name ] if
110
+ self.target.singleton_methods.include?( "#{method_name}=".to_sym )
111
+ if options[:predicate]
112
+ raise ScriptError, "setting %p collides with method #%s?" % [ name, method_name ] if
113
+ self.target.singleton_methods.include?( "#{method_name}?".to_sym )
114
+ end
57
115
  end
58
116
  end
59
117
 
@@ -110,9 +168,7 @@ class Configurability::SettingInstaller
110
168
 
111
169
  ### Add a default for +name+ to the CONFIG_DEFAULTS constant of the target, creating
112
170
  ### it if necessary.
113
- def add_default( name, options )
114
- default_value = options[ :default ]
115
-
171
+ def add_default( name, default_value )
116
172
  self.target.send( "#{name}=", default_value )
117
173
  if self.target.respond_to?( :const_defined? )
118
174
  defaults = if self.target.const_defined?( :CONFIG_DEFAULTS, false )
@@ -14,7 +14,7 @@ module Configurability
14
14
 
15
15
 
16
16
  # Library version constant
17
- VERSION = '4.2.0'
17
+ VERSION = '5.0.0'
18
18
 
19
19
  # Version-control revision constant
20
20
  REVISION = %q$Revision$
@@ -618,6 +618,95 @@ describe Configurability do
618
618
  end
619
619
 
620
620
 
621
+ it "allows a setting to be declared with a single alias" do
622
+ mod.configurability( :testconfig ) do
623
+ setting :environment, alias: :env, default: 'development'
624
+ end
625
+
626
+ expect {
627
+ mod.environment = 'production'
628
+ }.to change { mod.environment }.
629
+ from( 'development' ).
630
+ to( 'production' )
631
+
632
+ expect {
633
+ mod.env = 'staging'
634
+ }.to change { mod.environment }.
635
+ from( 'production' ).
636
+ to( 'staging' )
637
+
638
+ expect( mod.env ).to eq( 'staging' )
639
+
640
+ expect( mod.defaults ).to include(
641
+ environment: 'development',
642
+ )
643
+ expect( mod.defaults ).not_to include( :env )
644
+ end
645
+
646
+
647
+ it "allows a setting to be declared with multiple aliases" do
648
+ mod.configurability( :testconfig ) do
649
+ setting :environment, alias: [:env, :host], default: 'development'
650
+ end
651
+
652
+ expect {
653
+ mod.environment = 'production'
654
+ }.to change { mod.environment }.
655
+ from( 'development' ).
656
+ to( 'production' )
657
+
658
+ expect {
659
+ mod.env = 'staging'
660
+ }.to change { mod.environment }.
661
+ from( 'production' ).
662
+ to( 'staging' )
663
+
664
+ expect {
665
+ mod.host = 'development'
666
+ }.to change { mod.environment }.
667
+ from( 'staging' ).
668
+ to( 'development' )
669
+
670
+ expect( mod.env ).to eq( 'development' )
671
+ expect( mod.host ).to eq( 'development' )
672
+
673
+ expect( mod.defaults ).to include(
674
+ environment: 'development',
675
+ )
676
+ expect( mod.defaults ).not_to include( :env )
677
+ end
678
+
679
+
680
+ it "errors when declaring duplicate settings" do
681
+ expect {
682
+ mod.configurability( :testconfig ) do
683
+ setting :environment, default: 'development'
684
+ setting :environment, default: 'production'
685
+ end
686
+ }.to raise_error( ScriptError, /collides with method/i )
687
+ end
688
+
689
+
690
+ it "errors when declaring an alias that clobbers an existing setting" do
691
+ expect {
692
+ mod.configurability( :testconfig ) do
693
+ setting :environment, default: 'development'
694
+ setting :env, alias: :environment, default: 'production'
695
+ end
696
+ }.to raise_error( ScriptError, /collides with method/i )
697
+ end
698
+
699
+
700
+ it "errors when declaring an alias that clobbers an existing alias" do
701
+ expect {
702
+ mod.configurability( :testconfig ) do
703
+ setting :host, alias: :environment, default: 'development'
704
+ setting :env, alias: :environment, default: 'production'
705
+ end
706
+ }.to raise_error( ScriptError, /collides with method/i )
707
+ end
708
+
709
+
621
710
  it "installs the current config after it's done if it's already loaded" do
622
711
  config = OpenStruct.new( testconfig: {
623
712
  environment: 'production',
@@ -667,7 +756,7 @@ describe Configurability do
667
756
  end
668
757
 
669
758
 
670
- it "supports inheritance of defaults" do
759
+ it "supports overriding defaults for child classes" do
671
760
  parent_class = Class.new
672
761
  parent_class.extend( Configurability )
673
762
  parent_class.configurability( :testconfig ) do
@@ -676,7 +765,7 @@ describe Configurability do
676
765
 
677
766
  child_class = Class.new( parent_class )
678
767
  child_class.configurability( :testconfig ) do
679
- setting :environment, default: :staging
768
+ setting_default :environment, :staging
680
769
  setting :apikey, default: 'foom'
681
770
  end
682
771
 
@@ -688,6 +777,25 @@ describe Configurability do
688
777
  end
689
778
 
690
779
 
780
+ it "uses the setting block for setting up subclass defaults" do
781
+ superclass = Class.new
782
+ superclass.extend( described_class )
783
+ superclass.configurability( :testconfig ) do
784
+ setting :data_dir, default: 'this/that' do |dir|
785
+ Pathname( dir )
786
+ end
787
+ end
788
+
789
+ subclass = Class.new( superclass )
790
+ subclass.configurability( :testconfig ) do
791
+ setting_default :data_dir, 'an/other/place'
792
+ end
793
+
794
+ expect( subclass.data_dir ).to be_a( Pathname )
795
+ expect( subclass.data_dir.to_s ).to eq( 'an/other/place' )
796
+ end
797
+
798
+
691
799
  it "allows the use of class variables instead of class-instance variables for settings on a Class" do
692
800
  superclass = Class.new
693
801
  superclass.extend( Configurability )
@@ -743,6 +851,29 @@ describe Configurability do
743
851
  }.to change { mod.use_whitelist? }.from( false ).to( true )
744
852
  end
745
853
 
854
+
855
+ it "can parse and recall comments for a setting" do
856
+ mod.configurability( :testconfig ) do
857
+ setting :use_whitelist
858
+
859
+ # Set the runtime environment
860
+ setting :environment
861
+
862
+ ##
863
+ # A multiline example
864
+ # to illustrate comments are
865
+ # unmolested.
866
+ setting :apikey do |key|
867
+ raise "Invalid API key!" unless key.nil? || key.to_s =~ /\A\p{Xdigit}{32}\z/
868
+ key
869
+ end
870
+ end
871
+
872
+ expect( mod.use_whitelist_comments ).to be_empty
873
+ expect( mod.environment_comments ).to match( /^# Set the runtime environment$/ )
874
+ expect( mod.apikey_comments.count("\n") ).to eq( 4 )
875
+ expect( mod.apikey_comments ).to match( /comments are\n# unmolested/m )
876
+ end
746
877
  end
747
878
 
748
879
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configurability
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -11,30 +11,32 @@ bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- MIID+DCCAmCgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
15
- REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMDEyMjQyMDU1MjlaFw0yMTEyMjQyMDU1
16
- MjlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
17
- hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
18
- L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
19
- M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
20
- 5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
21
- Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
22
- vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
23
- dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
24
- ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
25
- N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
26
- VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
27
- 9w0BAQsFAAOCAYEAMYegZanJi8zq7QKPT7wqXefX4C88I5JWeBHR3PvvWK0CwyMV
28
- peyiu5I13w/lYX+HUZjE4qsSpJMJFXWl4WZCOo+AMprOcf0PxfuJpxCej5D4tavf
29
- vRfhahSw7XJrcZih/3J+/UgoH7R05MJ+8LTcy3HGrB3a0vTafjm8OY7Xpa0LJDoN
30
- JDqxK321VIHyTibbKeA1hWSE6ljlQDvFbTqiCj3Ulp1jTv3TOlvRl8fqcfhxUJI0
31
- +5Q82jJODjEN+GaWs0V+NlrbU94cXwS2PH5dXogftB5YYA5Ex8A0ikZ73xns4Hdo
32
- XxdLdd92F5ovxA23j/rKe/IDwqr6FpDkU3nPXH/Qp0TVGv9zZnVJc/Z6ChkuWj8z
33
- pW7JAyyiiHZgKKDReDrA2LA7Zs3o/7KA6UtUH0FHf8LYhcK+pfHk6RtjRe65ffw+
34
- MCh97sQ/Z/MOusb5+QddBmB+k8EicXyGNl4b5L4XpL7fIQu+Y96TB3JEJlShxFD9
35
- k9FjI4d9EP54gS/4
14
+ MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
15
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
16
+ HhcNMjUwMTAxMDMzMTA5WhcNMjYwMTAxMDMzMTA5WjA+MQwwCgYDVQQDDANnZWQx
17
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
18
+ ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
19
+ 83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
20
+ ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
21
+ TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
22
+ 4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
23
+ cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
24
+ +QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
25
+ soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
26
+ /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
27
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
28
+ MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
29
+ YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQBjrBzCKWzXFigswYSPzGO8
30
+ 9atBtY/eQdcN6KCL+PTzQBD9yePGF7H/xsww3awRauP+D1VUjCFbiiC3Qb0Ww0Qd
31
+ OVA0s10T9KpZ8nb2XyKocSK7TfgDhcyr0V4H2MPxwK9SWYjGGh8z9z9HmT0i3PyX
32
+ fXOSzzEoG6u26HIOg0nxSpitEjiAHBekQxy9ka5NuQbxoxMg+eIHU4rU9IUhu0Rf
33
+ wl4wuvPVE3UQK0v0uqT6rJukEKQ1iNgK5R8klgEIv79XhQPgTkMt31FGfrwOp6HB
34
+ OE0HMwOwY9B0w3aOxxdMQyyRxaZVv3eWE5RimQI7T0TUaxPngtS33ByMZjTeidxi
35
+ ESIUEPVXoBCkFgLW1EVlBb+rG7WLYod4eVll4tKA42Bi2Ju90tqiJ1YQiyuRfCnp
36
+ 8qAqdfV+4u6Huu1KzAuDQCheyEyISsLST37sU/irV3czV6BiFipWag1XiJciRT3A
37
+ wZqCfTNVHTdtsCbfdA1DsA3RdG2iEH3TOHzv1Rqzqh4=
36
38
  -----END CERTIFICATE-----
37
- date: 2020-12-28 00:00:00.000000000 Z
39
+ date: 2025-01-29 00:00:00.000000000 Z
38
40
  dependencies:
39
41
  - !ruby/object:Gem::Dependency
40
42
  name: loggability
@@ -50,6 +52,20 @@ dependencies:
50
52
  - - "~>"
51
53
  - !ruby/object:Gem::Version
52
54
  version: '0.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: prism
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
53
69
  - !ruby/object:Gem::Dependency
54
70
  name: rake-deveiate
55
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,9 +110,8 @@ dependencies:
94
110
  version: '3.9'
95
111
  description: Configurability is a unified, non-intrusive, assume-nothing configuration
96
112
  system for Ruby. It lets you keep the configuration for multiple objects in a single
97
- config file, load the file when it&#39;s convenient for you, and distribute the
98
- configuration when you&#39;re ready, sending it everywhere it needs to go with a
99
- single action.
113
+ config file, load the file when its convenient for you, and distribute the configuration
114
+ when youre ready, sending it everywhere it needs to go with a single action.
100
115
  email:
101
116
  - ged@faeriemud.org
102
117
  - mahlon@martini.nu
@@ -146,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
161
  - !ruby/object:Gem::Version
147
162
  version: '0'
148
163
  requirements: []
149
- rubygems_version: 3.2.3
164
+ rubygems_version: 3.5.22
150
165
  signing_key:
151
166
  specification_version: 4
152
167
  summary: Configurability is a unified, non-intrusive, assume-nothing configuration
metadata.gz.sig CHANGED
Binary file