eipiai 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/Rakefile +7 -13
  4. data/TODO.md +13 -0
  5. data/eipiai.gemspec +2 -1
  6. data/features/resources/api.feature +1 -0
  7. data/features/resources/collection.feature +1 -0
  8. data/features/resources/health.feature +17 -0
  9. data/features/resources/singular.feature +1 -0
  10. data/features/step_definitions/webmachine_steps.rb +1 -1
  11. data/lib/eipiai.rb +3 -3
  12. data/lib/eipiai/representers.rb +7 -0
  13. data/lib/eipiai/{roar/representers → representers}/api.rb +1 -1
  14. data/lib/eipiai/{roar/representers → representers}/base.rb +0 -0
  15. data/lib/eipiai/{roar/ext → representers/ext/roar}/hal.rb +0 -0
  16. data/lib/eipiai/resources.rb +14 -0
  17. data/lib/eipiai/{webmachine/resources → resources}/api.rb +16 -2
  18. data/lib/eipiai/{webmachine/resources → resources}/base.rb +30 -2
  19. data/lib/eipiai/{webmachine/resources → resources}/collection.rb +1 -1
  20. data/lib/eipiai/{webmachine/resources → resources}/concerns/objectifiable.rb +0 -0
  21. data/lib/eipiai/{webmachine/resources → resources}/concerns/representable.rb +0 -0
  22. data/lib/eipiai/{webmachine/ext → resources/ext/webmachine}/decision.rb +0 -0
  23. data/lib/eipiai/{webmachine/ext → resources/ext/webmachine}/request.rb +0 -0
  24. data/lib/eipiai/{webmachine/resources → resources}/health.rb +5 -1
  25. data/lib/eipiai/{webmachine/resources → resources}/singular.rb +1 -1
  26. data/lib/eipiai/validators.rb +5 -0
  27. data/lib/eipiai/{validation/validators → validators}/base.rb +0 -0
  28. data/lib/eipiai/{validation → validators}/concerns/formatted_errors.rb +0 -0
  29. data/lib/eipiai/{validation/validators → validators}/sequel.rb +1 -1
  30. data/lib/eipiai/version.rb +1 -1
  31. data/script/test +3 -1
  32. metadata +38 -23
  33. data/lib/eipiai/roar.rb +0 -7
  34. data/lib/eipiai/validation.rb +0 -5
  35. data/lib/eipiai/webmachine.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6ea1d2843bc6b4a1b1ed2e268f3a287cdb6c591d
4
- data.tar.gz: 72f7c6c496142c5dc5caed1faf5a5c83b1bb810f
3
+ metadata.gz: 3caaef63d30433d05c9c5dff0b84ca61f641f1b8
4
+ data.tar.gz: 274f803c8f29821db1379cfeb87b3ad78642d828
5
5
  SHA512:
6
- metadata.gz: 88c91bbeb2dc81e6337069fd9053c8c5c262a0a43fd7b70a865c544dedb67061c58648ab2ec14cb93982e6bb1d1fa23df259ce2f5fe97c033fc19fbc04560747
7
- data.tar.gz: 5a109aac02025614a11feb80a853f12ad980f6c0537e8fef5b77ea3acae12555b09df0d2fc455ab86d70d49298bd147151f4d3bdda479860ab1aa0b0f00c3c8b
6
+ metadata.gz: cb59e4936e0cfeb9c76e6e86aba56122866a729641c780e08dc5dc6599937fc3dafc24ff02a3071fdbdd869e84330217915b412535b1fa84288c49f2c18f6a67
7
+ data.tar.gz: 4e0b204b1adc63678bbd9c2a854f25d3a6f6bcf0c39936486ca722e2e6e8d2da20554a46d3a59fb63b9ed2e026811cfc8ebd2648911a73c89a5012e04ff5952e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## [unreleased](https://github.com/blendle/eipiai/tree/unreleased) (2016-05-04)
4
+ [Full Changelog](https://github.com/blendle/eipiai/compare/v0.7.0...unreleased)
5
+
6
+ **Closed issues:**
7
+
8
+ - make HealthCheck a singleton [\#19](https://github.com/blendle/eipiai/issues/19)
9
+
10
+ ## [v0.7.0](https://github.com/blendle/eipiai/tree/v0.7.0) (2016-05-03)
11
+ [Full Changelog](https://github.com/blendle/eipiai/compare/v0.6.0...v0.7.0)
12
+
13
+ **Closed issues:**
14
+
15
+ - api.json should be opt-in, not out-out [\#13](https://github.com/blendle/eipiai/issues/13)
16
+ - Rewrite auto API generator to use some kind of template [\#11](https://github.com/blendle/eipiai/issues/11)
17
+ - Rename `handle\_post\_response` [\#5](https://github.com/blendle/eipiai/issues/5)
18
+
19
+ **Merged pull requests:**
20
+
21
+ - add new testing setup [\#23](https://github.com/blendle/eipiai/pull/23) ([JeanMertz](https://github.com/JeanMertz))
22
+ - correctly handle PUT and POST on existing resources [\#22](https://github.com/blendle/eipiai/pull/22) ([JeanMertz](https://github.com/JeanMertz))
23
+ - Tweaks and fixes v2 [\#21](https://github.com/blendle/eipiai/pull/21) ([JeanMertz](https://github.com/JeanMertz))
24
+ - add `service\_available?` check by default [\#18](https://github.com/blendle/eipiai/pull/18) ([JeanMertz](https://github.com/JeanMertz))
25
+ - add Eipiai::Resource::Representable module for resources [\#17](https://github.com/blendle/eipiai/pull/17) ([JeanMertz](https://github.com/JeanMertz))
26
+ - minor tweaks and fixes [\#16](https://github.com/blendle/eipiai/pull/16) ([JeanMertz](https://github.com/JeanMertz))
27
+ - Update Rubocop auto-correct issues [\#15](https://github.com/blendle/eipiai/pull/15) ([JeanMertz](https://github.com/JeanMertz))
28
+ - Introduce options to better define resource link relations [\#14](https://github.com/blendle/eipiai/pull/14) ([JeanMertz](https://github.com/JeanMertz))
29
+
3
30
  ## [v0.6.0](https://github.com/blendle/eipiai/tree/v0.6.0) (2015-12-18)
4
31
  [Full Changelog](https://github.com/blendle/eipiai/compare/v0.5.1...v0.6.0)
5
32
 
data/Rakefile CHANGED
@@ -3,24 +3,18 @@ require 'bundler/gem_tasks'
3
3
  require 'cucumber/rake/task'
4
4
  require 'rubocop/rake_task'
5
5
  require 'yard-doctest'
6
+ require 'github_changelog_generator/task'
6
7
 
7
8
  task default: %w(rubocop features yard:doctest)
8
9
 
9
10
  RuboCop::RakeTask.new
10
11
 
11
- desc 'Update CHANGELOG.md'
12
- task 'changelog' do
13
- args = %w(
14
- --user=blendle
15
- --project=eipiai
16
- --header-label="# CHANGELOG"
17
- --bug-labels=type/bug,bug
18
- --enhancement-labels=type/enhancement,enhancement
19
- --future-release=unreleased
20
- --no-verbose
21
- )
22
-
23
- sh %(github_changelog_generator #{args.join(' ')})
12
+ GitHubChangelogGenerator::RakeTask.new :changelog do |c|
13
+ c.user = 'blendle'
14
+ c.project = 'eipiai'
15
+ c.header = '# CHANGELOG'
16
+ c.future_release = 'unreleased'
17
+ c.release_branch = 'master'
24
18
  end
25
19
 
26
20
  YARD::Doctest::RakeTask.new do |task|
data/TODO.md ADDED
@@ -0,0 +1,13 @@
1
+ # TODO
2
+
3
+ Some notes and snippets on things we might want to do in the future:
4
+
5
+ * [IRBWebmachine](https://github.com/generalassembly/irwebmachine)
6
+
7
+ Could potentially improve debugging. Hasn't been updated in a while, it looks
8
+ like some issues where created about it not working anymore. Duplicate some of
9
+ the basic functionality?
10
+
11
+ * [http://dry-rb.org](http://dry-rb.org)
12
+
13
+ Some useful gems. Validation? Types?
data/eipiai.gemspec CHANGED
@@ -23,9 +23,10 @@ Gem::Specification.new do |spec|
23
23
  spec.add_runtime_dependency 'webmachine'
24
24
 
25
25
  spec.add_development_dependency 'bundler'
26
- spec.add_development_dependency 'cucumber'
27
26
  spec.add_development_dependency 'cucumber-blendle-steps'
27
+ spec.add_development_dependency 'cucumber'
28
28
  spec.add_development_dependency 'database_cleaner'
29
+ spec.add_development_dependency 'github_changelog_generator'
29
30
  spec.add_development_dependency 'pry'
30
31
  spec.add_development_dependency 'rack-test'
31
32
  spec.add_development_dependency 'rack'
@@ -52,6 +52,7 @@ Feature: Request entrypoint of API
52
52
 
53
53
  When the client does a GET request to "/api"
54
54
  Then the status code should be "200" (OK)
55
+ And the response contains the "Etag" header with value ""6566f445b1a56bc846ef9b95d5d79656""
55
56
  And the response should be HAL/JSON:
56
57
  """json
57
58
  {
@@ -18,6 +18,7 @@ Feature: Request a collection of resources
18
18
  When the client provides the header "Accept: application/json"
19
19
  And the client does a GET request to the "items" resource
20
20
  Then the status code should be "200" (OK)
21
+ And the response contains the "Cache-Control" header with value "no-cache, no-store, must-revalidate, private"
21
22
  And the response should be JSON:
22
23
  """json
23
24
  {
@@ -25,3 +25,20 @@ Feature: Request entrypoint of API
25
25
  "healthy": false
26
26
  }
27
27
  """
28
+
29
+ Scenario: Return 503 on resources for an unhealthy service
30
+ Given the configuration "healthy" is set to "false"
31
+ And the following top-level resource at "/items":
32
+ """ruby
33
+ class ItemsResource < Webmachine::Resource
34
+ include Eipiai::Resource
35
+
36
+ def object
37
+ {}
38
+ end
39
+ end
40
+ """
41
+ When the client does a GET request to the "items" resource
42
+ Then the status code should be "503" (Service Unavailable)
43
+ And the response contains the "Retry-After" header with value "60"
44
+ And the response contains the "Cache-Control" header with value "no-cache, no-store, must-revalidate, private"
@@ -19,6 +19,7 @@ Feature: Working with singular resources (GET, POST, PUT, DELETE)
19
19
  When the client provides the header "Accept: application/json"
20
20
  And the client does a GET request to the "item" resource with the template variable "item_uid" set to "hello"
21
21
  Then the status code should be "200" (OK)
22
+ And the response contains the "Cache-Control" header with value "no-cache, no-store, must-revalidate, private"
22
23
  And the response should be JSON:
23
24
  """json
24
25
  {
@@ -54,5 +54,5 @@ After do
54
54
  # Remove links from ApiRepresenter
55
55
  #
56
56
  Eipiai.class_exec { remove_const(:ApiRepresenter) }
57
- load 'eipiai/roar/representers/api.rb'
57
+ load 'eipiai/representers/api.rb'
58
58
  end
data/lib/eipiai.rb CHANGED
@@ -2,6 +2,6 @@
2
2
  require 'eipiai/configuration'
3
3
 
4
4
  require 'eipiai/models'
5
- require 'eipiai/roar'
6
- require 'eipiai/validation'
7
- require 'eipiai/webmachine'
5
+ require 'eipiai/representers'
6
+ require 'eipiai/resources'
7
+ require 'eipiai/validators'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ require 'roar'
3
+
4
+ require 'eipiai/representers/ext/roar/hal'
5
+
6
+ require 'eipiai/representers/api'
7
+ require 'eipiai/representers/base'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/roar/representers/base'
2
+ require 'eipiai/representers/base'
3
3
 
4
4
  module Eipiai
5
5
  # ApiRepresenter
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require 'webmachine'
3
+
4
+ require 'eipiai/resources/concerns/objectifiable'
5
+ require 'eipiai/resources/concerns/representable'
6
+
7
+ require 'eipiai/resources/ext/webmachine/decision'
8
+ require 'eipiai/resources/ext/webmachine/request'
9
+
10
+ require 'eipiai/resources/api'
11
+ require 'eipiai/resources/base'
12
+ require 'eipiai/resources/collection'
13
+ require 'eipiai/resources/health'
14
+ require 'eipiai/resources/singular'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/webmachine/resources/base'
2
+ require 'eipiai/resources/base'
3
3
 
4
+ require 'active_support/core_ext/module/attribute_accessors'
4
5
  require 'active_support/core_ext/string/inflections'
5
6
  require 'json'
6
7
 
@@ -22,15 +23,28 @@ module Eipiai
22
23
  class ApiResource < Webmachine::Resource
23
24
  include Resource
24
25
 
26
+ # `etag` is set once, and then re-used throughout the lifecycle of the
27
+ # application. Only a restart of the web server will reset its value.
28
+ #
29
+ mattr_accessor :etag
30
+
25
31
  def top_level_relation?
26
32
  true
27
33
  end
28
34
 
35
+ def service_available?
36
+ true
37
+ end
38
+
39
+ def generate_etag
40
+ self.class.etag ||= Digest::MD5.hexdigest(to_json)
41
+ end
42
+
29
43
  def allowed_methods
30
44
  %w(GET)
31
45
  end
32
46
 
33
- def cache_header
47
+ def cache_control_header_value
34
48
  'public, max-age=600, s-maxage=86400'
35
49
  end
36
50
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/webmachine/resources/singular'
3
- require 'eipiai/webmachine/resources/collection'
2
+ require 'eipiai/resources/singular'
3
+ require 'eipiai/resources/collection'
4
4
 
5
5
  require 'active_support/core_ext/string/inflections'
6
6
  require 'json'
@@ -75,9 +75,23 @@ module Eipiai
75
75
  []
76
76
  end
77
77
 
78
+ # service_available?
79
+ #
80
+ # If the service is unavailable, this method should return false. By
81
+ # default, this method calls the `HealthCheck#healthy?` method, which in
82
+ # turn returns `true` or `false`, depending on the state of the service and
83
+ # its dependencies.
84
+ #
85
+ # When the service is unavailable, the `Cache-Control` header is set to not
86
+ # allow any caching by proxies/clients, and sets the `Retry-After` header to
87
+ # tell the client to retry again in 60 seconds.
88
+ #
89
+ # @return [true, false]
90
+ #
78
91
  def service_available?
79
92
  return true if Eipiai::HealthCheck.new.healthy?
80
93
 
94
+ response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate, private'
81
95
  response.headers['Retry-After'] = '60'
82
96
  false
83
97
  end
@@ -138,6 +152,10 @@ module Eipiai
138
152
  true
139
153
  end
140
154
 
155
+ def finish_request
156
+ response.headers['Cache-Control'] = cache_control_header_value
157
+ end
158
+
141
159
  # params
142
160
  #
143
161
  # Given a string in JSON format, returns the hash representation of that
@@ -225,6 +243,16 @@ module Eipiai
225
243
 
226
244
  private
227
245
 
246
+ # cache_control_header_value
247
+ #
248
+ # The default Cache-Control header value served by all resources.
249
+ #
250
+ # @return String default Cache-Control header value
251
+ #
252
+ def cache_control_header_value
253
+ 'no-cache, no-store, must-revalidate, private'
254
+ end
255
+
228
256
  def json_error_body(errors)
229
257
  response.headers['Content-Type'] = 'application/json'
230
258
  response.body = FormattedErrors.parse(errors).to_json
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/webmachine/resources/base'
2
+ require 'eipiai/resources/base'
3
3
 
4
4
  module Eipiai
5
5
  # CollectionResource
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/webmachine/resources/base'
2
+ require 'eipiai/resources/base'
3
3
 
4
4
  require 'active_support/core_ext/string/inflections'
5
5
  require 'json'
@@ -63,6 +63,10 @@ module Eipiai
63
63
  false
64
64
  end
65
65
 
66
+ def finish_request
67
+ response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate, private'
68
+ end
69
+
66
70
  def object
67
71
  HealthCheck.new
68
72
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/webmachine/resources/base'
2
+ require 'eipiai/resources/base'
3
3
 
4
4
  require 'active_support/core_ext/object/blank'
5
5
  require 'active_support/core_ext/string/inflections'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ require 'eipiai/validators/concerns/formatted_errors'
3
+
4
+ require 'eipiai/validators/base'
5
+ require 'eipiai/validators/sequel'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'eipiai/validation/validators/base'
2
+ require 'eipiai/validators/base'
3
3
 
4
4
  module Eipiai
5
5
  # SequelValidator
@@ -4,5 +4,5 @@
4
4
  # The current version of the Eipiai library.
5
5
  #
6
6
  module Eipiai
7
- VERSION = '0.7.0'
7
+ VERSION = '0.8.0'
8
8
  end
data/script/test CHANGED
@@ -1,3 +1,5 @@
1
1
  #!/bin/sh
2
2
 
3
- bundle exec rake
3
+ bundle exec cucumber --strict --no-source --order random --tags ~@wip "$@"
4
+ yard doctest --pride
5
+ bundle exec rubocop -DSE
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eipiai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Mertz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-03 00:00:00.000000000 Z
11
+ date: 2016-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: cucumber
84
+ name: cucumber-blendle-steps
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: cucumber-blendle-steps
98
+ name: cucumber
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: github_changelog_generator
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: pry
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -236,6 +250,7 @@ files:
236
250
  - Gemfile
237
251
  - README.md
238
252
  - Rakefile
253
+ - TODO.md
239
254
  - eipiai.gemspec
240
255
  - features/resources/api.feature
241
256
  - features/resources/collection.feature
@@ -258,25 +273,25 @@ files:
258
273
  - lib/eipiai/models.rb
259
274
  - lib/eipiai/models/collection.rb
260
275
  - lib/eipiai/models/representable.rb
261
- - lib/eipiai/roar.rb
262
- - lib/eipiai/roar/ext/hal.rb
263
- - lib/eipiai/roar/representers/api.rb
264
- - lib/eipiai/roar/representers/base.rb
265
- - lib/eipiai/validation.rb
266
- - lib/eipiai/validation/concerns/formatted_errors.rb
267
- - lib/eipiai/validation/validators/base.rb
268
- - lib/eipiai/validation/validators/sequel.rb
276
+ - lib/eipiai/representers.rb
277
+ - lib/eipiai/representers/api.rb
278
+ - lib/eipiai/representers/base.rb
279
+ - lib/eipiai/representers/ext/roar/hal.rb
280
+ - lib/eipiai/resources.rb
281
+ - lib/eipiai/resources/api.rb
282
+ - lib/eipiai/resources/base.rb
283
+ - lib/eipiai/resources/collection.rb
284
+ - lib/eipiai/resources/concerns/objectifiable.rb
285
+ - lib/eipiai/resources/concerns/representable.rb
286
+ - lib/eipiai/resources/ext/webmachine/decision.rb
287
+ - lib/eipiai/resources/ext/webmachine/request.rb
288
+ - lib/eipiai/resources/health.rb
289
+ - lib/eipiai/resources/singular.rb
290
+ - lib/eipiai/validators.rb
291
+ - lib/eipiai/validators/base.rb
292
+ - lib/eipiai/validators/concerns/formatted_errors.rb
293
+ - lib/eipiai/validators/sequel.rb
269
294
  - lib/eipiai/version.rb
270
- - lib/eipiai/webmachine.rb
271
- - lib/eipiai/webmachine/ext/decision.rb
272
- - lib/eipiai/webmachine/ext/request.rb
273
- - lib/eipiai/webmachine/resources/api.rb
274
- - lib/eipiai/webmachine/resources/base.rb
275
- - lib/eipiai/webmachine/resources/collection.rb
276
- - lib/eipiai/webmachine/resources/concerns/objectifiable.rb
277
- - lib/eipiai/webmachine/resources/concerns/representable.rb
278
- - lib/eipiai/webmachine/resources/health.rb
279
- - lib/eipiai/webmachine/resources/singular.rb
280
295
  - script/bootstrap
281
296
  - script/documentation
282
297
  - script/test
@@ -299,7 +314,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
299
314
  version: '0'
300
315
  requirements: []
301
316
  rubyforge_project:
302
- rubygems_version: 2.5.1
317
+ rubygems_version: 2.6.4
303
318
  signing_key:
304
319
  specification_version: 4
305
320
  summary: Opinionated JSON-API stack to get the job done.
data/lib/eipiai/roar.rb DELETED
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'roar'
3
-
4
- require 'eipiai/roar/ext/hal'
5
-
6
- require 'eipiai/roar/representers/api'
7
- require 'eipiai/roar/representers/base'
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'eipiai/validation/concerns/formatted_errors'
3
-
4
- require 'eipiai/validation/validators/base'
5
- require 'eipiai/validation/validators/sequel'
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'webmachine'
3
-
4
- require 'eipiai/webmachine/ext/decision'
5
- require 'eipiai/webmachine/ext/request'
6
-
7
- require 'eipiai/webmachine/resources/concerns/objectifiable'
8
- require 'eipiai/webmachine/resources/concerns/representable'
9
-
10
- require 'eipiai/webmachine/resources/api'
11
- require 'eipiai/webmachine/resources/base'
12
- require 'eipiai/webmachine/resources/collection'
13
- require 'eipiai/webmachine/resources/health'
14
- require 'eipiai/webmachine/resources/singular'