ph_model 0.0.1 → 1.0.0

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: 72c97b1d45c2bffecce992988d661288f985e781
4
- data.tar.gz: fb1daf87242301f9a6390beaeee59c0668fee155
3
+ metadata.gz: 04cf28ca1fecccaf0c306c6259efe62e31cebe87
4
+ data.tar.gz: 8b15fce44d2f140b262a851515fa37d122024b7b
5
5
  SHA512:
6
- metadata.gz: a1a90cd481163e0288594665b53e01a8aa72202f219f787b35c6b1c7bef33b3745f930a3858d777782ce5183bbf0dc2f761ff119b438004282a98c4f65d0e17c
7
- data.tar.gz: 6b14a99582e733abc6553750e5d90d0469f82c759b5b49eb4ad828bcd914a2c6c97326b683fb55c8e5d84daa68e40a2adf942e4df940e13197f91916cf1d4963
6
+ metadata.gz: dc1b55bcc96ba908e6c2b7f04fe523e1c027200b58431196843efb19d03ef83d7fba4952a484918b6a04247d8f1dfba2656ead3698f99d6d57b6385a356180fc
7
+ data.tar.gz: 4f4050c4dc0a13105a3684d3d48c825e21729c9a4fe1827405529881184a9e12ea1a383afcc58c41f768216f09635d51c1c3dc0f8df67b4f005c27fd8c1e1297
data/.codeclimate.yml CHANGED
@@ -1,4 +1,9 @@
1
1
  engines:
2
+ duplication:
3
+ enabled: true
4
+ config:
5
+ languages:
6
+ - ruby
2
7
  rubocop:
3
8
  enabled: true
4
9
  ratings:
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ public/
6
6
  public
7
7
  *.db
8
8
  tmp/
9
+ .ruby-version
data/CHANGELOG.md CHANGED
@@ -0,0 +1,8 @@
1
+ # Change Log
2
+
3
+ ## [v0.0.1](https://github.com/payrollhero/ph_model/tree/v0.0.1) (2016-02-03)
4
+ - Initial extract from ph\_utility [\#1](https://github.com/payrollhero/ph_model/pull/1) ([piotrb](https://github.com/piotrb))
5
+
6
+
7
+
8
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/README.md CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  * [Homepage](https://rubygems.org/gems/ph_model)
4
4
  * [Documentation](http://rubydoc.info/gems/ph_model/frames)
5
- * [Email](mailto:piotr.banasik at gmail.com)
5
+ * [Email](mailto:piotr@payrollhero.com)
6
+ * [Changelog](CHANGELOG.md)
6
7
 
7
8
  ## Description
8
9
 
@@ -0,0 +1,33 @@
1
+ module PhModel
2
+ module Concerns
3
+ module AttributeNestedValidation
4
+ extend ActiveSupport::Concern
5
+
6
+ included do |other|
7
+ other.validate :validate_nested_attributes
8
+ end
9
+
10
+ def validate_nested_attributes
11
+ self.class.attributes.each do |attribute_name, info|
12
+ value = send(attribute_name)
13
+ if info[:type].is_a? Array
14
+ if value.respond_to? :each_with_index
15
+ value.each_with_index do |item_value, index|
16
+ check_one(item_value, "#{attribute_name}[#{index}]")
17
+ end
18
+ end
19
+ else
20
+ check_one(value, attribute_name)
21
+ end
22
+ end
23
+ end
24
+
25
+ def check_one(value, attribute_name)
26
+ return if !value.respond_to?(:valid?) || value.valid?
27
+ value.errors.full_messages.each do |message|
28
+ errors.add(:base, "#{attribute_name}.#{message}")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ module PhModel
2
+ module Concerns
3
+ module AttributeOfArrayTypeInitialization
4
+ extend ActiveSupport::Concern
5
+
6
+ included do |other|
7
+ other.after_initialize :initialize_array_type_attributes
8
+ end
9
+
10
+ def initialize_array_type_attributes
11
+ self.class.attributes.each do |attribute_name, info|
12
+ if info[:type].kind_of?(Array)
13
+ send("#{attribute_name}=", []) unless send(attribute_name).present?
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module PhModel
2
+ module Concerns
3
+ module AttributeRequiredValidation
4
+ extend ActiveSupport::Concern
5
+
6
+ included do |other|
7
+ other.validate :validate_required_attributes
8
+ end
9
+
10
+ def validate_required_attributes
11
+ self.class.attributes.each do |attribute_name, info|
12
+ if info[:required] && send(attribute_name).blank?
13
+ errors.add(attribute_name, :empty)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ module PhModel
2
+ module Concerns
3
+ module AttributeTypeValidation
4
+ extend ActiveSupport::Concern
5
+
6
+ included do |other|
7
+ other.validate :ensure_typed_attributes_class
8
+ end
9
+
10
+ def ensure_typed_attributes_class
11
+ self.class.attributes.each do |attribute_name, info|
12
+ if info[:type] && !type_match?(attribute_name)
13
+ errors.add(attribute_name, "must be #{info[:type].inspect}, was #{type_summary(attribute_name)}")
14
+ end
15
+ end
16
+ end
17
+
18
+ def type_summary(attribute_name)
19
+ value = send(attribute_name)
20
+ case value
21
+ when Array
22
+ value.map { |val| val.respond_to?(:model_name) ? val.model_name.name : val.class.name }.uniq
23
+ else
24
+ value.class
25
+ end
26
+ end
27
+
28
+ def type_match?(attribute_name)
29
+ value = send(attribute_name)
30
+ info = self.class.attributes[attribute_name]
31
+ type = info[:type]
32
+
33
+ case type
34
+ when nil
35
+ true
36
+ when Array
37
+ if type.count != 1
38
+ raise ArgumentError, "don't know how to handle type: #{type.inspect}"
39
+ else
40
+ if value.kind_of? Array
41
+ value.all? { |item| item.is_a?(type.first) }
42
+ else
43
+ false
44
+ end
45
+ end
46
+ else
47
+ if !info[:required] && value.nil?
48
+ true
49
+ else
50
+ value.is_a?(type)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ module PhModel
2
+ module Concerns
3
+
4
+ # Adds support for defining callbacks around initialize
5
+ module InitializeCallback
6
+ extend ActiveSupport::Concern
7
+
8
+ included do |other|
9
+ other.define_model_callbacks :initialize
10
+ end
11
+
12
+ def initialize(attributes = nil, options = {})
13
+ run_callbacks :initialize do
14
+ super
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,6 +2,11 @@ module PhModel
2
2
  module Concerns
3
3
  extend ActiveSupport::Autoload
4
4
 
5
+ autoload :AttributeNestedValidation
6
+ autoload :AttributeOfArrayTypeInitialization
7
+ autoload :AttributeRequiredValidation
8
+ autoload :AttributeTypeValidation
9
+ autoload :InitializeCallback
5
10
  autoload :ValidatedFactory
6
11
  end
7
12
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module PhModel
3
- VERSION = '0.0.1'.freeze
3
+ VERSION = '1.0.0'.freeze
4
4
  end
data/lib/ph_model.rb CHANGED
@@ -17,11 +17,33 @@ module PhModel
17
17
  extend ActiveSupport::Concern
18
18
  extend ActiveSupport::Autoload
19
19
 
20
+ autoload :Concerns
21
+ autoload :ValidationFailed
22
+
20
23
  include ActiveAttr::BasicModel
21
24
  include ActiveAttr::AttributeDefaults
22
25
  include ActiveAttr::QueryAttributes
23
26
  include ActiveAttr::MassAssignment
24
27
 
28
+ include Concerns::InitializeCallback
29
+ include Concerns::AttributeRequiredValidation
30
+ include Concerns::AttributeTypeValidation
31
+ include Concerns::AttributeNestedValidation
32
+ include Concerns::AttributeOfArrayTypeInitialization
33
+
34
+ def as_json
35
+ {}.tap do |hash|
36
+ self.class.attributes.each do |attribute_name, _info|
37
+ hash[attribute_name] = send(attribute_name).as_json
38
+ end
39
+ end
40
+ end
41
+
42
+ def inspect
43
+ attr_info = self.class.attributes.map { |attr_name, info| "#{attr_name}: #{self.send(attr_name).inspect}" }.join(", ")
44
+ "#<#{self.model_name} #{attr_info}>"
45
+ end
46
+
25
47
  # Monkey patch #assign_attributes inside ActiveAttr::MassAssignment
26
48
  # so that it doesn't blindly ignore attempting to assign attributes which do not
27
49
  # exist
@@ -38,8 +60,5 @@ module PhModel
38
60
  end if sanitized_new_attributes
39
61
  end
40
62
 
41
- autoload :Concerns
42
- autoload :ValidationFailed
43
-
44
63
  include Concerns::ValidatedFactory
45
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ph_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Banasik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-03 00:00:00.000000000 Z
11
+ date: 2017-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -186,7 +186,6 @@ extra_rdoc_files: []
186
186
  files:
187
187
  - ".codeclimate.yml"
188
188
  - ".gitignore"
189
- - ".hound.yml"
190
189
  - ".reek"
191
190
  - ".rubocop.hound.yml"
192
191
  - ".rubocop.yml"
@@ -204,6 +203,11 @@ files:
204
203
  - lib/active_model/validations/type_validator.rb
205
204
  - lib/ph_model.rb
206
205
  - lib/ph_model/concerns.rb
206
+ - lib/ph_model/concerns/attribute_nested_validation.rb
207
+ - lib/ph_model/concerns/attribute_of_array_type_initialization.rb
208
+ - lib/ph_model/concerns/attribute_required_validation.rb
209
+ - lib/ph_model/concerns/attribute_type_validation.rb
210
+ - lib/ph_model/concerns/initialize_callback.rb
207
211
  - lib/ph_model/concerns/validated_factory.rb
208
212
  - lib/ph_model/validation_failed.rb
209
213
  - lib/ph_model/version.rb
@@ -228,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
228
232
  version: '0'
229
233
  requirements: []
230
234
  rubyforge_project:
231
- rubygems_version: 2.4.5.1
235
+ rubygems_version: 2.5.2
232
236
  signing_key:
233
237
  specification_version: 4
234
238
  summary: ph-model -- active_model, active_attr brought together at last
data/.hound.yml DELETED
@@ -1,2 +0,0 @@
1
- ruby:
2
- config_file: .rubocop.yml