nform 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nform/attributes.rb +28 -15
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f1feff130275754a2c51683b9bcb04503a42b19
4
- data.tar.gz: 5785fae3630918cb9ca7c98337984e7bf3324812
3
+ metadata.gz: 650de4de056c13e0ad264142166a65fdad7d92a6
4
+ data.tar.gz: e6768bf06dc70032b5e630809f93e10330e1c1c7
5
5
  SHA512:
6
- metadata.gz: cfa1902ba17fb5f1adc46720ff25f111ed511f54221a11a52a141409c49dbee75a2e3659a5b7f71ca4606398488bfefb4d1b1613bd9d26776f3da4fa5ff36fc6
7
- data.tar.gz: 9a3136dd6ba4dabf064c6fe8609e9a638729efd2403dc435be8c4a56f39b12d51f76faf744607dd40f2029bf1b2d388779328a7a0863ee73f8387e9470da40db
6
+ metadata.gz: 4eba41db6bec1c34ba333032f91533685384893be4ba8c9357a1e34bd480879d91affb7c58a03613f620fe973c81680304919da9a04eb3b0f9f27a52083199cf
7
+ data.tar.gz: e2b51d4902daab7e3ce23b930c5e62dbfce89ed0358c09ef1159973e303a3d8d619e782248d5bc296656d6bf25db65ad14db0a47854a755f3663dc285bcb2d87
@@ -1,5 +1,6 @@
1
1
  require 'active_support/core_ext/hash'
2
2
  require 'nform/coercions'
3
+ require 'set'
3
4
 
4
5
  module NForm
5
6
  module Attributes
@@ -18,10 +19,21 @@ module NForm
18
19
  @undef_attr = option
19
20
  end
20
21
 
22
+ def hash_representation(option)
23
+ unless %i|partial complete|.include?(option)
24
+ raise ArgumentError, "Unknown option `#{option}` for hash representation. Options are :partial or :complete"
25
+ end
26
+ @hash_rep = option
27
+ end
28
+
21
29
  def __undef_attr
22
30
  @undef_attr ||= :raise
23
31
  end
24
32
 
33
+ def __hash_rep
34
+ @hash_rep ||= :complete
35
+ end
36
+
25
37
  def define_attributes
26
38
  attribute_set.each do |name,options|
27
39
  define_method(name) do
@@ -31,6 +43,7 @@ module NForm
31
43
  # TODO: must use coercion set
32
44
  c = get_coercion(options[:coerce])
33
45
  define_method("#{name}=") do |input|
46
+ @__touched_keys << name
34
47
  instance_variable_set("@#{name}", c.call(input,self))
35
48
  end
36
49
  end
@@ -60,43 +73,43 @@ module NForm
60
73
 
61
74
  module InstanceMethods
62
75
  def initialize(input={})
76
+ @__touched_keys = Set.new
63
77
  i = input.symbolize_keys
64
78
  require_attributes!(i)
65
79
  self.class.define_attributes
66
80
  set_attributes!(i)
67
- set_missing_defaults
68
81
  end
69
82
 
70
83
  def to_hash
71
- self.class.attribute_set.each.with_object({}) do |(k,v),memo|
84
+ if self.class.__hash_rep == :partial
85
+ @__touched_keys
86
+ else
87
+ self.class.attribute_set.keys
88
+ end.each.with_object({}) do |k,memo|
72
89
  memo[k] = send(k)
73
90
  end
74
91
  end
75
92
 
76
93
  private
77
94
  def require_attributes!(input_hash)
95
+ # Check for missing required attributes
78
96
  required = self.class.attribute_set.map{|name,options| name if options[:required]}.compact
79
97
  missing = (required - input_hash.keys)
80
98
  if missing.any?
81
99
  raise ArgumentError, "Missing required attributes: #{missing.inspect}"
82
100
  end
83
- end
84
101
 
85
- def set_attributes!(input_hash)
86
- input_hash.each do |k,v|
87
- if self.class.__undef_attr == :raise
88
- raise ArgumentError, "Undefined attribute: #{k}" unless respond_to?("#{k}=")
89
- end
90
- send "#{k}=", v if respond_to?("#{k}=")
102
+ # Check for unallowed extra attributes
103
+ if self.class.__undef_attr == :raise
104
+ extra = (input_hash.keys - self.class.attribute_set.keys)
105
+ raise ArgumentError, "Undefined attribute(s): #{extra.join(',')}" if extra.any?
91
106
  end
92
107
  end
93
108
 
94
- def set_missing_defaults
95
- self.class.attribute_set.each do |name, options|
96
- default = options[:default]
97
- unless default.nil?
98
- send("#{name}=",default) if send(name).nil?
99
- end
109
+ def set_attributes!(input_hash)
110
+ self.class.attribute_set.each do |a, opts|
111
+ val = input_hash[a] || opts[:default]
112
+ send "#{a}=", val if input_hash.has_key?(a) || !opts[:default].nil?
100
113
  end
101
114
  end
102
115
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nform
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Burleson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-14 00:00:00.000000000 Z
11
+ date: 2016-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -61,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  version: '0'
62
62
  requirements: []
63
63
  rubyforge_project:
64
- rubygems_version: 2.4.5.1
64
+ rubygems_version: 2.5.1
65
65
  signing_key:
66
66
  specification_version: 4
67
67
  summary: A form / service / view object library.