knuckles 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +40 -13
  4. data/lib/knuckles/keygen.rb +22 -0
  5. data/lib/knuckles/pipeline.rb +82 -26
  6. data/lib/knuckles/stages/combiner.rb +24 -0
  7. data/lib/knuckles/stages/dumper.rb +23 -0
  8. data/lib/knuckles/stages/enhancer.rb +21 -0
  9. data/lib/knuckles/stages/fetcher.rb +30 -0
  10. data/lib/knuckles/stages/hydrator.rb +29 -0
  11. data/lib/knuckles/stages/renderer.rb +27 -0
  12. data/lib/knuckles/stages/writer.rb +41 -0
  13. data/lib/knuckles/stages.rb +13 -0
  14. data/lib/knuckles/version.rb +1 -1
  15. data/lib/knuckles/view.rb +104 -5
  16. data/lib/knuckles.rb +55 -7
  17. data/spec/knuckles/pipeline_spec.rb +0 -40
  18. data/spec/knuckles/{combiner_spec.rb → stages/combiner_spec.rb} +2 -2
  19. data/spec/knuckles/{dumper_spec.rb → stages/dumper_spec.rb} +2 -2
  20. data/spec/knuckles/{enhancer_spec.rb → stages/enhancer_spec.rb} +3 -3
  21. data/spec/knuckles/{fetcher_spec.rb → stages/fetcher_spec.rb} +3 -3
  22. data/spec/knuckles/{hydrator_spec.rb → stages/hydrator_spec.rb} +3 -3
  23. data/spec/knuckles/{renderer_spec.rb → stages/renderer_spec.rb} +2 -2
  24. data/spec/knuckles/{writer_spec.rb → stages/writer_spec.rb} +3 -3
  25. metadata +31 -43
  26. data/.gitignore +0 -15
  27. data/.rspec +0 -2
  28. data/.rubocop.yml +0 -41
  29. data/.travis.yml +0 -10
  30. data/Gemfile +0 -11
  31. data/Rakefile +0 -9
  32. data/bench/bench_helper.rb +0 -48
  33. data/bench/fixtures/serializers.rb +0 -93
  34. data/bench/fixtures/submissions.json +0 -1
  35. data/bench/profiling.rb +0 -14
  36. data/bench/realistic.rb +0 -9
  37. data/bench/simple.rb +0 -25
  38. data/bin/rspec +0 -16
  39. data/knuckles.gemspec +0 -24
  40. data/lib/knuckles/combiner.rb +0 -26
  41. data/lib/knuckles/dumper.rb +0 -25
  42. data/lib/knuckles/enhancer.rb +0 -23
  43. data/lib/knuckles/fetcher.rb +0 -32
  44. data/lib/knuckles/hydrator.rb +0 -31
  45. data/lib/knuckles/renderer.rb +0 -29
  46. data/lib/knuckles/writer.rb +0 -43
data/lib/knuckles.rb CHANGED
@@ -4,46 +4,94 @@ require "active_support/notifications"
4
4
  require "active_support/cache"
5
5
  require "json"
6
6
 
7
+ # Knuckles is a performance focused data serialization pipeline. More simply,
8
+ # it tries to serialize models into large JSON payloads as quickly as possible.
9
+ # It operates on a collection of data through stages, passing them through a
10
+ # pipeline of transformations.
11
+ #
12
+ # The default configuration uses `MemoryStore`, but you can configure it along
13
+ # with other customizations.
14
+ #
15
+ # @example Configuration
16
+ #
17
+ # Knuckles.configure do |config|
18
+ # config.cache = Readthis::Cache.new
19
+ # config.keygen = Readthis::Expanders
20
+ # config.serializer = Oj
21
+ # end
22
+ #
23
+ # With the module configured you can begin transforming models into JSON (or
24
+ # MessagePack, whatever your API uses):
25
+ #
26
+ # @example Usage with default pipeline
27
+ #
28
+ # Knuckles.new.call(models, view: SubmissionView) #=>
29
+ # '{"submissions":[], "tags":[], "responses":[]}'
30
+ #
7
31
  module Knuckles
8
- autoload :Combiner, "knuckles/combiner"
9
- autoload :Dumper, "knuckles/dumper"
10
- autoload :Enhancer, "knuckles/enhancer"
11
- autoload :Fetcher, "knuckles/fetcher"
12
- autoload :Hydrator, "knuckles/hydrator"
13
32
  autoload :Keygen, "knuckles/keygen"
14
33
  autoload :Pipeline, "knuckles/pipeline"
15
- autoload :Renderer, "knuckles/renderer"
34
+ autoload :Stages, "knuckles/stages"
16
35
  autoload :View, "knuckles/view"
17
- autoload :Writer, "knuckles/writer"
18
36
 
19
37
  extend self
20
38
 
21
39
  attr_writer :cache, :keygen, :notifications, :serializer
22
40
 
41
+ # Convenience method for initializing a new `Pipeline`
42
+ #
43
+ # @see Knuckles::Pipeline#initialize
44
+ #
23
45
  def new(*args)
24
46
  Knuckles::Pipeline.new(*args)
25
47
  end
26
48
 
49
+ # Module accessor for `cache`, defaults to `Cache::MemoryStore`
50
+ #
51
+ # @return [#cache] A cache instance
52
+ #
27
53
  def cache
28
54
  @cache ||= ActiveSupport::Cache::MemoryStore.new
29
55
  end
30
56
 
57
+ # Module accessor `keygen`, defaults to `Knuckles::Keygen`
58
+ #
59
+ # @return [Module] Cache key generation module
60
+ #
31
61
  def keygen
32
62
  @keygen ||= Knuckles::Keygen
33
63
  end
34
64
 
65
+ # Module accessor for `notifications`, defaults to
66
+ # `ActiveSupport::Notifications`
67
+ #
68
+ # @return [Module] Instrumentation module
69
+ #
35
70
  def notifications
36
71
  @notifications ||= ActiveSupport::Notifications
37
72
  end
38
73
 
74
+ # Module accessor for `serializer`, defaults to `JSON`
75
+ #
76
+ # @return [Module] The serializer
77
+ #
39
78
  def serializer
40
79
  @serializer ||= JSON
41
80
  end
42
81
 
82
+ # Convenience for setting properties as within a block
83
+ #
84
+ # @example Configuring knuckles
85
+ #
86
+ # Knuckles.configure do |config|
87
+ # config.serializer = MessagePack
88
+ # end
89
+ #
43
90
  def configure
44
91
  yield self
45
92
  end
46
93
 
94
+ # @private
47
95
  def reset!
48
96
  @cache = nil
49
97
  @keygen = nil
@@ -13,46 +13,6 @@ RSpec.describe Knuckles::Pipeline do
13
13
  end
14
14
  end
15
15
 
16
- describe "#delete" do
17
- it "removes an existing stage" do
18
- pipeline = Knuckles::Pipeline.new
19
-
20
- pipeline.delete(Knuckles::Writer)
21
-
22
- expect(pipeline.stages).not_to include(Knuckles::Writer)
23
- end
24
- end
25
-
26
- describe "#insert_after" do
27
- it "adds a stage after an existing stage" do
28
- custom = Module.new
29
- pipeline = Knuckles::Pipeline.new
30
-
31
- pipeline.insert_after(Knuckles::Fetcher, custom)
32
-
33
- expect(pipeline.stages).to include(custom)
34
- expect(pipeline.stages.take(2)).to eq([
35
- Knuckles::Fetcher,
36
- custom
37
- ])
38
- end
39
- end
40
-
41
- describe "#insert_before" do
42
- it "adds a stage after an existing stage" do
43
- custom = Module.new
44
- pipeline = Knuckles::Pipeline.new
45
-
46
- pipeline.insert_before(Knuckles::Fetcher, custom)
47
-
48
- expect(pipeline.stages).to include(custom)
49
- expect(pipeline.stages.take(2)).to eq([
50
- custom,
51
- Knuckles::Fetcher
52
- ])
53
- end
54
- end
55
-
56
16
  describe "#call" do
57
17
  it "aggregates the result of all stages" do
58
18
  filter_a = Module.new do
@@ -1,4 +1,4 @@
1
- RSpec.describe Knuckles::Combiner do
1
+ RSpec.describe Knuckles::Stages::Combiner do
2
2
  describe ".call" do
3
3
  it "merges all results into a single object" do
4
4
  prepared = [
@@ -16,7 +16,7 @@ RSpec.describe Knuckles::Combiner do
16
16
  }
17
17
  ]
18
18
 
19
- combined = Knuckles::Combiner.call(prepared, {})
19
+ combined = Knuckles::Stages::Combiner.call(prepared, {})
20
20
 
21
21
  expect(combined).to eq(
22
22
  "author" => [
@@ -1,4 +1,4 @@
1
- RSpec.describe Knuckles::Dumper do
1
+ RSpec.describe Knuckles::Stages::Dumper do
2
2
  describe ".call" do
3
3
  it "dumps a tree of objects" do
4
4
  objects = {
@@ -16,7 +16,7 @@ RSpec.describe Knuckles::Dumper do
16
16
  ]
17
17
  }
18
18
 
19
- dumped = Knuckles::Dumper.call(objects, {})
19
+ dumped = Knuckles::Stages::Dumper.call(objects, {})
20
20
 
21
21
  expect(dumped).to eq(
22
22
  JSON.dump(
@@ -1,9 +1,9 @@
1
- RSpec.describe Knuckles::Enhancer do
1
+ RSpec.describe Knuckles::Stages::Enhancer do
2
2
  describe ".call" do
3
3
  it "is a noop without an enhancer lambda" do
4
4
  prepared = [Tag.new(1, "alpha")]
5
5
 
6
- expect(Knuckles::Enhancer.call(prepared, {})).to eq(prepared)
6
+ expect(Knuckles::Stages::Enhancer.call(prepared, {})).to eq(prepared)
7
7
  end
8
8
 
9
9
  it "modifies the rendered values with a lambda" do
@@ -12,7 +12,7 @@ RSpec.describe Knuckles::Enhancer do
12
12
  {result: {"posts" => [], "tags" => []}}
13
13
  ]
14
14
 
15
- enhanced = Knuckles::Enhancer.call(
15
+ enhanced = Knuckles::Stages::Enhancer.call(
16
16
  prepared,
17
17
  tagless: true,
18
18
  enhancer: lambda do |result, options|
@@ -1,4 +1,4 @@
1
- RSpec.describe Knuckles::Fetcher do
1
+ RSpec.describe Knuckles::Stages::Fetcher do
2
2
  describe ".call" do
3
3
  it "fetches all cached data for top level objects" do
4
4
  objects = [Tag.new(1, "alpha"), Tag.new(2, "gamma")]
@@ -6,7 +6,7 @@ RSpec.describe Knuckles::Fetcher do
6
6
  Knuckles.cache.write(Knuckles.keygen.expand_key(objects.first), "result")
7
7
 
8
8
  objects = prepare(objects)
9
- results = Knuckles::Fetcher.call(objects, {})
9
+ results = Knuckles::Stages::Fetcher.call(objects, {})
10
10
 
11
11
  expect(pluck(results, :result)).to eq(["result", nil])
12
12
  expect(pluck(results, :cached?)).to eq([true, false])
@@ -20,7 +20,7 @@ RSpec.describe Knuckles::Fetcher do
20
20
  end
21
21
 
22
22
  objects = prepare([Tag.new(1, "alpha")])
23
- results = Knuckles::Fetcher.call(objects, keygen: keygen)
23
+ results = Knuckles::Stages::Fetcher.call(objects, keygen: keygen)
24
24
 
25
25
  expect(pluck(results, :key)).to eq(["alpha"])
26
26
  end
@@ -1,9 +1,9 @@
1
- RSpec.describe Knuckles::Hydrator do
1
+ RSpec.describe Knuckles::Stages::Hydrator do
2
2
  describe ".call" do
3
3
  it "is a noop without a hydrate lambda" do
4
4
  objects = [Tag.new(1, "alpha")]
5
5
 
6
- expect(Knuckles::Hydrator.call(objects, {})).to eq(objects)
6
+ expect(Knuckles::Stages::Hydrator.call(objects, {})).to eq(objects)
7
7
  end
8
8
 
9
9
  it "refines the object collection using hydrate" do
@@ -14,7 +14,7 @@ RSpec.describe Knuckles::Hydrator do
14
14
  hashes.each { |hash| hash[:object] = :updated }
15
15
  end
16
16
 
17
- hydrated = Knuckles::Hydrator.call(prepared, hydrate: hydrate)
17
+ hydrated = Knuckles::Stages::Hydrator.call(prepared, hydrate: hydrate)
18
18
 
19
19
  expect(hydrated.map { |hash| hash[:object] }).to eq([:updated, :updated])
20
20
  end
@@ -1,4 +1,4 @@
1
- RSpec.describe Knuckles::Renderer do
1
+ RSpec.describe Knuckles::Stages::Renderer do
2
2
  describe ".call" do
3
3
  it "serializes a collection of objects" do
4
4
  tag_a = Tag.new(1, "alpha")
@@ -7,7 +7,7 @@ RSpec.describe Knuckles::Renderer do
7
7
  post_b = Post.new(2, "there", [tag_a])
8
8
 
9
9
  objects = prepare([post_a, post_b])
10
- results = Knuckles::Renderer.call(objects, view: PostView)
10
+ results = Knuckles::Stages::Renderer.call(objects, view: PostView)
11
11
 
12
12
  expect(results[0][:result]).to eq(
13
13
  posts: [
@@ -1,4 +1,4 @@
1
- RSpec.describe Knuckles::Writer do
1
+ RSpec.describe Knuckles::Stages::Writer do
2
2
  class FakeCache
3
3
  def write_multi(*)
4
4
  true
@@ -16,7 +16,7 @@ RSpec.describe Knuckles::Writer do
16
16
  {key: "t/2/2", cached?: false, result: {tags: [{id: 2, name: "b"}]}}
17
17
  ]
18
18
 
19
- result = Knuckles::Writer.call(prepared, {})
19
+ result = Knuckles::Stages::Writer.call(prepared, {})
20
20
 
21
21
  expect(result).to eq(prepared)
22
22
  expect(Knuckles.cache.read("t/1/1")).to be_nil
@@ -33,7 +33,7 @@ RSpec.describe Knuckles::Writer do
33
33
 
34
34
  expect(Knuckles.cache).to receive(:write_multi) { true }
35
35
 
36
- result = Knuckles::Writer.call(prepared, {})
36
+ result = Knuckles::Stages::Writer.call(prepared, {})
37
37
 
38
38
  expect(result).to eq(prepared)
39
39
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knuckles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Selbert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-23 00:00:00.000000000 Z
11
+ date: 2016-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - ">"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
19
+ version: '4.0'
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - ">"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -73,50 +73,37 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - ".gitignore"
77
- - ".rspec"
78
- - ".rubocop.yml"
79
- - ".travis.yml"
80
76
  - CHANGELOG.md
81
- - Gemfile
82
77
  - LICENSE.txt
83
78
  - 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
79
  - lib/knuckles.rb
94
- - lib/knuckles/combiner.rb
95
- - lib/knuckles/dumper.rb
96
- - lib/knuckles/enhancer.rb
97
- - lib/knuckles/fetcher.rb
98
- - lib/knuckles/hydrator.rb
99
80
  - lib/knuckles/keygen.rb
100
81
  - lib/knuckles/pipeline.rb
101
- - lib/knuckles/renderer.rb
82
+ - lib/knuckles/stages.rb
83
+ - lib/knuckles/stages/combiner.rb
84
+ - lib/knuckles/stages/dumper.rb
85
+ - lib/knuckles/stages/enhancer.rb
86
+ - lib/knuckles/stages/fetcher.rb
87
+ - lib/knuckles/stages/hydrator.rb
88
+ - lib/knuckles/stages/renderer.rb
89
+ - lib/knuckles/stages/writer.rb
102
90
  - lib/knuckles/version.rb
103
91
  - lib/knuckles/view.rb
104
- - lib/knuckles/writer.rb
105
- - spec/knuckles/combiner_spec.rb
106
- - spec/knuckles/dumper_spec.rb
107
- - spec/knuckles/enhancer_spec.rb
108
- - spec/knuckles/fetcher_spec.rb
109
- - spec/knuckles/hydrator_spec.rb
110
92
  - spec/knuckles/keygen_spec.rb
111
93
  - spec/knuckles/pipeline_spec.rb
112
- - spec/knuckles/renderer_spec.rb
94
+ - spec/knuckles/stages/combiner_spec.rb
95
+ - spec/knuckles/stages/dumper_spec.rb
96
+ - spec/knuckles/stages/enhancer_spec.rb
97
+ - spec/knuckles/stages/fetcher_spec.rb
98
+ - spec/knuckles/stages/hydrator_spec.rb
99
+ - spec/knuckles/stages/renderer_spec.rb
100
+ - spec/knuckles/stages/writer_spec.rb
113
101
  - spec/knuckles/view_spec.rb
114
- - spec/knuckles/writer_spec.rb
115
102
  - spec/knuckles_spec.rb
116
103
  - spec/spec_helper.rb
117
104
  - spec/support/models.rb
118
105
  - spec/support/views.rb
119
- homepage: ''
106
+ homepage: https://github.com/sorentwo/knuckles
120
107
  licenses:
121
108
  - MIT
122
109
  metadata: {}
@@ -141,17 +128,18 @@ signing_key:
141
128
  specification_version: 4
142
129
  summary: Simple performance aware data serialization
143
130
  test_files:
144
- - spec/knuckles/combiner_spec.rb
145
- - spec/knuckles/dumper_spec.rb
146
- - spec/knuckles/enhancer_spec.rb
147
- - spec/knuckles/fetcher_spec.rb
148
- - spec/knuckles/hydrator_spec.rb
149
131
  - spec/knuckles/keygen_spec.rb
150
132
  - spec/knuckles/pipeline_spec.rb
151
- - spec/knuckles/renderer_spec.rb
133
+ - spec/knuckles/stages/combiner_spec.rb
134
+ - spec/knuckles/stages/dumper_spec.rb
135
+ - spec/knuckles/stages/enhancer_spec.rb
136
+ - spec/knuckles/stages/fetcher_spec.rb
137
+ - spec/knuckles/stages/hydrator_spec.rb
138
+ - spec/knuckles/stages/renderer_spec.rb
139
+ - spec/knuckles/stages/writer_spec.rb
152
140
  - spec/knuckles/view_spec.rb
153
- - spec/knuckles/writer_spec.rb
154
141
  - spec/knuckles_spec.rb
155
142
  - spec/spec_helper.rb
156
143
  - spec/support/models.rb
157
144
  - spec/support/views.rb
145
+ has_rdoc:
data/.gitignore DELETED
@@ -1,15 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
15
- TODO.md
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper
data/.rubocop.yml DELETED
@@ -1,41 +0,0 @@
1
- AllCops:
2
- Exclude:
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/**/*"
15
-
16
- Style/IfUnlessModifier:
17
- Enabled: false
18
-
19
- # Documentation is coming
20
- Style/Documentation:
21
- Enabled: false
22
-
23
- # Extend self preserves private methods
24
- Style/ModuleFunction:
25
- Enabled: false
26
-
27
- Style/PredicateName:
28
- NamePrefix:
29
- - is_
30
- NamePrefixBlacklist:
31
- - is_
32
-
33
- Style/StringLiterals:
34
- EnforcedStyle: double_quotes
35
-
36
- Style/SpaceInsideHashLiteralBraces:
37
- EnforcedStyle: no_space
38
- EnforcedStyleForEmptyBraces: no_space
39
-
40
- Style/IndentArray:
41
- Enabled: false
data/.travis.yml DELETED
@@ -1,10 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.2.4
5
- - 2.3.0
6
- - ruby-head
7
- matrix:
8
- allow_failures:
9
- - rvm: ruby-head
10
- bundler_args: --without benchmarking
data/Gemfile DELETED
@@ -1,11 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec
4
-
5
- gem "rubocop", require: false
6
- gem "coveralls", require: false
7
-
8
- group :benchmarking do
9
- gem "benchmark-ips"
10
- gem "stackprof"
11
- end
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require "bundler/setup"
2
- require "bundler/gem_tasks"
3
- require "rubocop/rake_task"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
- RuboCop::RakeTask.new
8
-
9
- task default: [:spec, :rubocop]
@@ -1,48 +0,0 @@
1
- require "bundler"
2
-
3
- Bundler.setup
4
-
5
- require "active_support/cache"
6
- require "benchmark/ips"
7
- require "json"
8
- require "knuckles"
9
- require_relative "fixtures/serializers"
10
-
11
- class BenchModel
12
- attr_reader :key
13
-
14
- def initialize(key, attributes)
15
- attributes.each do |key, value|
16
- self.class.send(:define_method, key) { value }
17
- end
18
- end
19
-
20
- def cache_key
21
- "#{key}/#{id}/#{updated_at}"
22
- end
23
- end
24
-
25
- module BenchHelper
26
- extend self
27
-
28
- def submissions
29
- mapping = %w[scout responses tags]
30
- loaded = JSON.load(IO.read("bench/fixtures/submissions.json"))
31
-
32
- loaded.map do |object|
33
- mapping.each do |key|
34
- object[key] = structify(key, object[key])
35
- end
36
-
37
- structify('submissions', object)
38
- end
39
- end
40
-
41
- def structify(key, object)
42
- if object.is_a?(Array)
43
- object.map { |obj| BenchModel.new(key, obj) }
44
- else
45
- BenchModel.new(key, object)
46
- end
47
- end
48
- end
@@ -1,93 +0,0 @@
1
- module ScoutView
2
- extend Knuckles::View
3
-
4
- def self.root
5
- :scouts
6
- end
7
-
8
- def self.data(object, _)
9
- { id: object.id,
10
- first_name: object.first_name,
11
- gender: object.gender,
12
- city: object.city,
13
- state: object.state,
14
- country: object.country,
15
- education: object.education,
16
- employment_status: object.employment_status,
17
- ethnicity: object.ethnicity,
18
- household_composition: object.household_composition,
19
- household_income: object.household_income,
20
- industry: object.industry,
21
- created_at: object.created_at,
22
- updated_at: object.updated_at }
23
- end
24
- end
25
-
26
- module ResponseView
27
- extend Knuckles::View
28
-
29
- def self.root
30
- :responses
31
- end
32
-
33
- def self.data(object, _)
34
- { id: object.id,
35
- answers: object.answers,
36
- question_id: object.question_id,
37
- respondable_id: object.respondable_id,
38
- longitude: object.longitude,
39
- latitude: object.latitude,
40
- time_zone: object.time_zone,
41
- answered_at: object.answered_at,
42
- created_at: object.created_at,
43
- updated_at: object.updated_at }
44
- end
45
- end
46
-
47
- module TagView
48
- extend Knuckles::View
49
-
50
- def self.root
51
- :tags
52
- end
53
-
54
- def self.data(object, _)
55
- { id: object.id,
56
- parent_id: object.parent_id,
57
- name: object.name,
58
- group: object.group,
59
- auto_tag: object.auto_tag,
60
- keywords: object.keywords,
61
- created_at: object.created_at,
62
- updated_at: object.updated_at }
63
- end
64
- end
65
-
66
- module SubmissionView
67
- extend Knuckles::View
68
-
69
- def self.root
70
- :submissions
71
- end
72
-
73
- def self.data(object, _)
74
- { id: object.id,
75
- screener_id: object.screener_id,
76
- rating: object.rating,
77
- latitude: object.latitude,
78
- longitude: object.longitude,
79
- source: object.source,
80
- time_zone: object.time_zone,
81
- bookmarks_count: object.bookmarks_count,
82
- notes_count: object.notes_count,
83
- finished_at: object.finished_at,
84
- created_at: object.created_at,
85
- updated_at: object.updated_at }
86
- end
87
-
88
- def self.relations(object, _)
89
- { scouts: has_one(object.scout, ScoutView),
90
- responses: has_many(object.responses, ResponseView),
91
- tags: has_many(object.tags, TagView) }
92
- end
93
- end