scopie 1.0.0 → 1.0.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: 6d9229c6a75c80011a20a5cf7b7d32013f9d1941
4
- data.tar.gz: 82a4971ec39be00ee49352305c031c4d135da7d7
3
+ metadata.gz: fe59078e2e2798ce9fb21bfbaf5d84073832fec1
4
+ data.tar.gz: 04be530e19f3441fb2b4255558c5c5d5ce98628b
5
5
  SHA512:
6
- metadata.gz: 69a30eb8da71ad17d0bfb11a8c8e57af1c3878bfd9d8a8290f5a289a3057b32ff31da4aa00f259c295d2c321e0265c9d4327f7b0c4bd992af257eef7b518bf23
7
- data.tar.gz: 5c9982a5584dee2f5abd03a52d7b6659763144f00ac52ee8ec9825b24fc013ae2fd6484b1f2544f180bc066e8f9b992d801fad72773027755beb88c2e7eccf4a
6
+ metadata.gz: d33e2a61b45ff6a8d14384a70d3e0a4cbf48b4236ed172c21b0bcf4d3ec261f628984d49fafe5802931bddb3242939057126e6b8c6f0a1299bdc94b5d5da0a76
7
+ data.tar.gz: b0ebe558815608b0b9f581f61a3b00ea0be147e16bf8848c30b85503573c16596534c4aeec10c4745f5aaa6b61ecd2d55e43ae91af131a47e7317022f0782893
data/README.md CHANGED
@@ -15,7 +15,7 @@ Motivation:
15
15
  * Dedicated class for scopes mapping, so that the logic is isolated and your controller is skinny.
16
16
  * Dependencies free. Please have a look at [scopie_rails](http://github.com/beorc/scopie_rails) if you are using Ruby on Rails framework.
17
17
  * Ability to override default mapping behavior by definition of a method with the same name as scope in the scopie class.
18
- * Ability to DRY your custom scopes mapping logic using private methods defined in scopie class and use the same scopie class in multiple controllers.
18
+ * Ability to use the object oriented approach to DRY your custom scopes mapping logic and reuse the scopie class.
19
19
 
20
20
  Imagine the following model called graduations:
21
21
 
data/lib/scopie/base.rb CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  class Scopie::Base
4
4
 
5
- TRUE_VALUES = ['true', true, '1', 1].freeze
6
-
7
5
  def self.scopes_configuration
8
6
  instance_variable_get(:@scopes_configuration) || {}
9
7
  end
@@ -33,7 +31,7 @@ class Scopie::Base
33
31
  value = scope_value(scope_name, options, hash)
34
32
  next unless scope_applicable?(value, options, method)
35
33
 
36
- [scope_name, coerce_value_type(value, options[:type])]
34
+ [scope_name, value.coerced]
37
35
  end
38
36
 
39
37
  scopes.compact!
@@ -62,42 +60,14 @@ class Scopie::Base
62
60
  key_name = key_name(scope_name, options)
63
61
  reduced_hash = reduced_hash(hash, options)
64
62
 
65
- return reduced_hash[key_name] if reduced_hash.key?(key_name)
66
- options[:default]
67
- end
68
-
69
- def coerce_value_type(value, type)
70
- return value unless type
71
-
72
- coercion_method_name = "coerce_to_#{type}"
73
-
74
- respond_to?(coercion_method_name, true) || fail(Scopie::InvalidOptionError.new("Unknown value for option 'type' provided: :#{type}"))
75
-
76
- send(coercion_method_name, value)
77
- end
78
-
79
- def coerce_to_boolean(value)
80
- TRUE_VALUES.include? value
81
- end
82
-
83
- def coerce_to_integer(value)
84
- Integer(value)
85
- end
86
-
87
- def coerce_to_date(value)
88
- Date.parse(value)
89
- end
90
-
91
- def coerce_to_float(value)
92
- Float(value)
63
+ Scopie::Value.new(reduced_hash, key_name, options)
93
64
  end
94
65
 
95
66
  def scope_applicable?(value, options, method)
96
67
  return false unless method_applicable?(method, options)
68
+ return false unless value.given?
97
69
 
98
- is_value_present = value.respond_to?(:empty?) ? !value.empty? : !!value
99
-
100
- is_value_present || !!options[:allow_blank]
70
+ value.present? || !!options[:allow_blank]
101
71
  end
102
72
 
103
73
  def reduced_hash(hash, options)
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scopie::Value < Struct.new(:hash, :key_name, :options)
4
+
5
+ TRUE_VALUES = ['true', true, '1', 1].freeze
6
+
7
+ def raw
8
+ return hash[key_name] if hash.key?(key_name)
9
+ fetch_default
10
+ end
11
+
12
+ def coerced
13
+ coerce_to_type(raw, fetch_type)
14
+ end
15
+
16
+ def fetch_type
17
+ options[:type]
18
+ end
19
+
20
+ def fetch_default
21
+ options[:default]
22
+ end
23
+
24
+ def has_default?
25
+ options.key?(:default)
26
+ end
27
+
28
+ def given?
29
+ key_passed? || has_default?
30
+ end
31
+
32
+ def key_passed?
33
+ hash.key?(key_name)
34
+ end
35
+
36
+ def present?
37
+ value = raw
38
+ value.respond_to?(:empty?) ? !value.empty? : !!value
39
+ end
40
+
41
+ private
42
+
43
+ def coerce_to_type(value, type)
44
+ return value unless type
45
+
46
+ coercion_method_name = "coerce_to_#{type}"
47
+
48
+ respond_to?(coercion_method_name, true) || fail(Scopie::InvalidOptionError.new("Unknown value for option 'type' provided: :#{type}"))
49
+
50
+ send(coercion_method_name, value)
51
+ end
52
+
53
+ def coerce_to_boolean(value)
54
+ TRUE_VALUES.include? value
55
+ end
56
+
57
+ def coerce_to_integer(value)
58
+ Integer(value)
59
+ end
60
+
61
+ def coerce_to_date(value)
62
+ Date.parse(value)
63
+ end
64
+
65
+ def coerce_to_float(value)
66
+ Float(value)
67
+ end
68
+
69
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scopie
4
- VERSION = '1.0.0'
4
+ VERSION = '1.0.1'
5
5
  end
data/lib/scopie.rb CHANGED
@@ -4,6 +4,7 @@ module Scopie
4
4
 
5
5
  class InvalidOptionError < StandardError; end
6
6
 
7
+ require 'scopie/value'
7
8
  require 'scopie/base'
8
9
 
9
10
  def self.apply_scopes(target, hash, method: nil, scopie: Scopie::Base.new)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scopie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yury Kotov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-25 00:00:00.000000000 Z
11
+ date: 2016-06-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Minimal mapping of incoming parameters to named scopes in your resources
14
14
  through OO design and pure Ruby classes
@@ -22,6 +22,7 @@ files:
22
22
  - README.md
23
23
  - lib/scopie.rb
24
24
  - lib/scopie/base.rb
25
+ - lib/scopie/value.rb
25
26
  - lib/scopie/version.rb
26
27
  homepage: https://github.com/beorc/scopie
27
28
  licenses: