hashme 0.2.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1baf318f249321f9486052a01db0881479f461c
4
- data.tar.gz: f5b623806198098e2d5e4d6fa42c60cb6137498e
3
+ metadata.gz: d156ad2e578a61e6d5b0c35d1c2c3ef3abf1fa78
4
+ data.tar.gz: e74817abf9f6e1986d33d837c870f0eb1aa738c8
5
5
  SHA512:
6
- metadata.gz: 9bdfc2fea9f19cccd974a2a8d0b8cfad142bb91af0f35d1ba40a91f0fe0049ae085633d48f1abf9e67f211f6bbdb811bb6961e2ebf491f5858bdfcbc4494933b
7
- data.tar.gz: 9e1b4fb53dde4cafd41b9e5917a7a7e12ea22b036cd330ae3eebf79b749a89897afe3f18bb346ad1e524ceb91a27f0af9e1e3a5be1e65d255ce983a6f7ca26d2
6
+ metadata.gz: 3a7fe15c3b3b4b9b29229410088c976464ce6d97ffdf4f79dce15c5863fde6764174b323fca141b1fbfb9ba816254f7089e54a2e9b0c4532f478a8f63302bd56
7
+ data.tar.gz: c08a3540c7b1b37400310b2e9faac9a77f7c6b4ce439fe8029d4384e0c7429296b0502a6654647260cd7386ec53d4a8b3ac0159bf3d6c57a667fd60e4e819a06
data/README.md CHANGED
@@ -8,6 +8,15 @@ generate hashes that you can serialize and store as you wish.
8
8
  Its a bit like ActiveRecord, but without all the messy database stuff,
9
9
  and of course you can nest to you're heart's content.
10
10
 
11
+ A few situations where you might find Hashme useful:
12
+
13
+ * parsing incoming data from an API,
14
+ * defining documents that will be stored and reloaded from a file system, or,
15
+ * using a "json" field in a relational database with a bit more structure.
16
+
17
+ Hashme adheres to ActiveModel and includes support validation, even of nested
18
+ attributes with a `valid?` method.
19
+
11
20
  ## Installation
12
21
 
13
22
  Add this line to your application's Gemfile:
@@ -109,6 +118,10 @@ u.errors.first # [:email, "can't be blank"]
109
118
 
110
119
  ## History
111
120
 
121
+ ### 0.2.1 - 2016-06-03
122
+
123
+ * Support for embedded document validation.
124
+
112
125
  ### 0.2.0 - 2016-06-02
113
126
 
114
127
  * Added support for advanced type casting, copy stuff from CouchRest Model.
data/lib/hashme.rb CHANGED
@@ -17,17 +17,18 @@ require "hashme/casted_array"
17
17
  require "hashme/properties"
18
18
  require "hashme/property"
19
19
  require "hashme/property_casting"
20
+ require "hashme/validations/casted_attribute_validator"
21
+ require "hashme/validations"
20
22
 
21
23
  module Hashme
22
24
  extend ActiveSupport::Concern
23
25
 
24
- include ActiveModel::Validations
26
+ include Validations
25
27
 
26
28
  included do
27
29
  include Castable
28
30
  include Attributes
29
31
  include Properties
30
- # Eventually! include Validations
31
32
  end
32
33
 
33
34
  def initialize(attrs = {})
@@ -52,7 +52,7 @@ module Hashme
52
52
  property = Property.new(*args)
53
53
  self.properties = properties.merge(property.name => property)
54
54
  define_property_methods(property)
55
-
55
+ prepare_validation(property)
56
56
  property
57
57
  end
58
58
 
@@ -69,6 +69,12 @@ module Hashme
69
69
  end
70
70
  end
71
71
 
72
+ def prepare_validation(property)
73
+ if property.type.method_defined?(:valid?)
74
+ validates_casted_attributes property.name
75
+ end
76
+ end
77
+
72
78
  end
73
79
 
74
80
 
@@ -0,0 +1,21 @@
1
+ module Hashme
2
+
3
+ # Additional functionality for validation outside the standard ActiveModel stuff.
4
+ module Validations
5
+ extend ActiveSupport::Concern
6
+ include ActiveModel::Validations
7
+
8
+ module ClassMethods
9
+
10
+ # Validates the associated casted model. This method should not be
11
+ # used within your code as it is automatically included when a CastedModel
12
+ # is used inside the model.
13
+ def validates_casted_attributes(*args)
14
+ validates_with(CastedAttributeValidator, _merge_attributes(args))
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,13 @@
1
+ module Hashme
2
+ module Validations
3
+ class CastedAttributeValidator < ActiveModel::EachValidator
4
+
5
+ def validate_each(document, attribute, value)
6
+ values = value.is_a?(Array) ? value : [value]
7
+ return if values.collect {|attr| attr.nil? || attr.valid? }.all?
8
+ document.errors.add(attribute)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Hashme
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hashme::Validations do
4
+
5
+ context "with simple validation" do
6
+ subject do
7
+ Class.new do
8
+ include Hashme
9
+ def self.name; "Example"; end
10
+ property :name, String
11
+ validates :name, presence: true
12
+ end
13
+ end
14
+
15
+ it "should not fail when valid" do
16
+ obj = subject.new(name: "Sam")
17
+ expect(obj).to be_valid
18
+ expect(obj.errors).to be_empty
19
+ end
20
+ it "should add error when invalid" do
21
+ obj = subject.new
22
+ expect(obj).to_not be_valid
23
+ expect(obj.errors).to_not be_empty
24
+ expect(obj.errors[:name]).to_not be_empty
25
+ end
26
+ end
27
+
28
+ context "with embedded object that supports validation" do
29
+ subject do
30
+ submod = Class.new do
31
+ include Hashme
32
+ def self.name; "SubExample"; end
33
+ property :email, String
34
+ validates :email, presence: true
35
+ end
36
+ Class.new do
37
+ include Hashme
38
+ def self.name; "Example"; end
39
+ property :sub, submod
40
+ end
41
+ end
42
+
43
+ it "should not error when valid" do
44
+ obj = subject.new(sub: {email: 'sam@cabify.com'})
45
+ expect(obj).to be_valid
46
+ end
47
+
48
+ it "should not err if embedded object empty" do
49
+ obj = subject.new()
50
+ expect(obj).to be_valid
51
+ end
52
+
53
+ it "should provide errors when invalid" do
54
+ obj = subject.new(sub: {})
55
+ expect(obj).to_not be_valid
56
+ expect(obj.errors[:sub]).to_not be_empty
57
+ expect(obj.sub.errors).to_not be_empty
58
+ expect(obj.sub.errors[:email]).to_not be_empty
59
+ end
60
+
61
+ end
62
+
63
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Lown
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-02 00:00:00.000000000 Z
11
+ date: 2016-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -87,6 +87,8 @@ files:
87
87
  - lib/hashme/properties.rb
88
88
  - lib/hashme/property.rb
89
89
  - lib/hashme/property_casting.rb
90
+ - lib/hashme/validations.rb
91
+ - lib/hashme/validations/casted_attribute_validator.rb
90
92
  - lib/hashme/version.rb
91
93
  - spec/hashme/attributes_spec.rb
92
94
  - spec/hashme/base_spec.rb
@@ -94,6 +96,7 @@ files:
94
96
  - spec/hashme/properties_spec.rb
95
97
  - spec/hashme/property_casting_spec.rb
96
98
  - spec/hashme/property_spec.rb
99
+ - spec/hashme/validations_spec.rb
97
100
  - spec/spec_helper.rb
98
101
  homepage: ''
99
102
  licenses:
@@ -126,4 +129,5 @@ test_files:
126
129
  - spec/hashme/properties_spec.rb
127
130
  - spec/hashme/property_casting_spec.rb
128
131
  - spec/hashme/property_spec.rb
132
+ - spec/hashme/validations_spec.rb
129
133
  - spec/spec_helper.rb