knuckles 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ RSpec.describe Knuckles::Renderer do
2
+ describe ".call" do
3
+ it "serializes a collection of objects" do
4
+ tag_a = Tag.new(1, "alpha")
5
+ tag_b = Tag.new(2, "gamma")
6
+ post_a = Post.new(1, "hello", [tag_a, tag_b])
7
+ post_b = Post.new(2, "there", [tag_a])
8
+
9
+ objects = prepare([post_a, post_b])
10
+ results = Knuckles::Renderer.call(objects, view: PostView)
11
+
12
+ expect(results[0][:result]).to eq(
13
+ posts: [
14
+ {id: 1, title: "hello", tag_ids: [1, 2]}
15
+ ],
16
+ tags: [
17
+ {id: 1, name: "alpha"},
18
+ {id: 2, name: "gamma"}
19
+ ]
20
+ )
21
+
22
+ expect(results[1][:result]).to eq(
23
+ posts: [
24
+ {id: 2, title: "there", tag_ids: [1]}
25
+ ],
26
+ tags: [
27
+ {id: 1, name: "alpha"}
28
+ ]
29
+ )
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ require "time"
2
+
3
+ RSpec.describe Knuckles::View do
4
+ let(:view) { Knuckles::View }
5
+
6
+ describe "callback methods" do
7
+ it "defines defaults for all callback methods" do
8
+ obj = Object.new
9
+
10
+ expect(view.root).to be_nil
11
+ expect(view.data(obj)).to eq({})
12
+ expect(view.relations(obj)).to eq({})
13
+ end
14
+ end
15
+
16
+ describe ".has_one" do
17
+ it "serializes an object using the given view" do
18
+ object = Tag.new(1, "Alpha")
19
+
20
+ expect(view.has_one(object, TagView)).to eq(
21
+ [{id: object.id, name: object.name}]
22
+ )
23
+ end
24
+ end
25
+
26
+ describe ".has_many" do
27
+ it "serializes all objects using the given view" do
28
+ object_a = Tag.new(1, "Alpha")
29
+ object_b = Tag.new(2, "Beta")
30
+
31
+ objects = [object_a, object_b]
32
+
33
+ expect(view.has_many(objects, TagView)).to eq(
34
+ [{id: 1, name: "Alpha"}, {id: 2, name: "Beta"}]
35
+ )
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,41 @@
1
+ RSpec.describe Knuckles::Writer do
2
+ class FakeCache
3
+ def write_multi(*)
4
+ true
5
+ end
6
+ end
7
+
8
+ after do
9
+ Knuckles.reset!
10
+ end
11
+
12
+ describe ".call" do
13
+ it "writes all un-cached values" do
14
+ prepared = [
15
+ {key: "t/1/1", cached?: true, result: {tags: [{id: 1, name: "a"}]}},
16
+ {key: "t/2/2", cached?: false, result: {tags: [{id: 2, name: "b"}]}}
17
+ ]
18
+
19
+ result = Knuckles::Writer.call(prepared, {})
20
+
21
+ expect(result).to eq(prepared)
22
+ expect(Knuckles.cache.read("t/1/1")).to be_nil
23
+ expect(Knuckles.cache.read("t/2/2")).not_to be_nil
24
+ end
25
+
26
+ it "leverages write multi for caches that support it" do
27
+ prepared = [
28
+ {key: "t/1/1", cached?: false, result: {tags: []}},
29
+ {key: "t/2/1", cached?: true, result: {tags: []}}
30
+ ]
31
+
32
+ Knuckles.cache = FakeCache.new
33
+
34
+ expect(Knuckles.cache).to receive(:write_multi) { true }
35
+
36
+ result = Knuckles::Writer.call(prepared, {})
37
+
38
+ expect(result).to eq(prepared)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ require "knuckles"
2
+
3
+ RSpec.describe Knuckles do
4
+ after do
5
+ Knuckles.reset!
6
+ end
7
+
8
+ describe "customization" do
9
+ it "all dependencies can be overridden" do
10
+ custom = Object.new
11
+
12
+ Knuckles.cache = custom
13
+ Knuckles.keygen = custom
14
+ Knuckles.notifications = custom
15
+ Knuckles.serializer = custom
16
+
17
+ expect(Knuckles.cache).to eq(custom)
18
+ expect(Knuckles.keygen).to eq(custom)
19
+ expect(Knuckles.notifications).to eq(custom)
20
+ expect(Knuckles.serializer).to eq(custom)
21
+ end
22
+
23
+ it "provides a confugration block for convenience" do
24
+ custom = Object.new
25
+
26
+ Knuckles.configure do |config|
27
+ config.cache = custom
28
+ end
29
+
30
+ expect(Knuckles.cache).to eq(custom)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require "coveralls"
2
+ require "knuckles"
3
+
4
+ require_relative "./support/models"
5
+ require_relative "./support/views"
6
+
7
+ Coveralls.wear!
8
+
9
+ module PrepHelper
10
+ def prepare(objects)
11
+ Knuckles::Pipeline.new.prepare(objects)
12
+ end
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.expect_with :rspec do |expectations|
17
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
18
+ end
19
+
20
+ config.mock_with :rspec do |mocks|
21
+ mocks.verify_partial_doubles = true
22
+ end
23
+
24
+ config.disable_monkey_patching!
25
+ config.warnings = true
26
+
27
+ config.default_formatter = "doc" if config.files_to_run.one?
28
+
29
+ config.order = :random
30
+ Kernel.srand config.seed
31
+
32
+ config.include PrepHelper
33
+ end
@@ -0,0 +1,11 @@
1
+ Post = Struct.new(:id, :title, :tags) do
2
+ def updated_at
3
+ Time.now
4
+ end
5
+ end
6
+
7
+ Tag = Struct.new(:id, :name) do
8
+ def updated_at
9
+ Time.now
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ PostView = Module.new do
2
+ extend Knuckles::View
3
+
4
+ def self.root
5
+ :posts
6
+ end
7
+
8
+ def self.data(post, _)
9
+ {id: post.id, title: post.title, tag_ids: post.tags.map(&:id)}
10
+ end
11
+
12
+ def self.relations(post, _)
13
+ {tags: has_many(post.tags, TagView)}
14
+ end
15
+ end
16
+
17
+ TagView = Module.new do
18
+ extend Knuckles::View
19
+
20
+ def self.root
21
+ :tags
22
+ end
23
+
24
+ def self.data(tag, _)
25
+ {id: tag.id, name: tag.name}
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knuckles
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Parker Selbert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description:
70
+ email:
71
+ - parker@sorentwo.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".rubocop.yml"
79
+ - ".travis.yml"
80
+ - CHANGELOG.md
81
+ - Gemfile
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - bench/bench_helper.rb
86
+ - bench/fixtures/serializers.rb
87
+ - bench/fixtures/submissions.json
88
+ - bench/profiling.rb
89
+ - bench/realistic.rb
90
+ - bench/simple.rb
91
+ - bin/rspec
92
+ - knuckles.gemspec
93
+ - lib/knuckles.rb
94
+ - lib/knuckles/combiner.rb
95
+ - lib/knuckles/dumper.rb
96
+ - lib/knuckles/fetcher.rb
97
+ - lib/knuckles/hydrator.rb
98
+ - lib/knuckles/keygen.rb
99
+ - lib/knuckles/pipeline.rb
100
+ - lib/knuckles/renderer.rb
101
+ - lib/knuckles/version.rb
102
+ - lib/knuckles/view.rb
103
+ - lib/knuckles/writer.rb
104
+ - spec/knuckles/combiner_spec.rb
105
+ - spec/knuckles/dumper_spec.rb
106
+ - spec/knuckles/fetcher_spec.rb
107
+ - spec/knuckles/hydrator_spec.rb
108
+ - spec/knuckles/keygen_spec.rb
109
+ - spec/knuckles/pipeline_spec.rb
110
+ - spec/knuckles/renderer_spec.rb
111
+ - spec/knuckles/view_spec.rb
112
+ - spec/knuckles/writer_spec.rb
113
+ - spec/knuckles_spec.rb
114
+ - spec/spec_helper.rb
115
+ - spec/support/models.rb
116
+ - spec/support/views.rb
117
+ homepage: ''
118
+ licenses:
119
+ - MIT
120
+ metadata: {}
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 2.5.1
138
+ signing_key:
139
+ specification_version: 4
140
+ summary: Simple performance aware data serialization
141
+ test_files:
142
+ - spec/knuckles/combiner_spec.rb
143
+ - spec/knuckles/dumper_spec.rb
144
+ - spec/knuckles/fetcher_spec.rb
145
+ - spec/knuckles/hydrator_spec.rb
146
+ - spec/knuckles/keygen_spec.rb
147
+ - spec/knuckles/pipeline_spec.rb
148
+ - spec/knuckles/renderer_spec.rb
149
+ - spec/knuckles/view_spec.rb
150
+ - spec/knuckles/writer_spec.rb
151
+ - spec/knuckles_spec.rb
152
+ - spec/spec_helper.rb
153
+ - spec/support/models.rb
154
+ - spec/support/views.rb