spicerack 0.9.5 → 0.9.6

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
  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: