decanter 0.5.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a88b2e53932e63a9351db615b274f997a829bf40
4
- data.tar.gz: 4deade7c29aa9321d62600ba8b2fa7da8a207ace
3
+ metadata.gz: f0715bf7c746e8f542d5830ff831d01f2082b173
4
+ data.tar.gz: 4a2a9c5001d035801b7f5c1c86fcf579630e2c61
5
5
  SHA512:
6
- metadata.gz: 3f7aa0df7b97a57191b74a9c8d46572d35fcbf1e1ab2447bb54fbabcb636e5f8274e32480e478bb21e10be846f82643a416f3e39682ad3eda4e4082f0d11055d
7
- data.tar.gz: 6fcdc9bfb48de54cfb710a71137285067144b8d639be4ffb6bf939cfd9c8439aae1c70fb247b26990d5d3ce2621c8301ded78c5dbeb0a74772202b87457a0ed6
6
+ metadata.gz: b66f3d3a23e34d3f375aec969a6e62d6b1b0a1b8f9b41eebfef6c48872fab0010bb2a952f97c0c3a3d0d9c546fd4686972059182ddc5a3a506122fbae77e2e7f
7
+ data.tar.gz: 110960e0df21ba1c2512eae1dc77345d4df059a1851f442e9bb8709f761e6d2f23a270a71c01467f7d1dd8090f1e245a10b748b543fa2165791383208916691e
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- decanter (0.5.0)
4
+ decanter (0.5.2)
5
5
  activesupport
6
6
 
7
7
  GEM
data/lib/decanter.rb CHANGED
@@ -9,15 +9,16 @@ module Decanter
9
9
  def self.decanter_for(klass_or_sym)
10
10
  name = klass_or_sym.is_a?(Class) ?
11
11
  klass_or_sym.name :
12
- klass_or_sym.to_s.singularize.capitalize
12
+ klass_or_sym.to_s.singularize.camelize
13
13
 
14
14
  @@decanters["#{name}Decanter"] || (raise NameError.new("unknown decanter #{name}Decanter"))
15
15
  end
16
16
  end
17
17
 
18
18
  require 'decanter/version'
19
- require 'active_support/inflector'
19
+ require 'active_support/all'
20
20
  require 'decanter/base'
21
21
  require 'decanter/core'
22
22
  require 'decanter/extensions'
23
23
  require 'decanter/value_parser'
24
+ require 'decanter/railtie' if defined? ::Rails::Railtie
data/lib/decanter/base.rb CHANGED
@@ -3,5 +3,8 @@ require 'decanter/core'
3
3
  module Decanter
4
4
  class Base
5
5
  include Core
6
+ def self.inherited(subclass)
7
+ Decanter.register(subclass)
8
+ end
6
9
  end
7
10
  end
data/lib/decanter/core.rb CHANGED
@@ -3,20 +3,19 @@ module Decanter
3
3
 
4
4
  def self.included(base)
5
5
  base.extend(ClassMethods)
6
- Decanter.register(base)
7
6
  end
8
7
 
9
8
  module ClassMethods
10
9
 
11
10
  def associations
12
- @associations ||= {}
11
+ @associations ||= {}.with_indifferent_access
13
12
  end
14
13
 
15
14
  def inputs
16
- @inputs ||= {}
15
+ @inputs ||= {}.with_indifferent_access
17
16
  end
18
17
 
19
- def input(name, type, **options)
18
+ def input(name=nil, type, **options)
20
19
  set_input options, {
21
20
  name: name,
22
21
  options: options.reject { |k| k == :context },
@@ -32,7 +31,7 @@ module Decanter
32
31
  (inputs[context || :default] || {})[name]
33
32
  end
34
33
 
35
- def has_many(name, **options)
34
+ def has_many(name=nil, **options)
36
35
  set_association options, {
37
36
  key: options[:key] || "#{name}_attributes".to_sym,
38
37
  name: name,
@@ -41,7 +40,7 @@ module Decanter
41
40
  }
42
41
  end
43
42
 
44
- def has_one(name, **options)
43
+ def has_one(name=nil, **options)
45
44
  set_association options, {
46
45
  key: options[:key] || "#{name}_attributes".to_sym,
47
46
  name: name,
@@ -79,6 +78,7 @@ module Decanter
79
78
  end
80
79
 
81
80
  def decant(args={}, context=nil)
81
+ args = args.to_h if args.is_a?(ActionController::Parameters) # i.e. Rails 5
82
82
  Hash[
83
83
  args.map { |name, value| handle_arg(name, value, context) }.compact
84
84
  ]
@@ -87,7 +87,7 @@ module Decanter
87
87
  def handle_arg(name, value, context)
88
88
  case
89
89
  when input_cfg = input_for(name, context)
90
- [name, parse(input_cfg[:type], value)]
90
+ [name, parse(name, input_cfg[:type], value, input_cfg[:options])]
91
91
  when assoc = has_one_for(name, context)
92
92
  [assoc.pop[:key], Decanter::decanter_for(assoc.first).decant(value, context)]
93
93
  when assoc = has_many_for(name, context)
@@ -98,8 +98,10 @@ module Decanter
98
98
  end
99
99
  end
100
100
 
101
- def parse(type, val)
102
- ValueParser.value_parser_for(type).parse(val)
101
+ def parse(name, type, val, options)
102
+ type ?
103
+ ValueParser.value_parser_for(type).parse(name, val, options) :
104
+ val
103
105
  end
104
106
  end
105
107
  end
@@ -6,12 +6,12 @@ module Decanter
6
6
  end
7
7
 
8
8
  def decant_update(args={}, context=nil)
9
- self.attributes = self.decant(args, context)
9
+ self.attributes = self.class.decant(args, context)
10
10
  self.save(context: context)
11
11
  end
12
12
 
13
13
  def decant_update!(args={}, context=nil)
14
- self.attributes = self.decant(args, context)
14
+ self.attributes = self.class.decant(args, context)
15
15
  self.save!(context: context)
16
16
  end
17
17
 
@@ -26,9 +26,8 @@ module Decanter
26
26
  end
27
27
 
28
28
  def decant(args, context)
29
- decanter_for(self).decant(args, context)
29
+ Decanter.decanter_for(self).decant(args, context)
30
30
  end
31
31
  end
32
32
  end
33
33
  end
34
- ActiveRecord::Base.include(Decanter::Extensions) if defined? ActiveRecord
@@ -0,0 +1,9 @@
1
+ require 'rails'
2
+ require_relative 'extensions'
3
+
4
+ class Decanter::Railtie < Rails::Railtie
5
+
6
+ initializer 'decanter.configure' do
7
+ ActiveRecord::Base.include(Decanter::Extensions) if defined? ActiveRecord
8
+ end
9
+ end
@@ -15,4 +15,9 @@ end
15
15
  require_relative 'value_parser/base'
16
16
  require_relative 'value_parser/core'
17
17
  require_relative 'value_parser/boolean_parser'
18
+ require_relative 'value_parser/date_parser'
19
+ require_relative 'value_parser/datetime_parser'
18
20
  require_relative 'value_parser/string_parser'
21
+ require_relative 'value_parser/phone_parser'
22
+ require_relative 'value_parser/float_parser'
23
+ require_relative 'value_parser/integer_parser'
@@ -1,3 +1,5 @@
1
+ require_relative 'core'
2
+
1
3
  module Decanter
2
4
  module ValueParser
3
5
  class Base
@@ -1,15 +1,11 @@
1
1
  module Decanter
2
2
  module ValueParser
3
3
  class BooleanParser < Base
4
- def self.parse(val)
5
- case val
6
- when nil
7
- nil
8
- when 1, '1', true, 'true'
9
- true
10
- else
11
- false
12
- end
4
+
5
+ allow TrueClass, FalseClass
6
+
7
+ parser do |name, val, options|
8
+ [1, '1'].include?(val) || !!/true/i.match(val.to_s)
13
9
  end
14
10
  end
15
11
  end
@@ -1,14 +1,41 @@
1
1
  module Decanter
2
2
  module ValueParser
3
3
  module Core
4
+
4
5
  def self.included(base)
5
6
  base.extend(ClassMethods)
6
7
  ValueParser.register(base)
7
8
  end
8
9
 
9
10
  module ClassMethods
10
- def parse(val)
11
- val
11
+
12
+ def parse(name, val=nil, options={})
13
+
14
+ if val.blank?
15
+ if options[:required]
16
+ raise ArgumentError.new("No value for required argument: #{name}")
17
+ else
18
+ return val
19
+ end
20
+ end
21
+
22
+ if @allowed && @allowed.include?(val.class)
23
+ return val
24
+ end
25
+
26
+ unless @parser
27
+ raise ArgumentError.new("No parser for argument: #{name} with type: #{val.class}")
28
+ end
29
+
30
+ @parser.call(name, val, options)
31
+ end
32
+
33
+ def parser(&block)
34
+ @parser = block
35
+ end
36
+
37
+ def allow(*args)
38
+ @allowed = args
12
39
  end
13
40
  end
14
41
  end
@@ -1,11 +1,12 @@
1
1
  module Decanter
2
2
  module ValueParser
3
3
  class DateParser < Base
4
- def self.parse(val, options = {})
4
+
5
+ allow Date
6
+
7
+ parser do |name, val, options|
5
8
  parse_format = options.fetch(:parse_format, '%m/%d/%Y')
6
- return input_value unless input_value.present?
7
- return input_value if input_value.is_a?(Date)
8
- ::Date.strptime(input_value, parse_format)
9
+ ::Date.strptime(val, parse_format)
9
10
  end
10
11
  end
11
12
  end
@@ -0,0 +1,13 @@
1
+ module Decanter
2
+ module ValueParser
3
+ class DateTimeParser < Base
4
+
5
+ allow DateTime
6
+
7
+ parser do |name, val, options|
8
+ parse_format = options.fetch(:parse_format, '%m/%d/%Y')
9
+ ::Date.strptime(val, parse_format)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Decanter
2
+ module ValueParser
3
+ class FloatParser < Base
4
+ REGEX = /(\d|[.])/
5
+
6
+ allow Float, Fixnum
7
+
8
+ parser do |name, val, options|
9
+ val.scan(REGEX).join.try(:to_f)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module Decanter
2
+ module ValueParser
3
+ class IntegerParser < Base
4
+ REGEX = /(\d|[.])/
5
+
6
+ allow Fixnum
7
+
8
+ parser do |name, val, options|
9
+ val.is_a?(Float) ?
10
+ val.to_i :
11
+ val.scan(REGEX).join.try(:to_i)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Decanter
2
+ module ValueParser
3
+ class PhoneParser < Base
4
+ REGEX = /\d/
5
+
6
+ allow Fixnum
7
+
8
+ parser do |name, val, options|
9
+ val.scan(REGEX).join.to_s
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,8 +1,11 @@
1
1
  module Decanter
2
2
  module ValueParser
3
3
  class StringParser < Base
4
- def self.parse(val)
5
- val && val.respond_to?(:to_s) ? val.to_s : nil
4
+
5
+ allow String
6
+
7
+ parser do |name, val, options|
8
+ val.to_s
6
9
  end
7
10
  end
8
11
  end
@@ -1,3 +1,3 @@
1
1
  module Decanter
2
- VERSION = '0.5.0'
2
+ VERSION = '0.5.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decanter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Francis
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-02-13 00:00:00.000000000 Z
12
+ date: 2016-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -75,6 +75,7 @@ executables: []
75
75
  extensions: []
76
76
  extra_rdoc_files: []
77
77
  files:
78
+ - ".rspec"
78
79
  - Gemfile
79
80
  - Gemfile.lock
80
81
  - LICENSE.txt
@@ -87,11 +88,16 @@ files:
87
88
  - lib/decanter/base.rb
88
89
  - lib/decanter/core.rb
89
90
  - lib/decanter/extensions.rb
91
+ - lib/decanter/railtie.rb
90
92
  - lib/decanter/value_parser.rb
91
93
  - lib/decanter/value_parser/base.rb
92
94
  - lib/decanter/value_parser/boolean_parser.rb
93
95
  - lib/decanter/value_parser/core.rb
94
96
  - lib/decanter/value_parser/date_parser.rb
97
+ - lib/decanter/value_parser/datetime_parser.rb
98
+ - lib/decanter/value_parser/float_parser.rb
99
+ - lib/decanter/value_parser/integer_parser.rb
100
+ - lib/decanter/value_parser/phone_parser.rb
95
101
  - lib/decanter/value_parser/string_parser.rb
96
102
  - lib/decanter/version.rb
97
103
  homepage: https://github.com/launchpadlab/decanter
@@ -115,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
121
  version: '0'
116
122
  requirements: []
117
123
  rubyforge_project:
118
- rubygems_version: 2.4.8
124
+ rubygems_version: 2.4.5.1
119
125
  signing_key:
120
126
  specification_version: 4
121
127
  summary: Form Parser for Rails