gourami 1.3.0 → 1.3.1
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/.ruby-version +1 -0
 - data/README.md +57 -5
 - data/lib/gourami/attributes.rb +25 -4
 - data/lib/gourami/coercer.rb +9 -0
 - data/lib/gourami/version.rb +1 -1
 - metadata +6 -5
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 471278c6d8c858485bdec0d124139f3ccd4251eedbad1573059dcf4519ec9b0a
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 2e62de42a3eb36e05cd247bed62ccb7f7bfecb796318a1b0c5dfeb79ce6b28bf
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: '09d6304054c99cbf3587005dfc38c8fef568dff2339cfc1ae41642bacbf4c80da1a91c54bc435b90253ac01d7c72927f516b945838db698d33df7250bb686499'
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e33e55074af37d7776329feb8a491687ab43dea237d5ce96cd4dd9ff1d80f6a580b43b6015021c69a9444d48f788bcd1bd16c512f07da4f6377f3a19d0682ea8
         
     | 
    
        data/.ruby-version
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            2.5.3
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,5 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Gourami
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            [](https://app.codeship.com/projects/320673)
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
            Keep your Routes, Controllers and Models thin with Plain Old Ruby Objects (PORO).
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            ## Installation
         
     | 
| 
         @@ -12,7 +14,7 @@ gem 'gourami' 
     | 
|
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
            And then execute:
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                $ bundle
         
     | 
| 
      
 17 
     | 
    
         
            +
                $ bundle install
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
19 
     | 
    
         
             
            Or install it yourself as:
         
     | 
| 
       18 
20 
     | 
    
         | 
| 
         @@ -20,10 +22,10 @@ Or install it yourself as: 
     | 
|
| 
       20 
22 
     | 
    
         | 
| 
       21 
23 
     | 
    
         
             
            ## Usage
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
            ### A Typical Gourami::Form will
         
     | 
| 
      
 25 
     | 
    
         
            +
            ### A Typical `Gourami::Form` will
         
     | 
| 
       24 
26 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
             - Define  
     | 
| 
       26 
     | 
    
         
            -
             - Validate  
     | 
| 
      
 27 
     | 
    
         
            +
             - Define attributes (inputs & outputs)
         
     | 
| 
      
 28 
     | 
    
         
            +
             - Validate input
         
     | 
| 
       27 
29 
     | 
    
         
             
             - Perform an action
         
     | 
| 
       28 
30 
     | 
    
         | 
| 
       29 
31 
     | 
    
         
             
            ```ruby
         
     | 
| 
         @@ -173,6 +175,56 @@ class UpdateFishBowl < CreateFishBowl 
     | 
|
| 
       173 
175 
     | 
    
         
             
            end
         
     | 
| 
       174 
176 
     | 
    
         
             
            ```
         
     | 
| 
       175 
177 
     | 
    
         | 
| 
      
 178 
     | 
    
         
            +
            #### Configure default attribute options
         
     | 
| 
      
 179 
     | 
    
         
            +
             
     | 
| 
      
 180 
     | 
    
         
            +
            The following examples will result in all `:string` attributes getting the options `:strip` and `:upcase` set to `true`.
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
            Set global defaults:
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 185 
     | 
    
         
            +
            Gourami::Form.set_default_attribute_options(:string, upcase: true)
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
            # Make sure to define CreateFishBowl and other forms AFTER setting default options.
         
     | 
| 
      
 188 
     | 
    
         
            +
            class CreateFishBowl < Gourami::Form
         
     | 
| 
      
 189 
     | 
    
         
            +
              attribute(:name, type: :string)
         
     | 
| 
      
 190 
     | 
    
         
            +
            end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
            form = CreateFishBowl.new(name: "Snake Gyllenhaal")
         
     | 
| 
      
 193 
     | 
    
         
            +
            form.name # => "SNAKE GYLLENHAAL"
         
     | 
| 
      
 194 
     | 
    
         
            +
            ```
         
     | 
| 
      
 195 
     | 
    
         
            +
             
     | 
| 
      
 196 
     | 
    
         
            +
            Instead of global defaults, you can also apply defaults to certain form classes.
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
            Just as `attributes` are inherited by subclasses, so are `default_attribute_options`.
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
            Set local defaults:
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 203 
     | 
    
         
            +
            class ScreamingForm < Gourami::Form
         
     | 
| 
      
 204 
     | 
    
         
            +
              set_default_attribute_options(:string, upcase: true)
         
     | 
| 
      
 205 
     | 
    
         
            +
            end
         
     | 
| 
      
 206 
     | 
    
         
            +
             
     | 
| 
      
 207 
     | 
    
         
            +
            class CreateScreamingFish < ScreamingForm
         
     | 
| 
      
 208 
     | 
    
         
            +
              attribute(:name, type: :string)
         
     | 
| 
      
 209 
     | 
    
         
            +
            end
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
            class UpdateScreamingFish < CreateScreamingFish; end
         
     | 
| 
      
 212 
     | 
    
         
            +
             
     | 
| 
      
 213 
     | 
    
         
            +
            create_form = CreateScreamingFish.new(name: "Snake Gyllenhaal")
         
     | 
| 
      
 214 
     | 
    
         
            +
            create_form.name # => "SNAKE GYLLENHAAL"
         
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
            update_form = UpdateScreamingFish.new(name: "Snake Gyllenhaal")
         
     | 
| 
      
 217 
     | 
    
         
            +
            update_form.name # => "SNAKE GYLLENHAAL"
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
      
 219 
     | 
    
         
            +
            # Other Gourami::Forms are unaffected
         
     | 
| 
      
 220 
     | 
    
         
            +
            class RegularForm < Gourami::Form
         
     | 
| 
      
 221 
     | 
    
         
            +
              attribute(:name, type: :string)
         
     | 
| 
      
 222 
     | 
    
         
            +
            end
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
            regular_form = RegularForm.new(name: "Snake Gyllenhaal")
         
     | 
| 
      
 225 
     | 
    
         
            +
            regular_form.name # => "Snake Gyllenhaal"
         
     | 
| 
      
 226 
     | 
    
         
            +
            ```
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
       176 
228 
     | 
    
         
             
            #### Extensions / Plugins
         
     | 
| 
       177 
229 
     | 
    
         | 
| 
       178 
230 
     | 
    
         
             
            ##### Gourami::Extensions::Changes
         
     | 
| 
         @@ -250,7 +302,7 @@ end 
     | 
|
| 
       250 
302 
     | 
    
         | 
| 
       251 
303 
     | 
    
         
             
            ## Development
         
     | 
| 
       252 
304 
     | 
    
         | 
| 
       253 
     | 
    
         
            -
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         
     | 
| 
      
 305 
     | 
    
         
            +
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests, or `rake test:watch` to automatically rerun the tests when you make code changes. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         
     | 
| 
       254 
306 
     | 
    
         | 
| 
       255 
307 
     | 
    
         
             
            To install this gem onto your local machine, run `bundle exec rake install`.
         
     | 
| 
       256 
308 
     | 
    
         | 
    
        data/lib/gourami/attributes.rb
    CHANGED
    
    | 
         @@ -9,6 +9,7 @@ module Gourami 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  def inherited(klass)
         
     | 
| 
       10 
10 
     | 
    
         
             
                    super(klass)
         
     | 
| 
       11 
11 
     | 
    
         
             
                    klass.instance_variable_set(:@attributes, attributes.dup)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    klass.instance_variable_set(:@default_attribute_options, default_attribute_options.dup)
         
     | 
| 
       12 
13 
     | 
    
         
             
                  end
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                  # Define an attribute for the form.
         
     | 
| 
         @@ -25,15 +26,17 @@ module Gourami 
     | 
|
| 
       25 
26 
     | 
    
         
             
                    options = options.dup
         
     | 
| 
       26 
27 
     | 
    
         
             
                    options[:default] = default_block if block_given?
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
                    options_with_defaults = merge_default_attribute_options(options)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
       28 
31 
     | 
    
         
             
                    mixin = Module.new do |mixin|
         
     | 
| 
       29 
     | 
    
         
            -
                      unless  
     | 
| 
       30 
     | 
    
         
            -
                        if !base.attributes.key?(name) && base.instance_methods.include?(name) && ! 
     | 
| 
      
 32 
     | 
    
         
            +
                      unless options_with_defaults[:skip_reader]
         
     | 
| 
      
 33 
     | 
    
         
            +
                        if !base.attributes.key?(name) && base.instance_methods.include?(name) && !options_with_defaults[:override_reader]
         
     | 
| 
       31 
34 
     | 
    
         
             
                          raise AttributeNameConflictError, "#{name} is already a method. To use the existing method, use `:skip_reader => true` option. To override the existing method, use `:override_reader => true` option."
         
     | 
| 
       32 
35 
     | 
    
         
             
                        end
         
     | 
| 
       33 
36 
     | 
    
         | 
| 
       34 
37 
     | 
    
         
             
                        mixin.send(:define_method, :"#{name}") do
         
     | 
| 
       35 
38 
     | 
    
         
             
                          value = instance_variable_get(:"@#{name}")
         
     | 
| 
       36 
     | 
    
         
            -
                          default =  
     | 
| 
      
 39 
     | 
    
         
            +
                          default = options_with_defaults[:default]
         
     | 
| 
       37 
40 
     | 
    
         | 
| 
       38 
41 
     | 
    
         
             
                          if value.nil? && default
         
     | 
| 
       39 
42 
     | 
    
         
             
                            default.respond_to?(:call) ? instance_exec(&default) : default
         
     | 
| 
         @@ -51,7 +54,7 @@ module Gourami 
     | 
|
| 
       51 
54 
     | 
    
         | 
| 
       52 
55 
     | 
    
         
             
                      # Define internal setter.
         
     | 
| 
       53 
56 
     | 
    
         
             
                      mixin.send(:define_method, :"_#{name}=") do |value|
         
     | 
| 
       54 
     | 
    
         
            -
                        instance_variable_set(:"@#{name}", setter_filter(name, value, options))
         
     | 
| 
      
 57 
     | 
    
         
            +
                        instance_variable_set(:"@#{name}", setter_filter(name, value, self.class.merge_default_attribute_options(options)))
         
     | 
| 
       55 
58 
     | 
    
         
             
                      end
         
     | 
| 
       56 
59 
     | 
    
         
             
                      mixin.send(:private, :"_#{name}=")
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
         @@ -90,6 +93,24 @@ module Gourami 
     | 
|
| 
       90 
93 
     | 
    
         
             
                  def attributes
         
     | 
| 
       91 
94 
     | 
    
         
             
                    @attributes ||= {}
         
     | 
| 
       92 
95 
     | 
    
         
             
                  end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                  # Useful if you want, for example, all type: :string attributes to use
         
     | 
| 
      
 98 
     | 
    
         
            +
                  # strip: true to remove whitespace padding.
         
     | 
| 
      
 99 
     | 
    
         
            +
                  def set_default_attribute_options(attr_type, options)
         
     | 
| 
      
 100 
     | 
    
         
            +
                    default_attribute_options[attr_type] = options
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                  def default_attribute_options
         
     | 
| 
      
 104 
     | 
    
         
            +
                    @default_attribute_options ||= {}
         
     | 
| 
      
 105 
     | 
    
         
            +
                  end
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                  def merge_default_attribute_options(options)
         
     | 
| 
      
 108 
     | 
    
         
            +
                    if options[:type]
         
     | 
| 
      
 109 
     | 
    
         
            +
                      default_attribute_options.fetch(options[:type], {}).merge(options)
         
     | 
| 
      
 110 
     | 
    
         
            +
                    else
         
     | 
| 
      
 111 
     | 
    
         
            +
                      options
         
     | 
| 
      
 112 
     | 
    
         
            +
                    end
         
     | 
| 
      
 113 
     | 
    
         
            +
                  end
         
     | 
| 
       93 
114 
     | 
    
         
             
                end
         
     | 
| 
       94 
115 
     | 
    
         | 
| 
       95 
116 
     | 
    
         
             
                # Extend ClassMethods into including class.
         
     | 
    
        data/lib/gourami/coercer.rb
    CHANGED
    
    | 
         @@ -33,6 +33,9 @@ module Gourami 
     | 
|
| 
       33 
33 
     | 
    
         
             
                  end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                  value = value.to_s.dup.force_encoding(Encoding::UTF_8)
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  # TODO: Instead of providing unconfigurable defaults like this, use
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # set_default_attribute_options at the gem level or consumer level.
         
     | 
| 
       36 
39 
     | 
    
         
             
                  value.strip! if options.fetch(:strip, true)
         
     | 
| 
       37 
40 
     | 
    
         
             
                  value.upcase! if options.fetch(:upcase, false)
         
     | 
| 
       38 
41 
     | 
    
         | 
| 
         @@ -84,6 +87,9 @@ module Gourami 
     | 
|
| 
       84 
87 
     | 
    
         
             
                    element_type_options = {}
         
     | 
| 
       85 
88 
     | 
    
         
             
                  end
         
     | 
| 
       86 
89 
     | 
    
         | 
| 
      
 90 
     | 
    
         
            +
                  element_type_options[:type] = element_type
         
     | 
| 
      
 91 
     | 
    
         
            +
                  element_type_options = self.class.merge_default_attribute_options(element_type_options) if self.class.respond_to?(:merge_default_attribute_options)
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
       87 
93 
     | 
    
         
             
                  coercer_method_name = :"coerce_#{element_type}"
         
     | 
| 
       88 
94 
     | 
    
         | 
| 
       89 
95 
     | 
    
         
             
                  value.map do |array_element|
         
     | 
| 
         @@ -149,6 +155,9 @@ module Gourami 
     | 
|
| 
       149 
155 
     | 
    
         
             
                      value_type_options = {}
         
     | 
| 
       150 
156 
     | 
    
         
             
                    end
         
     | 
| 
       151 
157 
     | 
    
         | 
| 
      
 158 
     | 
    
         
            +
                    value_type_options[:type] = value_type
         
     | 
| 
      
 159 
     | 
    
         
            +
                    value_type_options = self.class.merge_default_attribute_options(value_type_options) if self.class.respond_to?(:merge_default_attribute_options)
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
       152 
161 
     | 
    
         
             
                    value = send(:"coerce_#{value_type}", value, value_type_options) if value_type
         
     | 
| 
       153 
162 
     | 
    
         | 
| 
       154 
163 
     | 
    
         
             
                    coerced_hash[key] = value
         
     | 
    
        data/lib/gourami/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: gourami
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.3.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - TSMMark
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire: 
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020-06 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-10-06 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: activesupport
         
     | 
| 
         @@ -89,6 +89,7 @@ extensions: [] 
     | 
|
| 
       89 
89 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
       90 
90 
     | 
    
         
             
            files:
         
     | 
| 
       91 
91 
     | 
    
         
             
            - ".gitignore"
         
     | 
| 
      
 92 
     | 
    
         
            +
            - ".ruby-version"
         
     | 
| 
       92 
93 
     | 
    
         
             
            - ".travis.yml"
         
     | 
| 
       93 
94 
     | 
    
         
             
            - CODE_OF_CONDUCT.md
         
     | 
| 
       94 
95 
     | 
    
         
             
            - Gemfile
         
     | 
| 
         @@ -118,7 +119,7 @@ homepage: http://github.com/Vydia/gourami 
     | 
|
| 
       118 
119 
     | 
    
         
             
            licenses:
         
     | 
| 
       119 
120 
     | 
    
         
             
            - MIT
         
     | 
| 
       120 
121 
     | 
    
         
             
            metadata: {}
         
     | 
| 
       121 
     | 
    
         
            -
            post_install_message: 
     | 
| 
      
 122 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
       122 
123 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       123 
124 
     | 
    
         
             
            require_paths:
         
     | 
| 
       124 
125 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -134,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       134 
135 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       135 
136 
     | 
    
         
             
            requirements: []
         
     | 
| 
       136 
137 
     | 
    
         
             
            rubygems_version: 3.0.4
         
     | 
| 
       137 
     | 
    
         
            -
            signing_key: 
     | 
| 
      
 138 
     | 
    
         
            +
            signing_key:
         
     | 
| 
       138 
139 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       139 
140 
     | 
    
         
             
            summary: Keep your Routes, Controllers and Models thin.
         
     | 
| 
       140 
141 
     | 
    
         
             
            test_files: []
         
     |