eipiai 0.6.0 → 0.7.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -4
  3. data/.rubocop.yml +3 -0
  4. data/.ruby-version +1 -0
  5. data/.wercker.yml +8 -1
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +1 -0
  8. data/Rakefile +1 -0
  9. data/eipiai.gemspec +1 -0
  10. data/features/resources/api.feature +82 -0
  11. data/features/resources/collection.feature +60 -0
  12. data/features/resources/collection/get.feature +189 -0
  13. data/features/resources/collection/post.feature +230 -0
  14. data/features/resources/health.feature +27 -0
  15. data/features/resources/singular.feature +86 -0
  16. data/features/resources/singular/delete.feature +69 -0
  17. data/features/resources/singular/get.feature +146 -0
  18. data/features/resources/singular/post.feature +235 -0
  19. data/features/resources/singular/put.feature +164 -0
  20. data/features/step_definitions/steps.rb +10 -0
  21. data/features/step_definitions/webmachine_steps.rb +58 -0
  22. data/features/support/app.rb +14 -26
  23. data/features/support/env.rb +1 -0
  24. data/features/validation.feature +1 -0
  25. data/features/webmachine.feature +1 -56
  26. data/lib/eipiai.rb +1 -0
  27. data/lib/eipiai/configuration.rb +1 -0
  28. data/lib/eipiai/models.rb +1 -0
  29. data/lib/eipiai/models/collection.rb +1 -0
  30. data/lib/eipiai/models/representable.rb +6 -5
  31. data/lib/eipiai/roar.rb +1 -0
  32. data/lib/eipiai/roar/ext/hal.rb +3 -0
  33. data/lib/eipiai/roar/representers/api.rb +17 -6
  34. data/lib/eipiai/roar/representers/base.rb +1 -0
  35. data/lib/eipiai/validation.rb +1 -0
  36. data/lib/eipiai/validation/concerns/formatted_errors.rb +1 -0
  37. data/lib/eipiai/validation/validators/base.rb +2 -1
  38. data/lib/eipiai/validation/validators/sequel.rb +1 -0
  39. data/lib/eipiai/version.rb +2 -1
  40. data/lib/eipiai/webmachine.rb +2 -0
  41. data/lib/eipiai/webmachine/ext/decision.rb +1 -0
  42. data/lib/eipiai/webmachine/ext/request.rb +2 -1
  43. data/lib/eipiai/webmachine/resources/api.rb +7 -3
  44. data/lib/eipiai/webmachine/resources/base.rb +96 -19
  45. data/lib/eipiai/webmachine/resources/collection.rb +4 -18
  46. data/lib/eipiai/webmachine/resources/concerns/objectifiable.rb +1 -0
  47. data/lib/eipiai/webmachine/resources/concerns/representable.rb +69 -0
  48. data/lib/eipiai/webmachine/resources/health.rb +16 -10
  49. data/lib/eipiai/webmachine/resources/singular.rb +45 -10
  50. metadata +16 -4
  51. data/features/support/db.rb +0 -8
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'eipiai/webmachine/resources/base'
2
3
 
3
4
  require 'active_support/core_ext/string/inflections'
@@ -6,7 +7,8 @@ require 'json'
6
7
  module Eipiai
7
8
  # HealthCheck
8
9
  #
9
- # Class with a single method `healthy?`. Returns `true` by default.
10
+ # Class with a `#healthy?` method. If this method returns `true`, the service
11
+ # is expected to be available and ready to serve requests.
10
12
  #
11
13
  class HealthCheck
12
14
  # healthy?
@@ -19,26 +21,30 @@ module Eipiai
19
21
  Eipiai.configuration.healthy == true
20
22
  end
21
23
 
22
- # to_hash
24
+ # to_h
23
25
  #
24
26
  # Hash representation of the health status.
25
27
  #
26
28
  # @return [Hash] hash representation of health status
27
29
  #
28
- def to_hash
30
+ def to_h
29
31
  { 'healthy' => healthy? }
30
32
  end
31
33
  end
32
34
 
33
- # ApiResource
35
+ # HealthResource
34
36
  #
35
- # The base resource which can be included in regular Webmachine::Resource
36
- # objects. It provides sensible defaults for a full-features REST API
37
- # endpoint.
37
+ # Provides basic health checking of the API. This resource can be configured
38
+ # to validate a working service, and return the correct availability to the
39
+ # client.
38
40
  #
39
41
  class HealthResource < Webmachine::Resource
40
42
  include Resource
41
43
 
44
+ def top_level_relation?
45
+ true
46
+ end
47
+
42
48
  def allowed_methods
43
49
  %w(GET)
44
50
  end
@@ -51,7 +57,7 @@ module Eipiai
51
57
  return true if healthy?
52
58
 
53
59
  response.headers['Content-Type'] = 'application/json'
54
- response.headers['Retry-After'] = '60'
60
+ response.headers['Retry-After'] = '60'
55
61
 
56
62
  response.body = to_json
57
63
  false
@@ -65,8 +71,8 @@ module Eipiai
65
71
 
66
72
  # healthy?
67
73
  #
68
- # Returns true if `HealthCheck.new.healthy?` returns `true`, otherwise
69
- # returns `false`.
74
+ # Returns true if `HealthCheck#healthy?` returns `true`, otherwise returns
75
+ # `false`.
70
76
  #
71
77
  # @return [true, false] health status of service
72
78
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'eipiai/webmachine/resources/base'
2
3
 
3
4
  require 'active_support/core_ext/object/blank'
@@ -16,32 +17,30 @@ module Eipiai
16
17
  #
17
18
  module SingularResource
18
19
  def allowed_methods
19
- %w(GET PUT DELETE)
20
+ %w(GET POST PUT DELETE)
20
21
  end
21
22
 
22
23
  def resource_exists?
23
24
  object.present?
24
25
  end
25
26
 
27
+ def create_path
28
+ request.uri.path
29
+ end
30
+
26
31
  def delete_resource
27
32
  object.destroy
33
+ @object = nil
34
+
28
35
  true
29
36
  end
30
37
 
31
38
  def from_json
32
- delete_resource if (exists = object.present?)
33
- new_object.save
34
-
35
- response.headers['Location'] = request.uri.to_s
36
- exists ? 204 : 201
39
+ request.put? ? put_from_json : post_from_json
37
40
  end
38
41
 
39
42
  private
40
43
 
41
- def params
42
- @merged_params ||= super.merge('uid' => object_uid)
43
- end
44
-
45
44
  def object
46
45
  @object ||= object_class.first(uid: object_uid) if object_class
47
46
  end
@@ -49,5 +48,41 @@ module Eipiai
49
48
  def object_uid
50
49
  request.path_info[:"#{object_class_name.downcase}_uid"]
51
50
  end
51
+
52
+ alias uid object_uid
53
+
54
+ # put_from_json
55
+ #
56
+ # When `from_json` is called, and the request is using the `PUT` method,
57
+ # this method is called.
58
+ #
59
+ # Deletes the existing record, if it exists, and saves the newly created
60
+ # record. Triggers `handle_post_or_put_with_optional_content`, with
61
+ # `created` set to `true` unless the new record replaced an old one.
62
+ #
63
+ # @return [Integer] either 200, 201 or 204. See `#handle_post_or_put_with_optional_content`
64
+ #
65
+ def put_from_json
66
+ delete_resource if (exists = object.present?)
67
+ new_object.save
68
+
69
+ handle_post_or_put_with_optional_content(created: exists.blank?)
70
+ end
71
+
72
+ # post_from_json
73
+ #
74
+ # When `from_json` is called, and the request is using the `POST` method,
75
+ # this method is called.
76
+ #
77
+ # calls #save on the existing object, and triggers
78
+ # `handle_post_or_put_with_optional_content`, with `created` set to `false`.
79
+ #
80
+ # @return [Integer] either 200, 201 or 204. See `#handle_post_or_put_with_optional_content`
81
+ #
82
+ def post_from_json
83
+ object.save
84
+
85
+ handle_post_or_put_with_optional_content(created: false)
86
+ end
52
87
  end
53
88
  end
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.6.0
4
+ version: 0.7.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: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2016-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -230,15 +230,26 @@ files:
230
230
  - ".gitignore"
231
231
  - ".hubbit.yml"
232
232
  - ".rubocop.yml"
233
+ - ".ruby-version"
233
234
  - ".wercker.yml"
234
235
  - CHANGELOG.md
235
236
  - Gemfile
236
237
  - README.md
237
238
  - Rakefile
238
239
  - eipiai.gemspec
240
+ - features/resources/api.feature
241
+ - features/resources/collection.feature
242
+ - features/resources/collection/get.feature
243
+ - features/resources/collection/post.feature
244
+ - features/resources/health.feature
245
+ - features/resources/singular.feature
246
+ - features/resources/singular/delete.feature
247
+ - features/resources/singular/get.feature
248
+ - features/resources/singular/post.feature
249
+ - features/resources/singular/put.feature
239
250
  - features/step_definitions/steps.rb
251
+ - features/step_definitions/webmachine_steps.rb
240
252
  - features/support/app.rb
241
- - features/support/db.rb
242
253
  - features/support/env.rb
243
254
  - features/validation.feature
244
255
  - features/webmachine.feature
@@ -263,6 +274,7 @@ files:
263
274
  - lib/eipiai/webmachine/resources/base.rb
264
275
  - lib/eipiai/webmachine/resources/collection.rb
265
276
  - lib/eipiai/webmachine/resources/concerns/objectifiable.rb
277
+ - lib/eipiai/webmachine/resources/concerns/representable.rb
266
278
  - lib/eipiai/webmachine/resources/health.rb
267
279
  - lib/eipiai/webmachine/resources/singular.rb
268
280
  - script/bootstrap
@@ -287,7 +299,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
287
299
  version: '0'
288
300
  requirements: []
289
301
  rubyforge_project:
290
- rubygems_version: 2.4.5.1
302
+ rubygems_version: 2.5.1
291
303
  signing_key:
292
304
  specification_version: 4
293
305
  summary: Opinionated JSON-API stack to get the job done.
@@ -1,8 +0,0 @@
1
- require 'database_cleaner'
2
- require 'database_cleaner/cucumber'
3
-
4
- DatabaseCleaner.clean_with(:truncation)
5
- DatabaseCleaner.strategy = :transaction
6
-
7
- Before { DatabaseCleaner.start }
8
- After { DatabaseCleaner.clean }