configurability 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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