spicerack 0.9.5 → 0.9.6

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
  SHA256:
3
- metadata.gz: 63465744c22195566cc65342a80f573d0b59539562d94fcc31952ff4a1873024
4
- data.tar.gz: 7b3fb662041abca66c897737407aa41200ed42fb735db5dd35457aae1ec66a40
3
+ metadata.gz: 7e875159ebcefea499ddd29def5f46278bddcffa3e37b9752a57ca7284b4c673
4
+ data.tar.gz: 274d2f05fadfec67984b1e7a46a92c4199b761c9dc63a1e12e01d6897a419a1f
5
5
  SHA512:
6
- metadata.gz: f68838c28911e22c4ed8811900a1999e164340dc9bdb81e1a38a1a45c5e1c57fe9b6ed204cea05cdfca1ccde6f1a42197edd095d47ec56a77e5294b3b444a35a
7
- data.tar.gz: 8a5e99cad594eb86d67451a12d87b8dfc4e5bf991c8a75865bf94a52f7097339eb8fba6be180c8c1a5b4a5d559a978b4ca318285b9cc24d0a9e28cdebce2b433
6
+ metadata.gz: 71361db0b3527e0a5292e95f58fdb3836c8345ea68d3dc8bc3f6abb4188507227bc40ba716bea83b861b5b9ec00cfff8916fc893ca5a3e63d6f4db67c0a33ab5
7
+ data.tar.gz: 78796811177bd6aebcf5cb149b8ec9c1d85b72752ae6591e7d2c13d627943fd2e6b572b29be1249b9aa55937edb6acbedf8c10c12922743efdf3e15ac84669b8
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spicerack
4
+ class ArrayIndex
5
+ include ShortCircuIt
6
+
7
+ class << self
8
+ alias_method :[], :new
9
+ end
10
+
11
+ attr_reader :array
12
+
13
+ delegate :[], to: :index
14
+
15
+ def initialize(array)
16
+ @array = array
17
+ end
18
+
19
+ def index
20
+ array.each_with_index.each_with_object({}) do |(element, index), hash|
21
+ hash[element] = index unless hash.key?(element)
22
+ end
23
+ end
24
+ memoize :index, observes: :array
25
+
26
+ def freeze
27
+ @array = array.deep_dup.freeze
28
+ index.freeze
29
+
30
+ super
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # RSpec matcher that tests usage of `.field`
4
+ #
5
+ # class Example < Tablesalt::HashModel
6
+ # field :foo, :datetime
7
+ # field :bar, :integer
8
+ # end
9
+ #
10
+ # RSpec.describe Example, type: :hash_model do
11
+ # subject { described_class.new.tap { |model| model.data = data } }
12
+ #
13
+ # let(:data) { {} }
14
+ #
15
+ # it { is_expected.to define_field :foo, :datetime }
16
+ # it { is_expected.to define_field :bar, :integer }
17
+ # end
18
+
19
+ RSpec::Matchers.define :define_field do |field, type = nil, default: nil|
20
+ match do |instance|
21
+ expect(instance.class.attribute_types[field.to_s].type).to eq type unless type.nil?
22
+ expect(instance.class._default_attributes[field.to_s].value).to eq default unless default.nil?
23
+ expect(instance.class._fields).to include field
24
+ end
25
+ description { "define field #{field}" }
26
+ failure_message { |instance| "expected #{instance.class} to define field #{field} #{with_details(type, default)}" }
27
+
28
+ def with_details(type, default)
29
+ [ with_type(type), with_default(default) ].compact.join(" ")
30
+ end
31
+
32
+ def with_type(type)
33
+ "of type #{type}" unless type.nil?
34
+ end
35
+
36
+ def with_default(default)
37
+ "with default #{default}" unless default.nil?
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "custom_matchers/define_field"
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_model"
4
+
5
+ module Spicerack
6
+ module HashModel
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ include ActiveModel::Attributes
11
+
12
+ class_attribute :_fields, instance_writer: false, default: []
13
+
14
+ attr_accessor :data
15
+ end
16
+
17
+ class_methods do
18
+ def inherited(base)
19
+ base._fields = _fields.dup
20
+ super
21
+ end
22
+
23
+ private
24
+
25
+ def field(name, type = Type::Value.new, **options)
26
+ _fields << name
27
+ attribute(name, type, **options)
28
+ define_field_methods(name)
29
+ end
30
+
31
+ def define_field_methods(name)
32
+ define_method("#{name}?".to_sym) { data[name].present? }
33
+ define_method("#{name}=".to_sym) { |value| data[name] = value }
34
+ define_method(name) do
35
+ write_attribute(name, data[name] || attribute(name))
36
+ attribute(name)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rspice"
4
+ require "instructor/spec_helper"
5
+
6
+ require_relative "custom_matchers"
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Spicerack
4
4
  # This constant is managed by spicerack
5
- VERSION = "0.9.5"
5
+ VERSION = "0.9.6"
6
6
  end
data/lib/spicerack.rb CHANGED
@@ -9,4 +9,7 @@ require "short_circu_it"
9
9
  require "technologic"
10
10
  require "tablesalt"
11
11
 
12
+ require "spicerack/array_index"
13
+ require "spicerack/hash_model"
14
+
12
15
  module Spicerack; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spicerack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Garside
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-05-20 00:00:00.000000000 Z
12
+ date: 2019-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: around_the_world
@@ -17,84 +17,84 @@ dependencies:
17
17
  requirements:
18
18
  - - '='
19
19
  - !ruby/object:Gem::Version
20
- version: 0.9.5
20
+ version: 0.9.6
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - '='
26
26
  - !ruby/object:Gem::Version
27
- version: 0.9.5
27
+ version: 0.9.6
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: instructor
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - '='
33
33
  - !ruby/object:Gem::Version
34
- version: 0.9.5
34
+ version: 0.9.6
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - '='
40
40
  - !ruby/object:Gem::Version
41
- version: 0.9.5
41
+ version: 0.9.6
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: redis_hash
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 0.9.5
48
+ version: 0.9.6
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: 0.9.5
55
+ version: 0.9.6
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: short_circu_it
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: 0.9.5
62
+ version: 0.9.6
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: 0.9.5
69
+ version: 0.9.6
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: technologic
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - '='
75
75
  - !ruby/object:Gem::Version
76
- version: 0.9.5
76
+ version: 0.9.6
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - '='
82
82
  - !ruby/object:Gem::Version
83
- version: 0.9.5
83
+ version: 0.9.6
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: tablesalt
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - '='
89
89
  - !ruby/object:Gem::Version
90
- version: 0.9.5
90
+ version: 0.9.6
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - '='
96
96
  - !ruby/object:Gem::Version
97
- version: 0.9.5
97
+ version: 0.9.6
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: bundler
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -213,28 +213,28 @@ dependencies:
213
213
  requirements:
214
214
  - - '='
215
215
  - !ruby/object:Gem::Version
216
- version: 0.9.5
216
+ version: 0.9.6
217
217
  type: :development
218
218
  prerelease: false
219
219
  version_requirements: !ruby/object:Gem::Requirement
220
220
  requirements:
221
221
  - - '='
222
222
  - !ruby/object:Gem::Version
223
- version: 0.9.5
223
+ version: 0.9.6
224
224
  - !ruby/object:Gem::Dependency
225
225
  name: spicerack-styleguide
226
226
  requirement: !ruby/object:Gem::Requirement
227
227
  requirements:
228
228
  - - '='
229
229
  - !ruby/object:Gem::Version
230
- version: 0.9.5
230
+ version: 0.9.6
231
231
  type: :development
232
232
  prerelease: false
233
233
  version_requirements: !ruby/object:Gem::Requirement
234
234
  requirements:
235
235
  - - '='
236
236
  - !ruby/object:Gem::Version
237
- version: 0.9.5
237
+ version: 0.9.6
238
238
  description: This collection of gems will spice up your rails and kick your rubies
239
239
  up a notch. Bam!
240
240
  email:
@@ -247,6 +247,11 @@ files:
247
247
  - LICENSE.txt
248
248
  - README.md
249
249
  - lib/spicerack.rb
250
+ - lib/spicerack/array_index.rb
251
+ - lib/spicerack/custom_matchers.rb
252
+ - lib/spicerack/custom_matchers/define_field.rb
253
+ - lib/spicerack/hash_model.rb
254
+ - lib/spicerack/spec_helper.rb
250
255
  - lib/spicerack/version.rb
251
256
  homepage: https://www.freshly.com/
252
257
  licenses: