grape-app 0.8.4 → 0.8.5

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
  SHA256:
3
- metadata.gz: 06c509d2bc4e8421335786540ce1ce6bd49bbca8a9eb81d5bbf055470673e18b
4
- data.tar.gz: 57d532273f4f2d23e1df5b49333f8b2b3e960e4cb5b05d30ac2ac23b8a236463
3
+ metadata.gz: 0c4a05ef1c03ec244f8f99896b795bde1b89ce280af80c46558fb9dc09a26b40
4
+ data.tar.gz: 3bfca4ffb992d3c0b9407215ae3cf08c538be22c6337d86125dcc1d2cf65bec4
5
5
  SHA512:
6
- metadata.gz: 9fb0973200c7ce7cc03c80549821ed029cc5b122db181cb8599f348fa47b436f6816ddd019619804de57491c58151a81b0bcfb76769b048522ca2dae327ae76d
7
- data.tar.gz: 2c0fe0493ce4c06971be0033d3199a19dce3645bccdec36bb1fac8b05076955ce955aac63d0eab6a3efbde918a391fbcda32facaa5c0e97290caeae62f9313e2
6
+ metadata.gz: ee63d58b3fcea0b099e749a82bf945753f50077c41ddefb833ea2c40b5aaedd6243b52296846b85117836f2c985e4eaa33aa402fe5ffe99e862106c1f99c25ba
7
+ data.tar.gz: 3e8a010d81aaf298110440a18da811d3829ebe6a6a915db16b05c0d96fabe7b53cbc79b3be227943f39b58185e3a81983d153087071f3170c16b41277969357b
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grape-app (0.8.4)
4
+ grape-app (0.8.5)
5
5
  activesupport
6
6
  grape (>= 1.2)
7
7
  grape-entity
@@ -13,12 +13,12 @@ PATH
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- activemodel (6.0.1)
17
- activesupport (= 6.0.1)
18
- activerecord (6.0.1)
19
- activemodel (= 6.0.1)
20
- activesupport (= 6.0.1)
21
- activesupport (6.0.1)
16
+ activemodel (6.0.2.1)
17
+ activesupport (= 6.0.2.1)
18
+ activerecord (6.0.2.1)
19
+ activemodel (= 6.0.2.1)
20
+ activesupport (= 6.0.2.1)
21
+ activesupport (6.0.2.1)
22
22
  concurrent-ruby (~> 1.0, >= 1.0.2)
23
23
  i18n (>= 0.7, < 2)
24
24
  minitest (~> 5.1)
@@ -32,70 +32,96 @@ GEM
32
32
  builder (3.2.4)
33
33
  coercible (1.0.0)
34
34
  descendants_tracker (~> 0.0.1)
35
- concurrent-ruby (1.1.5)
35
+ concurrent-ruby (1.1.6)
36
36
  descendants_tracker (0.0.4)
37
37
  thread_safe (~> 0.3, >= 0.3.1)
38
38
  diff-lcs (1.3)
39
+ dry-configurable (0.11.3)
40
+ concurrent-ruby (~> 1.0)
41
+ dry-core (~> 0.4, >= 0.4.7)
42
+ dry-equalizer (~> 0.2)
43
+ dry-container (0.7.2)
44
+ concurrent-ruby (~> 1.0)
45
+ dry-configurable (~> 0.1, >= 0.1.3)
46
+ dry-core (0.4.9)
47
+ concurrent-ruby (~> 1.0)
48
+ dry-equalizer (0.3.0)
49
+ dry-inflector (0.2.0)
50
+ dry-logic (1.0.6)
51
+ concurrent-ruby (~> 1.0)
52
+ dry-core (~> 0.2)
53
+ dry-equalizer (~> 0.2)
54
+ dry-types (1.3.1)
55
+ concurrent-ruby (~> 1.0)
56
+ dry-container (~> 0.3)
57
+ dry-core (~> 0.4, >= 0.4.4)
58
+ dry-equalizer (~> 0.3)
59
+ dry-inflector (~> 0.1, >= 0.1.2)
60
+ dry-logic (~> 1.0, >= 1.0.2)
39
61
  equalizer (0.0.11)
40
- grape (1.2.5)
62
+ grape (1.3.0)
41
63
  activesupport
42
64
  builder
65
+ dry-types (>= 1.1)
43
66
  mustermann-grape (~> 1.0.0)
44
67
  rack (>= 1.3.0)
45
68
  rack-accept
46
- virtus (>= 1.0.0)
47
- grape-entity (0.7.1)
48
- activesupport (>= 4.0)
69
+ grape-entity (0.8.0)
70
+ activesupport (>= 3.0.0)
49
71
  multi_json (>= 1.3.2)
50
- i18n (1.7.0)
72
+ i18n (1.8.2)
51
73
  concurrent-ruby (~> 1.0)
52
74
  ice_nine (0.11.2)
53
75
  jaro_winkler (1.5.4)
54
- minitest (5.13.0)
76
+ minitest (5.14.0)
55
77
  multi_json (1.14.1)
56
- mustermann (1.0.3)
57
- mustermann-grape (1.0.0)
58
- mustermann (~> 1.0.0)
78
+ mustermann (1.1.1)
79
+ ruby2_keywords (~> 0.0.1)
80
+ mustermann-grape (1.0.1)
81
+ mustermann (>= 1.0.0)
59
82
  parallel (1.19.1)
60
- parser (2.6.5.0)
83
+ parser (2.7.0.4)
61
84
  ast (~> 2.4.0)
62
- rack (2.0.7)
85
+ rack (2.2.2)
63
86
  rack-accept (0.4.5)
64
87
  rack (>= 0.4)
65
- rack-cors (1.1.0)
88
+ rack-cors (1.1.1)
66
89
  rack (>= 2.0.0)
67
90
  rack-ssl-enforcer (0.2.9)
68
91
  rack-test (1.1.0)
69
92
  rack (>= 1.0, < 3)
70
93
  rainbow (3.0.0)
71
94
  rake (13.0.1)
95
+ rexml (3.2.4)
72
96
  rspec (3.9.0)
73
97
  rspec-core (~> 3.9.0)
74
98
  rspec-expectations (~> 3.9.0)
75
99
  rspec-mocks (~> 3.9.0)
76
- rspec-core (3.9.0)
77
- rspec-support (~> 3.9.0)
100
+ rspec-core (3.9.1)
101
+ rspec-support (~> 3.9.1)
78
102
  rspec-expectations (3.9.0)
79
103
  diff-lcs (>= 1.2.0, < 2.0)
80
104
  rspec-support (~> 3.9.0)
81
- rspec-mocks (3.9.0)
105
+ rspec-mocks (3.9.1)
82
106
  diff-lcs (>= 1.2.0, < 2.0)
83
107
  rspec-support (~> 3.9.0)
84
- rspec-support (3.9.0)
85
- rubocop (0.77.0)
108
+ rspec-support (3.9.2)
109
+ rubocop (0.80.1)
86
110
  jaro_winkler (~> 1.5.1)
87
111
  parallel (~> 1.10)
88
- parser (>= 2.6)
112
+ parser (>= 2.7.0.1)
89
113
  rainbow (>= 2.2.2, < 4.0)
114
+ rexml
90
115
  ruby-progressbar (~> 1.7)
91
116
  unicode-display_width (>= 1.4.0, < 1.7)
92
117
  ruby-progressbar (1.10.1)
93
- sqlite3 (1.4.1)
94
- thor (0.20.3)
118
+ ruby2_keywords (0.0.2)
119
+ sqlite3 (1.4.2)
120
+ thor (1.0.1)
95
121
  thread_safe (0.3.6)
96
- tzinfo (1.2.5)
122
+ tzinfo (1.2.6)
97
123
  thread_safe (~> 0.1)
98
- unicode-display_width (1.6.0)
124
+ unicode-display_width (1.6.1)
99
125
  virtus (1.0.5)
100
126
  axiom-types (~> 0.1)
101
127
  coercible (~> 1.0)
@@ -115,6 +141,7 @@ DEPENDENCIES
115
141
  rspec
116
142
  rubocop
117
143
  sqlite3
144
+ virtus
118
145
 
119
146
  BUNDLED WITH
120
- 2.0.2
147
+ 2.1.2
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'grape-app'
3
- s.version = '0.8.4'
3
+ s.version = '0.8.5'
4
4
  s.authors = ['Black Square Media Ltd']
5
5
  s.email = ['info@blacksquaremedia.com']
6
6
  s.summary = %(Standalone Grape API apps)
@@ -29,4 +29,5 @@ Gem::Specification.new do |s|
29
29
  s.add_development_dependency 'rspec'
30
30
  s.add_development_dependency 'rubocop'
31
31
  s.add_development_dependency 'sqlite3'
32
+ s.add_development_dependency 'virtus'
32
33
  end
@@ -10,9 +10,8 @@ require 'zeitwerk'
10
10
 
11
11
  class Grape::App < Grape::API
12
12
  class << self
13
-
14
13
  # Run initializers
15
- def init!(root=nil)
14
+ def init!(root = nil)
16
15
  @root = Pathname.new(root) if root
17
16
 
18
17
  # Require bundle
@@ -24,14 +24,13 @@ module Grape::App::CLI
24
24
  def init_lib
25
25
  empty_directory File.join(name, 'lib', name)
26
26
  end
27
-
28
27
  end
29
28
 
30
29
  class Runner < Thor
31
30
  register Builder, :new, 'new NAME', 'create a new application'
32
31
 
33
32
  desc 'console ENV', 'Launch console'
34
- def console(env='development')
33
+ def console(env = 'development')
35
34
  ENV['GRAPE_ENV'] = env
36
35
  require File.expand_path('config/environment', Dir.pwd)
37
36
 
@@ -1,5 +1,4 @@
1
1
  class Grape::App::Configuration < ActiveSupport::InheritableOptions
2
-
3
2
  def middleware(&block)
4
3
  self[:middleware] ||= []
5
4
  self[:middleware].push(block) if block
@@ -22,5 +21,4 @@ class Grape::App::Configuration < ActiveSupport::InheritableOptions
22
21
  end
23
22
  end
24
23
  end
25
-
26
24
  end
@@ -17,14 +17,13 @@ module Grape::App::Helpers::Caching
17
17
  # article
18
18
  # end
19
19
  #
20
- def fresh_when(object=nil, etag: nil, last_modified: nil, **cache_control)
20
+ def fresh_when(object = nil, etag: nil, last_modified: nil, last_modified_field: :updated_at, **cache_control)
21
21
  etag ||= object
22
- last_modified ||= object.try(:updated_at) || object.try(:maximum, :updated_at)
23
-
22
+ last_modified = object.try(last_modified_field) || object.try(:maximum, last_modified_field) if last_modified.nil?
24
23
  etag = ActiveSupport::Digest.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))
25
24
  header 'ETag', etag
26
25
  header 'Last-Modified', last_modified.httpdate if last_modified
27
- cache_control(cache_control) unless cache_control.empty?
26
+ cache_control(**cache_control) unless cache_control.empty?
28
27
 
29
28
  if_modified_since = headers['If-Modified-Since']
30
29
  if_modified_since = Time.rfc2822(if_modified_since) rescue nil if if_modified_since # rubocop:disable Style/RescueModifier
@@ -49,7 +48,7 @@ module Grape::App::Helpers::Caching
49
48
  # stats = article.really_expensive_call if stale?(article)
50
49
  # end
51
50
  #
52
- def stale?(object=nil, **freshness_opts)
51
+ def stale?(object = nil, **freshness_opts)
53
52
  fresh_when(object, **freshness_opts)
54
53
  true
55
54
  end
@@ -6,7 +6,7 @@ module Grape::App::Helpers::RespondWith
6
6
  end
7
7
 
8
8
  # @param [ActiveRecord::Base] record validated record
9
- def respond_with(record, opts={})
9
+ def respond_with(record, opts = {})
10
10
  unless record.errors.empty?
11
11
  opts[:with] = Errors
12
12
  status 400
@@ -11,7 +11,6 @@ ActiveRecord::Tasks::DatabaseTasks.tap do |config|
11
11
  end
12
12
 
13
13
  namespace :db do
14
-
15
14
  Rake::Task['load_config'].clear
16
15
 
17
16
  task load_config: :environment do
@@ -47,5 +46,4 @@ namespace :db do
47
46
  desc 'Prepare test DB'
48
47
  task :prepare
49
48
  end
50
-
51
49
  end
@@ -30,6 +30,14 @@ RSpec.describe Grape::App::Helpers::Caching do
30
30
  expect(last_response.status).to eq(200)
31
31
  end
32
32
 
33
+ it 'should handle fresh_when for records that were never updated' do
34
+ get '/articles/never_updated'
35
+ expect(last_response.status).to eq(200)
36
+ expect(last_response.headers).to include(
37
+ 'Last-Modified' => 'Fri, 05 Jan 2018 11:25:00 GMT',
38
+ )
39
+ end
40
+
33
41
  it 'should support cache-control' do
34
42
  get '/articles?public=true'
35
43
  expect(last_response.status).to eq(200)
@@ -51,6 +59,7 @@ RSpec.describe Grape::App::Helpers::Caching do
51
59
  'id' => 1,
52
60
  'title' => 'Welcome',
53
61
  'updated_at' => '2018-01-05 11:25:10 UTC',
62
+ 'created_at' => '2018-01-05 11:25:00 UTC',
54
63
  )
55
64
 
56
65
  get '/articles/1', {}, 'HTTP_IF_NONE_MATCH' => last_response.headers['ETag']
@@ -9,6 +9,7 @@ RSpec.describe Grape::App::Helpers::Params do
9
9
  post '/articles', title: 'Today', fresh: true, id: 1234, updated_at: Time.now
10
10
  expect(last_response.status).to eq(201)
11
11
  expect(JSON.parse(last_response.body)).to eq(
12
+ 'created_at' => nil,
12
13
  'id' => 9,
13
14
  'title' => 'Today',
14
15
  'updated_at' => '2018-01-05 11:25:15 UTC',
@@ -1,6 +1,7 @@
1
1
  ENV['RACK_ENV'] ||= 'test'
2
2
  require 'grape-app'
3
3
  require 'rack/test'
4
+ require 'virtus'
4
5
 
5
6
  class Article
6
7
  include Virtus.model
@@ -13,8 +14,8 @@ class Article
13
14
  end
14
15
 
15
16
  def each
16
- yield Article.new(id: 1, title: 'Welcome', updated_at: Time.at(1515151510).utc)
17
- yield Article.new(id: 2, title: 'Bye', updated_at: Time.at(1515151520).utc)
17
+ yield Article.new(id: 1, title: 'Welcome', updated_at: Time.at(1515151510).utc, created_at: Time.at(1515151500).utc)
18
+ yield Article.new(id: 2, title: 'Bye', updated_at: Time.at(1515151520).utc, created_at: Time.at(1515151500).utc)
18
19
  end
19
20
  end
20
21
 
@@ -25,6 +26,7 @@ class Article
25
26
  attribute :id
26
27
  attribute :title
27
28
  attribute :updated_at
29
+ attribute :created_at
28
30
 
29
31
  def to_param
30
32
  id.to_s
@@ -44,6 +46,13 @@ class TestAPI < Grape::API
44
46
  scope.map(&:to_hash)
45
47
  end
46
48
 
49
+ get '/articles/never_updated' do
50
+ article = Article.all.first
51
+ article.updated_at = nil
52
+
53
+ fresh_when(article, last_modified_field: :created_at)
54
+ end
55
+
47
56
  get '/articles/:id' do
48
57
  article = Article.all.first
49
58
  article.to_hash if stale?(article, stale_if_error: 5, extras: { a: 1, b: 2 })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Black Square Media Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-11 00:00:00.000000000 Z
11
+ date: 2020-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -206,6 +206,20 @@ dependencies:
206
206
  - - ">="
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: virtus
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
209
223
  description: ''
210
224
  email:
211
225
  - info@blacksquaremedia.com
@@ -284,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
284
298
  - !ruby/object:Gem::Version
285
299
  version: '0'
286
300
  requirements: []
287
- rubygems_version: 3.0.6
301
+ rubygems_version: 3.1.2
288
302
  signing_key:
289
303
  specification_version: 4
290
304
  summary: Standalone Grape API apps