hashme 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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