anyway_config 2.0.6 → 2.2.2
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 +4 -4
 - data/CHANGELOG.md +241 -181
 - data/README.md +237 -12
 - data/lib/.rbnext/1995.next/anyway/config.rb +438 -0
 - data/lib/.rbnext/1995.next/anyway/dynamic_config.rb +31 -0
 - data/lib/.rbnext/1995.next/anyway/env.rb +56 -0
 - data/lib/.rbnext/1995.next/anyway/loaders/base.rb +21 -0
 - data/lib/.rbnext/1995.next/anyway/tracing.rb +181 -0
 - data/lib/.rbnext/2.7/anyway/auto_cast.rb +39 -19
 - data/lib/.rbnext/2.7/anyway/config.rb +60 -15
 - data/lib/.rbnext/2.7/anyway/rails/loaders/yaml.rb +30 -0
 - data/lib/.rbnext/2.7/anyway/rbs.rb +92 -0
 - data/lib/.rbnext/2.7/anyway/settings.rb +79 -0
 - data/lib/.rbnext/2.7/anyway/tracing.rb +1 -1
 - data/lib/.rbnext/2.7/anyway/type_casting.rb +143 -0
 - data/lib/.rbnext/3.0/anyway/auto_cast.rb +53 -0
 - data/lib/.rbnext/{2.8 → 3.0}/anyway/config.rb +60 -15
 - data/lib/.rbnext/{2.8 → 3.0}/anyway/loaders/base.rb +0 -0
 - data/lib/.rbnext/{2.8 → 3.0}/anyway/loaders.rb +0 -0
 - data/lib/.rbnext/{2.8 → 3.0}/anyway/tracing.rb +1 -1
 - data/lib/anyway/auto_cast.rb +39 -19
 - data/lib/anyway/config.rb +74 -29
 - data/lib/anyway/dynamic_config.rb +6 -2
 - data/lib/anyway/env.rb +1 -1
 - data/lib/anyway/ext/deep_dup.rb +12 -0
 - data/lib/anyway/ext/hash.rb +0 -12
 - data/lib/anyway/loaders/base.rb +1 -1
 - data/lib/anyway/loaders/env.rb +3 -1
 - data/lib/anyway/loaders/yaml.rb +9 -5
 - data/lib/anyway/option_parser_builder.rb +1 -3
 - data/lib/anyway/optparse_config.rb +5 -7
 - data/lib/anyway/rails/loaders/credentials.rb +4 -4
 - data/lib/anyway/rails/loaders/secrets.rb +6 -8
 - data/lib/anyway/rails/loaders/yaml.rb +11 -0
 - data/lib/anyway/rails/settings.rb +9 -2
 - data/lib/anyway/rbs.rb +92 -0
 - data/lib/anyway/settings.rb +52 -2
 - data/lib/anyway/tracing.rb +6 -6
 - data/lib/anyway/type_casting.rb +134 -0
 - data/lib/anyway/utils/deep_merge.rb +21 -0
 - data/lib/anyway/version.rb +1 -1
 - data/lib/anyway_config.rb +4 -0
 - data/sig/anyway_config.rbs +129 -0
 - metadata +42 -15
 - data/lib/.rbnext/2.7/anyway/option_parser_builder.rb +0 -31
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: dc95d6a5792ef79aaa6abc3156e11fb9cfe45c48637f6763d16ec5b4645667fb
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 13c6d72ce0d659945e08f2e6e457f745876338d4fdc74a94a5cd049e201b5904
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: a4bdc75c88708b8da49ced8b757e897b0bb6a8f21787ebaee65c5b154518fd343203b583542078058159c53bed0ba5700ed01f66387901a75e440e072cd3cbad
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: f6410c3f38b6d877b4ae9ba6adde192957fed52bba5943242c80420d742a266c0739c45a9105054dc04da921219a179e30ca8811b065b2dfbd70d3523d4b6f2c
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,5 +1,79 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Change log
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## master
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ## 2.2.2 (2020-10-26)
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            - Fixed regression introduced by the `#deep_merge!` refinement.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ## 2.2.1 (2020-09-28)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            - Minor fixes to the prev release.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            ## 2.2.0 ⛓ (2020-09-28)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            - Add RBS signatures and generator. ([@palkan][])
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            Anyway Config now ships with the basic RBS support. To use config types with Steep, add `library "anyway_config"` to your Steepfile.
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            We also provide an API to generate a signature for you config class: `MyConfig.to_rbs`. You can use this method to generate a scaffold for your config class.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            - Add type coercion support. ([@palkan][])
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            Example:
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 26 
     | 
    
         
            +
            class CoolConfig < Anyway::Config
         
     | 
| 
      
 27 
     | 
    
         
            +
              attr_config :port, :user
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              coerce_types port: :string, user: {dob: :date}
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            ENV["COOL_USER__DOB"] = "1989-07-01"
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            config = CoolConfig.new({port: 8080})
         
     | 
| 
      
 35 
     | 
    
         
            +
            config.port == "8080" #=> true
         
     | 
| 
      
 36 
     | 
    
         
            +
            config.user["dob"] == Date.new(1989, 7, 1) #=> true
         
     | 
| 
      
 37 
     | 
    
         
            +
            ```
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            You can also add `.disable_auto_cast!` to your config class to disable automatic conversion.
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            **Warning** Now values from all sources are coerced (e.g., YAML files). That could lead to a different behaviour.
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            - Do not dup modules/classes passed as configuration values. ([@palkan][])
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            - Handle loading empty YAML config files. ([@micahlee][])
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            ## 2.1.0 (2020-12-29)
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            - Drop deprecated `attr_config` instance variables support.
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            Config setters no longer write instance variables.
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            - Add `config.anyway_config.future` to allow enabling upcoming features. ([@palkan][])
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            For smoother upgrades, we provide a mechanism to opt-out to the new defaults beforehand.
         
     | 
| 
      
 56 
     | 
    
         
            +
            Currently, only `:unwrap_known_environments` feature could be enabled (see below):
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 59 
     | 
    
         
            +
            config.anyway_config.future.use :unwrap_known_environments
         
     | 
| 
      
 60 
     | 
    
         
            +
            ```
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            - Allow to skip environment keys completely (e.g., `development:`, `test:`) in a config YML when used with Rails. In that case same config is loaded in all known environments (same mechanism as for non-Rails applications)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            - Add the `known_environments` property to Anyway::Settings under Rails. Use `config.anyway_config.known_environments << "staging"` to make the gem aware of custom environments. ([@progapandist][])
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            - Make it possible to specify default YML configs directory. ([@palkan][])
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
            For example:
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 71 
     | 
    
         
            +
            Anyway::Settings.default_config_path = "path/to/configs"
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            # or in Rails
         
     | 
| 
      
 74 
     | 
    
         
            +
            config.anyway_config.default_config_path = Rails.root.join("my/configs")
         
     | 
| 
      
 75 
     | 
    
         
            +
            ```
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
       3 
77 
     | 
    
         
             
            ## 2.0.6 (2020-07-7)
         
     | 
| 
       4 
78 
     | 
    
         | 
| 
       5 
79 
     | 
    
         
             
            - Fix Ruby 2.7 warnings. ([@palkan][])
         
     | 
| 
         @@ -20,13 +94,13 @@ 
     | 
|
| 
       20 
94 
     | 
    
         | 
| 
       21 
95 
     | 
    
         
             
            - Make sure configs are eager loaded in Rails when `config.eager_load = true`. ([@palkan][])
         
     | 
| 
       22 
96 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 97 
     | 
    
         
            +
            Fixes [#58](https://github.com/palkan/anyway_config/issues/58).
         
     | 
| 
       24 
98 
     | 
    
         | 
| 
       25 
99 
     | 
    
         
             
            ## 2.0.1 (2020-04-15)
         
     | 
| 
       26 
100 
     | 
    
         | 
| 
       27 
101 
     | 
    
         
             
            - Fix loading Railtie when application has been already initialized. ([@palkan][])
         
     | 
| 
       28 
102 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
      
 103 
     | 
    
         
            +
            Fixes [#56](https://github.com/palkan/anyway_config/issues/56).
         
     | 
| 
       30 
104 
     | 
    
         | 
| 
       31 
105 
     | 
    
         
             
            ## 2.0.0 (2020-04-14)
         
     | 
| 
       32 
106 
     | 
    
         | 
| 
         @@ -36,166 +110,166 @@ 
     | 
|
| 
       36 
110 
     | 
    
         | 
| 
       37 
111 
     | 
    
         
             
            - Add predicate methods for attributes with boolean defaults. ([@palkan][])
         
     | 
| 
       38 
112 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 113 
     | 
    
         
            +
            For example:
         
     | 
| 
       40 
114 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
      
 115 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 116 
     | 
    
         
            +
            class MyConfig < Anyway::Config
         
     | 
| 
      
 117 
     | 
    
         
            +
              attr_config :key, :secret, debug: false
         
     | 
| 
      
 118 
     | 
    
         
            +
            end
         
     | 
| 
       45 
119 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
      
 120 
     | 
    
         
            +
            MyConfig.new.debug? #=> false
         
     | 
| 
      
 121 
     | 
    
         
            +
            MyConfig.new(debug: true).debug? #=> true
         
     | 
| 
      
 122 
     | 
    
         
            +
            ```
         
     | 
| 
       49 
123 
     | 
    
         | 
| 
       50 
124 
     | 
    
         
             
            - Add `Config#deconstruct_keys`. ([@palkan][])
         
     | 
| 
       51 
125 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 126 
     | 
    
         
            +
            Now you can use configs in pattern matching:
         
     | 
| 
       53 
127 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 128 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 129 
     | 
    
         
            +
            case AWSConfig.new
         
     | 
| 
      
 130 
     | 
    
         
            +
            in bucket:, region: "eu-west-1"
         
     | 
| 
      
 131 
     | 
    
         
            +
              setup_eu_storage(bucket)
         
     | 
| 
      
 132 
     | 
    
         
            +
            in bucket:, region: "us-east-1"
         
     | 
| 
      
 133 
     | 
    
         
            +
              setup_us_storage(bucket)
         
     | 
| 
      
 134 
     | 
    
         
            +
            end
         
     | 
| 
      
 135 
     | 
    
         
            +
            ```
         
     | 
| 
       62 
136 
     | 
    
         | 
| 
       63 
137 
     | 
    
         
             
            - Add pretty_print support. ([@palkan][])
         
     | 
| 
       64 
138 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
      
 139 
     | 
    
         
            +
            Whenever you use `pp`, the output would contain pretty formatted config information
         
     | 
| 
      
 140 
     | 
    
         
            +
            including the sources.
         
     | 
| 
       67 
141 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
      
 142 
     | 
    
         
            +
            Example:
         
     | 
| 
       69 
143 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
      
 144 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 145 
     | 
    
         
            +
            pp CoolConfig.new
         
     | 
| 
       72 
146 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
      
 147 
     | 
    
         
            +
            # #<CoolConfig
         
     | 
| 
      
 148 
     | 
    
         
            +
            #   config_name="cool"
         
     | 
| 
      
 149 
     | 
    
         
            +
            #   env_prefix="COOL"
         
     | 
| 
      
 150 
     | 
    
         
            +
            #   values:
         
     | 
| 
      
 151 
     | 
    
         
            +
            #     port => 3334 (type=load),
         
     | 
| 
      
 152 
     | 
    
         
            +
            #     host => "test.host" (type=yml path=./config/cool.yml),
         
     | 
| 
      
 153 
     | 
    
         
            +
            #     user =>
         
     | 
| 
      
 154 
     | 
    
         
            +
            #       name => "john" (type=env key=COOL_USER__NAME),
         
     | 
| 
      
 155 
     | 
    
         
            +
            #       password => "root" (type=yml path=./config/cool.yml)>
         
     | 
| 
      
 156 
     | 
    
         
            +
            ```
         
     | 
| 
       83 
157 
     | 
    
         | 
| 
       84 
158 
     | 
    
         
             
            - Add source tracing support. ([@palkan][])
         
     | 
| 
       85 
159 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
      
 160 
     | 
    
         
            +
            You can get the information on where a particular parameter value came from
         
     | 
| 
      
 161 
     | 
    
         
            +
            (which loader) through via `#to_source_trace` method:
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 164 
     | 
    
         
            +
            conf = MyConfig.new
         
     | 
| 
      
 165 
     | 
    
         
            +
            conf.to_source_trace
         
     | 
| 
      
 166 
     | 
    
         
            +
            # {
         
     | 
| 
      
 167 
     | 
    
         
            +
            #  "host" => {value: "test.host", source: {type: :user, called_from: "/rails/root/config/application.rb:21"}},
         
     | 
| 
      
 168 
     | 
    
         
            +
            #  "user" => {
         
     | 
| 
      
 169 
     | 
    
         
            +
            #    "name" => {value: "john", source: {type: :env, key: "COOL_USER__NAME"}},
         
     | 
| 
      
 170 
     | 
    
         
            +
            #    "password" => {value: "root", source: {type: :yml, path: "config/cool.yml"}}
         
     | 
| 
      
 171 
     | 
    
         
            +
            #  },
         
     | 
| 
      
 172 
     | 
    
         
            +
            #  "port" => {value: 9292, source: {type: :defaults}}
         
     | 
| 
      
 173 
     | 
    
         
            +
            # }
         
     | 
| 
      
 174 
     | 
    
         
            +
            ```
         
     | 
| 
       101 
175 
     | 
    
         | 
| 
       102 
176 
     | 
    
         
             
            - Change the way Rails configs autoloading works. ([@palkan][])
         
     | 
| 
       103 
177 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
      
 178 
     | 
    
         
            +
            In Rails 6, autoloading before initialization is [deprecated](https://github.com/rails/rails/commit/3e66ba91d511158e22f90ff96b594d61f40eda01). We can still
         
     | 
| 
      
 179 
     | 
    
         
            +
            make it work by using our own autoloading mechanism (custom Zeitwerk loader).
         
     | 
| 
       106 
180 
     | 
    
         | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
            This forces us to use a custom directory (not `app/`) for configs required at the boot time.
         
     | 
| 
      
 182 
     | 
    
         
            +
            By default, we put _static_ configs into `config/configs` but you can still use `app/configs` for
         
     | 
| 
      
 183 
     | 
    
         
            +
            _dynamic_ (runtime) configs.
         
     | 
| 
       110 
184 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
      
 185 
     | 
    
         
            +
            **NOTE:** if you used `app/configs` with 2.0.0.preX and relied on configs during initialization,
         
     | 
| 
      
 186 
     | 
    
         
            +
            you can set static configs path to `app/configs`:
         
     | 
| 
       113 
187 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
      
 188 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 189 
     | 
    
         
            +
            config.anyway_config.autoload_static_config_path = "app/configs"
         
     | 
| 
      
 190 
     | 
    
         
            +
            ```
         
     | 
| 
       117 
191 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
      
 192 
     | 
    
         
            +
            You can do this by running the generator:
         
     | 
| 
       119 
193 
     | 
    
         | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
      
 194 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 195 
     | 
    
         
            +
            rails g anyway:install --configs-path=app/configs
         
     | 
| 
      
 196 
     | 
    
         
            +
            ```
         
     | 
| 
       123 
197 
     | 
    
         | 
| 
       124 
198 
     | 
    
         
             
            - Add Rails generators. ([@palkan][])
         
     | 
| 
       125 
199 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
      
 200 
     | 
    
         
            +
            You can create config classes with the predefined attributes like this:
         
     | 
| 
       127 
201 
     | 
    
         | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
      
 202 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 203 
     | 
    
         
            +
            rails generate config aws access_key_id secret_access_key region
         
     | 
| 
      
 204 
     | 
    
         
            +
            ```
         
     | 
| 
       131 
205 
     | 
    
         | 
| 
       132 
206 
     | 
    
         
             
            - **BREAKING** The accessors generated by `attr_config` are not longer `attr_accessor`-s. ([@palkan][])
         
     | 
| 
       133 
207 
     | 
    
         | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
      
 208 
     | 
    
         
            +
            You cannot rely on instance variables anymore. Instead, you can use `super` when overriding accessors or
         
     | 
| 
      
 209 
     | 
    
         
            +
            `values[name]`:
         
     | 
| 
       136 
210 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
      
 211 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 212 
     | 
    
         
            +
            attr_config :host, :port, :url, :meta
         
     | 
| 
       139 
213 
     | 
    
         | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
      
 214 
     | 
    
         
            +
            # override writer to handle type coercion
         
     | 
| 
      
 215 
     | 
    
         
            +
            def meta=(val)
         
     | 
| 
      
 216 
     | 
    
         
            +
              super JSON.parse(val)
         
     | 
| 
      
 217 
     | 
    
         
            +
            end
         
     | 
| 
       144 
218 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
      
 219 
     | 
    
         
            +
            # or override reader to handle missing values
         
     | 
| 
      
 220 
     | 
    
         
            +
            def url
         
     | 
| 
      
 221 
     | 
    
         
            +
              values[:url] ||= "#{host}:#{port}"
         
     | 
| 
      
 222 
     | 
    
         
            +
            end
         
     | 
| 
       149 
223 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
             
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
      
 224 
     | 
    
         
            +
            # in <2.1 it's still possible to read instance variables,
         
     | 
| 
      
 225 
     | 
    
         
            +
            # i.e. the following would also work
         
     | 
| 
      
 226 
     | 
    
         
            +
            def url
         
     | 
| 
      
 227 
     | 
    
         
            +
              @url ||= "#{host}:#{port}"
         
     | 
| 
      
 228 
     | 
    
         
            +
            end
         
     | 
| 
      
 229 
     | 
    
         
            +
            ```
         
     | 
| 
       156 
230 
     | 
    
         | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
      
 231 
     | 
    
         
            +
            **NOTE**: we still set instance variables in writers (for backward compatibility), but that would
         
     | 
| 
      
 232 
     | 
    
         
            +
            be removed in 2.1.
         
     | 
| 
       159 
233 
     | 
    
         | 
| 
       160 
234 
     | 
    
         
             
            - Add `Config#dig` method. ([@palkan][])
         
     | 
| 
       161 
235 
     | 
    
         | 
| 
       162 
236 
     | 
    
         
             
            - Add ability to specify types for OptionParser options. ([@palkan][])
         
     | 
| 
       163 
237 
     | 
    
         | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
      
 238 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 239 
     | 
    
         
            +
            describe_options(
         
     | 
| 
      
 240 
     | 
    
         
            +
              concurrency: {
         
     | 
| 
      
 241 
     | 
    
         
            +
                desc: "number of threads to use",
         
     | 
| 
      
 242 
     | 
    
         
            +
                type: String
         
     | 
| 
      
 243 
     | 
    
         
            +
              }
         
     | 
| 
      
 244 
     | 
    
         
            +
            )
         
     | 
| 
      
 245 
     | 
    
         
            +
            ```
         
     | 
| 
       172 
246 
     | 
    
         | 
| 
       173 
247 
     | 
    
         
             
            - Add param presence validation. ([@palkan][])
         
     | 
| 
       174 
248 
     | 
    
         | 
| 
       175 
     | 
    
         
            -
             
     | 
| 
       176 
     | 
    
         
            -
             
     | 
| 
      
 249 
     | 
    
         
            +
            You can specify some params as required, and the validation
         
     | 
| 
      
 250 
     | 
    
         
            +
            error would be raised if they're missing or empty (only for strings):
         
     | 
| 
       177 
251 
     | 
    
         | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
      
 252 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 253 
     | 
    
         
            +
            class MyConfig < Anyway::Config
         
     | 
| 
      
 254 
     | 
    
         
            +
              attr_config :api_key, :api_secret, :debug
         
     | 
| 
       181 
255 
     | 
    
         | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
       183 
     | 
    
         
            -
             
     | 
| 
      
 256 
     | 
    
         
            +
              required :api_key, :api_secret
         
     | 
| 
      
 257 
     | 
    
         
            +
            end
         
     | 
| 
       184 
258 
     | 
    
         | 
| 
       185 
     | 
    
         
            -
             
     | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
      
 259 
     | 
    
         
            +
            MyConfig.new(api_secret: "") #=> raises Anyway::Config::ValidationError
         
     | 
| 
      
 260 
     | 
    
         
            +
            ```
         
     | 
| 
       187 
261 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
             
     | 
| 
      
 262 
     | 
    
         
            +
            You can change the validation behaviour by overriding the `#validate!` method in your config class.
         
     | 
| 
       189 
263 
     | 
    
         | 
| 
       190 
264 
     | 
    
         
             
            - Validate config attribute names. ([@palkan][])
         
     | 
| 
       191 
265 
     | 
    
         | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
      
 266 
     | 
    
         
            +
            Do not allow using reserved names (`Anyway::Config` method names).
         
     | 
| 
      
 267 
     | 
    
         
            +
            Allow only alphanumeric names (matching `/^[a-z_]([\w]+)?$/`).
         
     | 
| 
       194 
268 
     | 
    
         | 
| 
       195 
269 
     | 
    
         
             
            - Add Loaders API. ([@palkan][])
         
     | 
| 
       196 
270 
     | 
    
         | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
      
 271 
     | 
    
         
            +
            All config sources have standardized via _loaders_ API. It's possible to define
         
     | 
| 
      
 272 
     | 
    
         
            +
            custom loaders or change the sources order.
         
     | 
| 
       199 
273 
     | 
    
         | 
| 
       200 
274 
     | 
    
         
             
            ## 2.0.0.pre2 (2019-04-26)
         
     | 
| 
       201 
275 
     | 
    
         | 
| 
         @@ -205,73 +279,58 @@ 
     | 
|
| 
       205 
279 
     | 
    
         | 
| 
       206 
280 
     | 
    
         
             
            - **BREAKING** Changed the way of providing explicit values. ([@palkan][])
         
     | 
| 
       207 
281 
     | 
    
         | 
| 
       208 
     | 
    
         
            -
             
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
             
     | 
| 
      
 282 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 283 
     | 
    
         
            +
            # BEFORE
         
     | 
| 
      
 284 
     | 
    
         
            +
            Config.new(overrides: data)
         
     | 
| 
       211 
285 
     | 
    
         | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
       214 
     | 
    
         
            -
             
     | 
| 
      
 286 
     | 
    
         
            +
            # AFTER
         
     | 
| 
      
 287 
     | 
    
         
            +
            Config.new(data)
         
     | 
| 
      
 288 
     | 
    
         
            +
            ```
         
     | 
| 
       215 
289 
     | 
    
         | 
| 
       216 
290 
     | 
    
         
             
            - Add Railtie. ([@palkan][])
         
     | 
| 
       217 
291 
     | 
    
         | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
      
 292 
     | 
    
         
            +
            `Anyway::Railtie` provides `Anyway::Settings` access via `Rails.applicaiton.configuration.anyway_config`.
         
     | 
| 
       219 
293 
     | 
    
         | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
      
 294 
     | 
    
         
            +
            It also adds `app/configs` path to autoload paths (low-level, `ActiveSupport::Dependencies`) to
         
     | 
| 
      
 295 
     | 
    
         
            +
            make it possible to use configs in the app configuration files.
         
     | 
| 
       222 
296 
     | 
    
         | 
| 
       223 
297 
     | 
    
         
             
            - Add test helpers. ([@palkan][])
         
     | 
| 
       224 
298 
     | 
    
         | 
| 
       225 
     | 
    
         
            -
             
     | 
| 
       226 
     | 
    
         
            -
             
     | 
| 
      
 299 
     | 
    
         
            +
            Added `with_env` helper to test code in the context of the specified
         
     | 
| 
      
 300 
     | 
    
         
            +
            environment variables.
         
     | 
| 
       227 
301 
     | 
    
         | 
| 
       228 
     | 
    
         
            -
             
     | 
| 
       229 
     | 
    
         
            -
             
     | 
| 
      
 302 
     | 
    
         
            +
            Included automatically in RSpec for examples with the `type: :config` meta
         
     | 
| 
      
 303 
     | 
    
         
            +
            or with the `spec/configs` path.
         
     | 
| 
       230 
304 
     | 
    
         | 
| 
       231 
305 
     | 
    
         
             
            - Add support for _local_ files. ([@palkan][])
         
     | 
| 
       232 
306 
     | 
    
         | 
| 
       233 
     | 
    
         
            -
             
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
             
     | 
| 
      
 307 
     | 
    
         
            +
            Now users can store their personal configurations in _local_ files:
         
     | 
| 
      
 308 
     | 
    
         
            +
             
     | 
| 
      
 309 
     | 
    
         
            +
            - `<config_name>.local.yml`
         
     | 
| 
      
 310 
     | 
    
         
            +
            - `config/credentials/local.yml.enc` (for Rails 6).
         
     | 
| 
       236 
311 
     | 
    
         | 
| 
       237 
     | 
    
         
            -
             
     | 
| 
       238 
     | 
    
         
            -
             
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
      
 312 
     | 
    
         
            +
            Local configs are meant for using in development and only loaded if
         
     | 
| 
      
 313 
     | 
    
         
            +
            `Anyway::Settings.use_local_files` is `true` (which is true by default if
         
     | 
| 
      
 314 
     | 
    
         
            +
            `RACK_ENV` or `RAILS_ENV` env variable is equal to `"development"`).
         
     | 
| 
       240 
315 
     | 
    
         | 
| 
       241 
316 
     | 
    
         
             
            - Add Rails credentials support. ([@palkan][])
         
     | 
| 
       242 
317 
     | 
    
         | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
      
 318 
     | 
    
         
            +
            The data from credentials is loaded after the data from YAML config and secrets,
         
     | 
| 
      
 319 
     | 
    
         
            +
            but before environmental variables (i.e. env variables are _stronger_)
         
     | 
| 
       245 
320 
     | 
    
         | 
| 
       246 
321 
     | 
    
         
             
            - Update config name inference logic. ([@palkan][])
         
     | 
| 
       247 
322 
     | 
    
         | 
| 
       248 
     | 
    
         
            -
             
     | 
| 
       249 
     | 
    
         
            -
              - the class name has a form of `<Module>::Config` (`SomeModule::Config => "some_module"`)
         
     | 
| 
       250 
     | 
    
         
            -
              - the class name has a form of `<Something>Config` (`SomeConfig => "some"`)
         
     | 
| 
       251 
     | 
    
         
            -
             
     | 
| 
       252 
     | 
    
         
            -
            - Fix config classes inheritance. ([@palkan][])
         
     | 
| 
      
 323 
     | 
    
         
            +
            Config name is automatically inferred only if:
         
     | 
| 
       253 
324 
     | 
    
         | 
| 
       254 
     | 
    
         
            -
             
     | 
| 
       255 
     | 
    
         
            -
             
     | 
| 
      
 325 
     | 
    
         
            +
            - the class name has a form of `<Module>::Config` (`SomeModule::Config => "some_module"`)
         
     | 
| 
      
 326 
     | 
    
         
            +
            - the class name has a form of `<Something>Config` (`SomeConfig => "some"`)
         
     | 
| 
       256 
327 
     | 
    
         | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
             
     | 
| 
       259 
     | 
    
         
            -
              Noticeable features:
         
     | 
| 
       260 
     | 
    
         
            -
              - if `config_name` is explicitly defined on class, it's inherited by subclasses:
         
     | 
| 
       261 
     | 
    
         
            -
             
     | 
| 
       262 
     | 
    
         
            -
              ```ruby
         
     | 
| 
       263 
     | 
    
         
            -
              class MyAppBaseConfig < Anyway::Config
         
     | 
| 
       264 
     | 
    
         
            -
                config_name :my_app
         
     | 
| 
       265 
     | 
    
         
            -
              end
         
     | 
| 
       266 
     | 
    
         
            -
             
     | 
| 
       267 
     | 
    
         
            -
              class MyServiceConfig < MyAppBaseConfig
         
     | 
| 
       268 
     | 
    
         
            -
              end
         
     | 
| 
      
 328 
     | 
    
         
            +
            - Fix config classes inheritance. ([@palkan][])
         
     | 
| 
       269 
329 
     | 
    
         | 
| 
       270 
     | 
    
         
            -
             
     | 
| 
       271 
     | 
    
         
            -
             
     | 
| 
      
 330 
     | 
    
         
            +
            Previously, inheritance didn't work due to the lack of proper handling of class-level
         
     | 
| 
      
 331 
     | 
    
         
            +
            configuration (naming, option parses settings, defaults).
         
     | 
| 
       272 
332 
     | 
    
         | 
| 
       273 
     | 
    
         
            -
             
     | 
| 
       274 
     | 
    
         
            -
              - option parse extension are not overriden, but added to the parent class extensions
         
     | 
| 
      
 333 
     | 
    
         
            +
            Now it's possible to extend config classes without breaking the original classes functionality.
         
     | 
| 
       275 
334 
     | 
    
         | 
| 
       276 
335 
     | 
    
         
             
            - **Require Ruby >= 2.5.0.**
         
     | 
| 
       277 
336 
     | 
    
         | 
| 
         @@ -291,26 +350,26 @@ 
     | 
|
| 
       291 
350 
     | 
    
         | 
| 
       292 
351 
     | 
    
         
             
            - Add OptionParse integration ([@jastkand][])
         
     | 
| 
       293 
352 
     | 
    
         | 
| 
       294 
     | 
    
         
            -
             
     | 
| 
      
 353 
     | 
    
         
            +
            See more [PR#18](https://github.com/palkan/anyway_config/pull/18).
         
     | 
| 
       295 
354 
     | 
    
         | 
| 
       296 
355 
     | 
    
         
             
            - Use underscored config name as an env prefix. ([@palkan][])
         
     | 
| 
       297 
356 
     | 
    
         | 
| 
       298 
     | 
    
         
            -
             
     | 
| 
      
 357 
     | 
    
         
            +
            For a config class:
         
     | 
| 
       299 
358 
     | 
    
         | 
| 
       300 
     | 
    
         
            -
             
     | 
| 
       301 
     | 
    
         
            -
             
     | 
| 
       302 
     | 
    
         
            -
             
     | 
| 
       303 
     | 
    
         
            -
             
     | 
| 
      
 359 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 360 
     | 
    
         
            +
            class MyApp < Anyway::Config
         
     | 
| 
      
 361 
     | 
    
         
            +
            end
         
     | 
| 
      
 362 
     | 
    
         
            +
            ```
         
     | 
| 
       304 
363 
     | 
    
         | 
| 
       305 
     | 
    
         
            -
             
     | 
| 
      
 364 
     | 
    
         
            +
            Before this change we use `MYAPP_` prefix, now it's `MY_APP_`.
         
     | 
| 
       306 
365 
     | 
    
         | 
| 
       307 
     | 
    
         
            -
             
     | 
| 
      
 366 
     | 
    
         
            +
            You can specify the prefix explicitly:
         
     | 
| 
       308 
367 
     | 
    
         | 
| 
       309 
     | 
    
         
            -
             
     | 
| 
       310 
     | 
    
         
            -
             
     | 
| 
       311 
     | 
    
         
            -
             
     | 
| 
       312 
     | 
    
         
            -
             
     | 
| 
       313 
     | 
    
         
            -
             
     | 
| 
      
 368 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 369 
     | 
    
         
            +
            class MyApp < Anyway::Config
         
     | 
| 
      
 370 
     | 
    
         
            +
              env_prefix "MYAPP_"
         
     | 
| 
      
 371 
     | 
    
         
            +
            end
         
     | 
| 
      
 372 
     | 
    
         
            +
            ```
         
     | 
| 
       314 
373 
     | 
    
         | 
| 
       315 
374 
     | 
    
         
             
            ## 1.3.0 (2018-06-15)
         
     | 
| 
       316 
375 
     | 
    
         | 
| 
         @@ -326,18 +385,18 @@ Now works on JRuby 9.1+. 
     | 
|
| 
       326 
385 
     | 
    
         | 
| 
       327 
386 
     | 
    
         
             
            - Allow to pass raw hash with explicit values to `Config.new`. ([@dsalahutdinov][])
         
     | 
| 
       328 
387 
     | 
    
         | 
| 
       329 
     | 
    
         
            -
             
     | 
| 
      
 388 
     | 
    
         
            +
            Example:
         
     | 
| 
       330 
389 
     | 
    
         | 
| 
       331 
     | 
    
         
            -
             
     | 
| 
       332 
     | 
    
         
            -
             
     | 
| 
       333 
     | 
    
         
            -
             
     | 
| 
       334 
     | 
    
         
            -
             
     | 
| 
       335 
     | 
    
         
            -
             
     | 
| 
       336 
     | 
    
         
            -
             
     | 
| 
       337 
     | 
    
         
            -
             
     | 
| 
       338 
     | 
    
         
            -
             
     | 
| 
      
 390 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 391 
     | 
    
         
            +
            Sniffer::Config.new(
         
     | 
| 
      
 392 
     | 
    
         
            +
              overrides: {
         
     | 
| 
      
 393 
     | 
    
         
            +
                enabled: true,
         
     | 
| 
      
 394 
     | 
    
         
            +
                storage: {capacity: 500}
         
     | 
| 
      
 395 
     | 
    
         
            +
              }
         
     | 
| 
      
 396 
     | 
    
         
            +
            )
         
     | 
| 
      
 397 
     | 
    
         
            +
            ```
         
     | 
| 
       339 
398 
     | 
    
         | 
| 
       340 
     | 
    
         
            -
             
     | 
| 
      
 399 
     | 
    
         
            +
            See more [PR#10](https://github.com/palkan/anyway_config/pull/10).
         
     | 
| 
       341 
400 
     | 
    
         | 
| 
       342 
401 
     | 
    
         
             
            ## 1.1.2 (2017-11-19)
         
     | 
| 
       343 
402 
     | 
    
         | 
| 
         @@ -351,7 +410,7 @@ Now works on JRuby 9.1+. 
     | 
|
| 
       351 
410 
     | 
    
         | 
| 
       352 
411 
     | 
    
         
             
            - Add `#to_h` method. ([@palkan][])
         
     | 
| 
       353 
412 
     | 
    
         | 
| 
       354 
     | 
    
         
            -
             
     | 
| 
      
 413 
     | 
    
         
            +
            See [#4](https://github.com/palkan/anyway_config/issues/4).
         
     | 
| 
       355 
414 
     | 
    
         | 
| 
       356 
415 
     | 
    
         
             
            - Make it possible to extend configuration parameters. ([@palkan][])
         
     | 
| 
       357 
416 
     | 
    
         | 
| 
         @@ -365,17 +424,18 @@ Now works on JRuby 9.1+. 
     | 
|
| 
       365 
424 
     | 
    
         | 
| 
       366 
425 
     | 
    
         
             
            - Drop `active_support` dependency. ([@palkan][])
         
     | 
| 
       367 
426 
     | 
    
         | 
| 
       368 
     | 
    
         
            -
             
     | 
| 
      
 427 
     | 
    
         
            +
            Use custom refinements instead of requiring `active_support`.
         
     | 
| 
       369 
428 
     | 
    
         | 
| 
       370 
     | 
    
         
            -
             
     | 
| 
      
 429 
     | 
    
         
            +
            No we're dependency-free!
         
     | 
| 
       371 
430 
     | 
    
         | 
| 
       372 
431 
     | 
    
         
             
            ## 0.1.0 (2015-01-20)
         
     | 
| 
       373 
432 
     | 
    
         | 
| 
       374 
     | 
    
         
            -
             
     | 
| 
      
 433 
     | 
    
         
            +
            - Initial version.
         
     | 
| 
       375 
434 
     | 
    
         | 
| 
       376 
435 
     | 
    
         
             
            [@palkan]: https://github.com/palkan
         
     | 
| 
       377 
436 
     | 
    
         
             
            [@onemanstartup]: https://github.com/onemanstartup
         
     | 
| 
       378 
437 
     | 
    
         
             
            [@dsalahutdinov]: https://github.com/dsalahutdinov
         
     | 
| 
       379 
438 
     | 
    
         
             
            [@charlie-wasp]: https://github.com/charlie-wasp
         
     | 
| 
       380 
439 
     | 
    
         
             
            [@jastkand]: https://github.com/jastkand
         
     | 
| 
       381 
     | 
    
         
            -
            [@ 
     | 
| 
      
 440 
     | 
    
         
            +
            [@envek]: https://github.com/Envek
         
     | 
| 
      
 441 
     | 
    
         
            +
            [@progapandist]: https://github.com/progapandist
         
     |