knuckles 0.1.1 → 0.2.0

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
  SHA1:
3
- metadata.gz: 5c87ae8cc3d3661d7f726b97cc65a6a14ddd1570
4
- data.tar.gz: b9a84d855d7088f3808eeeba46311e6707f220e6
3
+ metadata.gz: 19a29c342c27e5b5dd82cf59118e2145707f2d06
4
+ data.tar.gz: 9660418feed584f2ae6b0b75a54ece8a31fab387
5
5
  SHA512:
6
- metadata.gz: 288a745e8475764d7322d8108ef201c93b9adc61f10469caad7b00d626d8598202c6e88baa775e1c82d6a18920371a3841aa259b036a33cefb05a230067b0a24
7
- data.tar.gz: 0660c72b861d3405249949734808987969644f43ad6ce63b01b0b1d7166586908e44c1ca8f1bba73c434e7c6d6cfe3f01c4becb0fa65e86751fae694c72458f4
6
+ metadata.gz: a29a4f519dcae90684811f5905e3641d20823e681c487dbefaea4a0157abc8e242ec368fa6a6fc5fbbcca6faddef9a9d7dadea8f41f241c6be3c7af158bcfd2f
7
+ data.tar.gz: e6662ef32ed48439b934cb2997f8cbb8f21b539aba41ac28e30aa57ebdcc7847732e9b1028fd58485f1795a220cc655165ad3d759851e781b8faf75f122c3894
data/.rubocop.yml CHANGED
@@ -1,9 +1,17 @@
1
1
  AllCops:
2
2
  Exclude:
3
- - 'bench/**/*'
4
- - 'bin/*'
5
- - 'tmp/**/*'
6
- - 'vendor/**/*'
3
+ - "bench/**/*"
4
+ - "bin/*"
5
+ - "tmp/**/*"
6
+ - "vendor/**/*"
7
+
8
+ Style/FrozenStringLiteralComment:
9
+ EnforcedStyle: always
10
+ Exclude:
11
+ - "Gemfile*"
12
+ - "Rakefile"
13
+ - "*.gemspec"
14
+ - "spec/**/*"
7
15
 
8
16
  Style/IfUnlessModifier:
9
17
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## v0.2.0 - 2016-03-23
2
+
3
+ * Add: Introduce the enhancer stage, used to augment data after it has been
4
+ rendered but before it is combined. This allows pruning or augmenting rendered
5
+ data after it has been retrieved from the cache, meaning results can be
6
+ tailored to the "current user" of a request without per-user-caching.
7
+ * Add: Uniformly combine cached and rendered results regardless of key type.
8
+ This also sees an improvement to the `uniq` check performed during dumping.
9
+
1
10
  ## v0.1.1 - 2016-03-22
2
11
 
3
12
  * Performance: Improve unique handling by favoring a single `uniq!` call over
@@ -1,19 +1,19 @@
1
- require "set"
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Knuckles
4
4
  module Combiner
5
5
  extend self
6
6
 
7
7
  def name
8
- "combiner".freeze
8
+ "combiner"
9
9
  end
10
10
 
11
11
  def call(prepared, _)
12
12
  prepared.each_with_object(array_backed_hash) do |hash, memo|
13
13
  hash[:result].each do |root, values|
14
14
  case values
15
- when Hash then memo[root] << values
16
- when Array then memo[root] += values
15
+ when Hash then memo[root.to_s] << values
16
+ when Array then memo[root.to_s] += values
17
17
  end
18
18
  end
19
19
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Dumper
3
5
  extend self
4
6
 
5
7
  def name
6
- "dumper".freeze
8
+ "dumper"
7
9
  end
8
10
 
9
11
  def call(objects, _options)
@@ -14,7 +16,9 @@ module Knuckles
14
16
 
15
17
  def keys_to_arrays(objects)
16
18
  objects.each do |_, value|
17
- value.uniq! if value.is_a?(Array)
19
+ if value.is_a?(Array)
20
+ value.uniq! { |hash| hash["id"] || hash[:id] }
21
+ end
18
22
  end
19
23
  end
20
24
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Knuckles
4
+ module Enhancer
5
+ extend self
6
+
7
+ def name
8
+ "enhancer"
9
+ end
10
+
11
+ def call(prepared, options)
12
+ enhancer = options[:enhancer]
13
+
14
+ if enhancer
15
+ prepared.each do |hash|
16
+ hash[:result] = enhancer.call(hash[:result], options)
17
+ end
18
+ end
19
+
20
+ prepared
21
+ end
22
+ end
23
+ end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Fetcher
3
5
  extend self
4
6
 
5
7
  def name
6
- "fetcher".freeze
8
+ "fetcher"
7
9
  end
8
10
 
9
11
  def call(prepared, options)
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Hydrator
3
5
  extend self
4
6
 
5
7
  def name
6
- "hydrator".freeze
8
+ "hydrator"
7
9
  end
8
10
 
9
11
  def call(prepared, options)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Keygen
3
5
  extend self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  class Pipeline
3
5
  def self.default_stages
@@ -5,6 +7,7 @@ module Knuckles
5
7
  Knuckles::Hydrator,
6
8
  Knuckles::Renderer,
7
9
  Knuckles::Writer,
10
+ Knuckles::Enhancer,
8
11
  Knuckles::Combiner,
9
12
  Knuckles::Dumper]
10
13
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Renderer
3
5
  extend self
4
6
 
5
7
  def name
6
- "renderer".freeze
8
+ "renderer"
7
9
  end
8
10
 
9
11
  def call(objects, options)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
- VERSION = "0.1.1".freeze
4
+ VERSION = "0.2.0".freeze
3
5
  end
data/lib/knuckles/view.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module View
3
5
  extend self
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Knuckles
2
4
  module Writer
3
5
  extend self
4
6
 
5
7
  def name
6
- "writer".freeze
8
+ "writer"
7
9
  end
8
10
 
9
11
  def call(objects, _)
data/lib/knuckles.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/notifications"
2
4
  require "active_support/cache"
3
5
  require "json"
@@ -5,6 +7,7 @@ require "json"
5
7
  module Knuckles
6
8
  autoload :Combiner, "knuckles/combiner"
7
9
  autoload :Dumper, "knuckles/dumper"
10
+ autoload :Enhancer, "knuckles/enhancer"
8
11
  autoload :Fetcher, "knuckles/fetcher"
9
12
  autoload :Hydrator, "knuckles/hydrator"
10
13
  autoload :Keygen, "knuckles/keygen"
@@ -10,8 +10,8 @@ RSpec.describe Knuckles::Combiner do
10
10
  }
11
11
  }, {
12
12
  result: {
13
- posts: [{id: 2, title: "there", tag_ids: [1]}],
14
- tags: [{id: 1, name: "alpha"}]
13
+ "posts" => [{"id" => 2, "title" => "there", "tag_ids" => [1]}],
14
+ "tags" => [{"id" => 1, "name" => "alpha"}]
15
15
  }
16
16
  }
17
17
  ]
@@ -19,17 +19,17 @@ RSpec.describe Knuckles::Combiner do
19
19
  combined = Knuckles::Combiner.call(prepared, {})
20
20
 
21
21
  expect(combined).to eq(
22
- author: [
22
+ "author" => [
23
23
  {id: 1, name: "Michael"}
24
24
  ],
25
- posts: [
25
+ "posts" => [
26
26
  {id: 1, title: "hello", tag_ids: [1, 2]},
27
- {id: 2, title: "there", tag_ids: [1]}
27
+ {"id" => 2, "title" => "there", "tag_ids" => [1]}
28
28
  ],
29
- tags: [
29
+ "tags" => [
30
30
  {id: 1, name: "alpha"},
31
31
  {id: 2, name: "gamma"},
32
- {id: 1, name: "alpha"}
32
+ {"id" => 1, "name" => "alpha"}
33
33
  ]
34
34
  )
35
35
  end
@@ -5,11 +5,14 @@ RSpec.describe Knuckles::Dumper do
5
5
  author: {id: 1, name: "Ernest"},
6
6
  posts: [
7
7
  {id: 1, title: "great"},
8
+ {id: 2, title: "stuff"},
8
9
  {id: 2, title: "stuff"}
9
10
  ],
10
11
  tags: [
11
12
  {id: 1, name: "alpha"},
12
- {id: 2, name: "gamma"}
13
+ {id: 2, name: "gamma"},
14
+ {id: 1, name: "alpha"},
15
+ {"id" => 2, "name" => "gamma"}
13
16
  ]
14
17
  }
15
18
 
@@ -0,0 +1,33 @@
1
+ RSpec.describe Knuckles::Enhancer do
2
+ describe ".call" do
3
+ it "is a noop without an enhancer lambda" do
4
+ prepared = [Tag.new(1, "alpha")]
5
+
6
+ expect(Knuckles::Enhancer.call(prepared, {})).to eq(prepared)
7
+ end
8
+
9
+ it "modifies the rendered values with a lambda" do
10
+ prepared = [
11
+ {result: {"posts" => [], "tags" => []}},
12
+ {result: {"posts" => [], "tags" => []}}
13
+ ]
14
+
15
+ enhanced = Knuckles::Enhancer.call(
16
+ prepared,
17
+ tagless: true,
18
+ enhancer: lambda do |result, options|
19
+ if options[:tagless]
20
+ result.delete_if { |key, _| key == "tags" }
21
+ end
22
+
23
+ result
24
+ end
25
+ )
26
+
27
+ expect(enhanced).to eq([
28
+ {result: {"posts" => []}},
29
+ {result: {"posts" => []}}
30
+ ])
31
+ end
32
+ end
33
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knuckles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Selbert
@@ -93,6 +93,7 @@ files:
93
93
  - lib/knuckles.rb
94
94
  - lib/knuckles/combiner.rb
95
95
  - lib/knuckles/dumper.rb
96
+ - lib/knuckles/enhancer.rb
96
97
  - lib/knuckles/fetcher.rb
97
98
  - lib/knuckles/hydrator.rb
98
99
  - lib/knuckles/keygen.rb
@@ -103,6 +104,7 @@ files:
103
104
  - lib/knuckles/writer.rb
104
105
  - spec/knuckles/combiner_spec.rb
105
106
  - spec/knuckles/dumper_spec.rb
107
+ - spec/knuckles/enhancer_spec.rb
106
108
  - spec/knuckles/fetcher_spec.rb
107
109
  - spec/knuckles/hydrator_spec.rb
108
110
  - spec/knuckles/keygen_spec.rb
@@ -141,6 +143,7 @@ summary: Simple performance aware data serialization
141
143
  test_files:
142
144
  - spec/knuckles/combiner_spec.rb
143
145
  - spec/knuckles/dumper_spec.rb
146
+ - spec/knuckles/enhancer_spec.rb
144
147
  - spec/knuckles/fetcher_spec.rb
145
148
  - spec/knuckles/hydrator_spec.rb
146
149
  - spec/knuckles/keygen_spec.rb