strelka 0.10.0 → 0.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b80a99f214a313af79edba1b5f7805e9c0608bb
4
- data.tar.gz: 29357b83d58fea5ed8643ae8cd3beebbb2f4a0fe
3
+ metadata.gz: 23f3a2bf90987379d646fd64f813d403057ba894
4
+ data.tar.gz: 7df48c8764cf88fc8e357fd6d4e70ab84bc7af9d
5
5
  SHA512:
6
- metadata.gz: 18eeb9cecb966a98ef3b17d6bd42c9205a7fabb6c874d5e0680d96710898e20a87b265da19b03bb1d1d3e16431d992765a459cf7423a65b17c17cf8b176bb013
7
- data.tar.gz: 5dd20c7375c9450fc84b96ec5a3167b8468620f4d1fd107b6b91df724950de16c70b42752b1cd66def6ba41f2ddb7e0d1c0687a677da402d0122ccbd6b2c6c3d
6
+ metadata.gz: f0d5356fbb5c03eccdb77d055796a6b120aabfd8702a590725b16b8b9446a42ad157fdd05841e96ab761ce91e74bdb8ade89893c4365d4cb5b7f34bc698f2ac1
7
+ data.tar.gz: 6993272bb47fd7874689853b7439b70581b27788ab3b1195125180eedca958bdc9a4e25bef06bf7d3587ea331dd70fd09d2d5a565fca256e2ec92b546679160b
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,8 +1,40 @@
1
+ 2015-12-29 Mahlon E. Smith <mahlon@martini.nu>
2
+
3
+ * lib/strelka/app/auth.rb, lib/strelka/authprovider.rb,
4
+ spec/strelka/app/auth_spec.rb:
5
+ If authentication fails, throw from the request processing path
6
+ instead of the authprovider API.
7
+ [4ec61e15b3b3] [tip]
8
+
9
+ 2015-11-18 Michael Granger <ged@FaerieMUD.org>
10
+
11
+ * lib/strelka/app/auth.rb, lib/strelka/httprequest/auth.rb,
12
+ lib/strelka/mixins.rb, lib/strelka/testing.rb,
13
+ spec/strelka/app/auth_spec.rb,
14
+ spec/strelka/httprequest/auth_spec.rb:
15
+ Add a mechanism for deferring authentication to request handlers
16
+ [92cfae454ef1] [github/master]
17
+
18
+ * lib/strelka/app/auth.rb, spec/strelka/app/auth_spec.rb:
19
+ Back out the auth hook before adding deferred auth
20
+ [62beb1c355cb]
21
+
22
+ 2015-11-16 Michael Granger <ged@FaerieMUD.org>
23
+
24
+ * lib/strelka/session/db.rb:
25
+ Fix Sqlite session table schema
26
+ [ee4051a888a1]
27
+
28
+ * spec/strelka/httprequest/acceptparams_spec.rb,
29
+ spec/strelka/router_spec.rb:
30
+ Fix empty raise_error()s
31
+ [142dd3a71307]
32
+
1
33
  2015-10-01 Mahlon E. Smith <mahlon@laika.com>
2
34
 
3
35
  * .hgsigs:
4
36
  Added signature for changeset 2e4e4c78a588
5
- [50bc1d12bad4] [tip]
37
+ [50bc1d12bad4]
6
38
 
7
39
  * .hgtags:
8
40
  Added tag v0.10.0 for changeset 2aae0e98c859
@@ -135,7 +167,7 @@
135
167
 
136
168
  * strelka.gemspec:
137
169
  Update the gemspec
138
- [92c894486289] [github/master]
170
+ [92c894486289]
139
171
 
140
172
  * Rakefile:
141
173
  Fix the fivefish version
@@ -757,7 +789,7 @@
757
789
  spec/strelka/app/parameters_spec.rb,
758
790
  spec/strelka/paramvalidator_spec.rb:
759
791
  Add a paramvalidator constraint for JSON fields
760
- [ac11b12f9366]
792
+ [ac11b12f9366] [github/no-notes-auto-vivify]
761
793
 
762
794
  2013-01-25 Michael Granger <ged@FaerieMUD.org>
763
795
 
data/History.rdoc CHANGED
@@ -1,3 +1,16 @@
1
+ == v0.11.0 [2016-01-20] Mahlon E. Smith <mahlon@martini.nu>
2
+
3
+ Enhancements:
4
+
5
+ - Add a mechanism for deferring authentication to request handlers
6
+ - If authentication fails, throw from the request processing path
7
+ instead of the authprovider API.
8
+
9
+ Bugfixes:
10
+
11
+ - Fix Sqlite session table schema
12
+
13
+
1
14
  == v0.10.0 [2015-10-01] Mahlon E. Smith <mahlon@martini.nu>
2
15
 
3
16
  - Allow authentication to be optional for a route.
data/lib/strelka.rb CHANGED
@@ -24,10 +24,10 @@ module Strelka
24
24
  log_as :strelka
25
25
 
26
26
  # Library version constant
27
- VERSION = '0.10.0'
27
+ VERSION = '0.11.0'
28
28
 
29
29
  # Version-control revision constant
30
- REVISION = %q$Revision: 2aae0e98c859 $
30
+ REVISION = %q$Revision: d794173d505f $
31
31
 
32
32
  require 'strelka/mixins'
33
33
  require 'strelka/constants'
@@ -473,6 +473,7 @@ module Strelka::App::Auth
473
473
  def handle_request( request, &block )
474
474
  self.log.debug "[:auth] Wrapping request in auth with a %p" % [ self.auth_provider ]
475
475
 
476
+ request.auth_provider = self.auth_provider
476
477
  self.authenticate_and_authorize( request )
477
478
 
478
479
  super
@@ -495,7 +496,8 @@ module Strelka::App::Auth
495
496
  def provide_authentication( request )
496
497
  provider = self.auth_provider
497
498
  self.log.info "Authenticating request using provider: %p" % [ provider ]
498
- return provider.authenticate( request )
499
+ credentials = provider.authenticate( request ) or finish_with( HTTP::AUTH_REQUIRED, "Authentication required." )
500
+ return credentials
499
501
  end
500
502
 
501
503
 
@@ -570,25 +572,6 @@ module Strelka::App::Auth
570
572
  alias_method :required_perms_for, :perms_required_for
571
573
 
572
574
 
573
- ### Normally, the authentication plugin manages authing a user
574
- ### automatically. There are cases where we want to perform this
575
- ### manually, such as a route that provides alternate data for an
576
- ### authenticated user, but still allows non-authed access.
577
- ###
578
- ### Returns the authenticated user object, or nil if unsuccessful.
579
- ###
580
- ### This essentially makes authentication optional for a route, instead
581
- ### of simply "on" or "off".
582
- def authenticate( request )
583
- acct = nil
584
- catch( :finish ) do
585
- acct = self.auth_provider.authenticate( request )
586
- request.authenticated_user = acct
587
- end
588
- return acct
589
- end
590
-
591
-
592
575
  #########
593
576
  protected
594
577
  #########
@@ -63,8 +63,7 @@ class Strelka::AuthProvider
63
63
 
64
64
 
65
65
  ### You should override this method if you want to authenticate the +request+. It should
66
- ### return a credentials object if authentication is successful, or throw an auth_required
67
- ### response if it fails.
66
+ ### return a credentials object if authentication is successful, or a false value if it fails.
68
67
  def authenticate( request )
69
68
  self.log.debug "No authentication provided, returning anonymous credentials."
70
69
  return 'anonymous'
@@ -13,6 +13,7 @@ module Strelka::HTTPRequest::Auth
13
13
  ### Extension callback -- add instance variables to extended objects.
14
14
  def initialize( * )
15
15
  super
16
+ @auth_provider = nil
16
17
  @authenticated_user = nil
17
18
  end
18
19
 
@@ -25,6 +26,47 @@ module Strelka::HTTPRequest::Auth
25
26
  attr_accessor :authenticated_user
26
27
  alias_method :authenticated?, :authenticated_user
27
28
 
29
+ # The Strelka::AuthProvider the app uses for authentication (if any)
30
+ attr_accessor :auth_provider
31
+
32
+
33
+ ### Try to authenticate the request using the specified +block+. If a +block+ is not provided,
34
+ ### the #authenticate method of the app's AuthProvider is used instead.
35
+ ###
36
+ ### Valid +options+ are:
37
+ ###
38
+ ### [+:optional+] if this is set to a true value, don't throw a 401 Requires Authentication
39
+ ### if the authentication fails.
40
+ ###
41
+ def authenticate( options={}, &block )
42
+ block ||= self.auth_provider.method( :authenticate )
43
+ result = block.call( self )
44
+
45
+ finish_with( HTTP::UNAUTHORIZED, "Authorization failed" ) unless result || options[:optional]
46
+ self.authenticated_user = result
47
+
48
+ return result
49
+ end
50
+
51
+
52
+ ### Try to check authorization using the specified +block+. If a +block+ is not
53
+ ### provided, the #authorize method of the app's AuthProvider is used instead.
54
+ ### If the request doesn't already have an +authenticated_user+ set,
55
+ ### #authenticate will be called with no arguments to try to provide one.
56
+ ### The provided +perms+ are passed either to the block or the AuthProvider if
57
+ ### no block is given. If successful, the authenticated user that was used is returned.
58
+ def authorize( *perms, &block )
59
+ if block
60
+ results = block.call or
61
+ finish_with( HTTP::FORBIDDEN, "You are not authorized to access this resource." )
62
+ return results
63
+ else
64
+ self.log.debug "Deferred authorization via %p" % [ self.auth_provider ]
65
+ credentials = self.authenticated_user || self.authenticate
66
+ self.auth_provider.authorize( credentials, self, perms )
67
+ return credentials
68
+ end
69
+ end
28
70
 
29
71
  end # module Strelka::HTTPRequest::Auth
30
72
 
@@ -329,8 +329,16 @@ module Strelka
329
329
 
330
330
  # A collection of functions for generating responses.
331
331
  module ResponseHelpers
332
+ extend Loggability
332
333
  include Strelka::Constants
333
334
 
335
+ log_to :strelka
336
+
337
+
338
+ ###############
339
+ module_function
340
+ ###############
341
+
334
342
  ### Abort the current execution and return a response with the specified
335
343
  ### http_status code immediately. The specified +message+ will be logged,
336
344
  ### and will be included in any message that is returned as part of the
@@ -72,11 +72,9 @@ class Strelka::Session::Db < Strelka::Session::Default
72
72
  else
73
73
  self.log.debug "Creating new sessions table for %p" % [ db ]
74
74
  self.db.create_table( self.table_name.to_sym ) do
75
- text :session_id, :index => true
75
+ text :session_id, :primary_key => true
76
76
  text :session
77
77
  timestamp :created
78
-
79
- primary_key :session_id
80
78
  end
81
79
  end
82
80
 
@@ -87,6 +87,8 @@ module Strelka::Testing
87
87
  nil
88
88
  end
89
89
 
90
+ Loggability[ Strelka ].debug "Test proc called; status info is: %p" % [ status_info ]
91
+
90
92
  return self.check_finish( status_info ) &&
91
93
  self.check_status_code( status_info ) &&
92
94
  self.check_message( status_info ) &&
@@ -27,6 +27,13 @@ describe Strelka::App::Auth do
27
27
  it_should_behave_like( "A Strelka Plugin" )
28
28
 
29
29
 
30
+ RSpec::Matchers.define( :require_auth_for_request ) do |request|
31
+ match do |app|
32
+ app.request_should_auth?( request )
33
+ end
34
+ end
35
+
36
+
30
37
  it "gives including apps a default authprovider" do
31
38
  app = Class.new( Strelka::App ) do
32
39
  plugins :auth
@@ -62,7 +69,6 @@ describe Strelka::App::Auth do
62
69
  def handle_request( req )
63
70
  super do
64
71
  res = req.response
65
- self.authenticate( req ) if req.uri.to_s =~ /\/optional$/
66
72
  res.status = HTTP::OK
67
73
  res.content_type = 'text/plain'
68
74
  res.puts "Ran successfully."
@@ -125,14 +131,6 @@ describe Strelka::App::Auth do
125
131
  expect( subclass.negative_perms_criteria ).to_not equal( @app.negative_perms_criteria )
126
132
  end
127
133
 
128
-
129
- RSpec::Matchers.define( :require_auth_for_request ) do |request|
130
- match do |app|
131
- app.request_should_auth?( request )
132
- end
133
- end
134
-
135
-
136
134
  it "allows auth criteria to be declared with a string" do
137
135
  @app.require_auth_for( '/string' )
138
136
  app = @app.new
@@ -319,7 +317,6 @@ describe Strelka::App::Auth do
319
317
 
320
318
  end
321
319
 
322
-
323
320
  it "allows perms criteria to be declared with a string" do
324
321
  @app.require_perms_for( '/string', :stringperm )
325
322
  app = @app.new
@@ -574,7 +571,7 @@ describe Strelka::App::Auth do
574
571
  req = @request_factory.get( '/api/v1/onlyauth' )
575
572
 
576
573
  app = @app.new
577
- expect( app.auth_provider ).to receive( :authenticate )
574
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
578
575
  expect( app.auth_provider ).to_not receive( :authorize )
579
576
 
580
577
  app.handle( req )
@@ -584,7 +581,7 @@ describe Strelka::App::Auth do
584
581
  req = @request_factory.get( '/api/v1/both' )
585
582
 
586
583
  app = @app.new
587
- expect( app.auth_provider ).to receive( :authenticate )
584
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
588
585
  expect( app.auth_provider ).to receive( :authorize )
589
586
 
590
587
  app.handle( req )
@@ -623,7 +620,7 @@ describe Strelka::App::Auth do
623
620
  req = @request_factory.get( '/api/v1/onlyauth' )
624
621
 
625
622
  app = @app.new
626
- expect( app.auth_provider ).to receive( :authenticate )
623
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
627
624
  expect( app.auth_provider ).to receive( :authorize )
628
625
 
629
626
  app.handle( req )
@@ -633,7 +630,7 @@ describe Strelka::App::Auth do
633
630
  req = @request_factory.get( '/api/v1/both' )
634
631
 
635
632
  app = @app.new
636
- expect( app.auth_provider ).to receive( :authenticate )
633
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
637
634
  expect( app.auth_provider ).to_not receive( :authorize )
638
635
 
639
636
  app.handle( req )
@@ -659,20 +656,6 @@ describe Strelka::App::Auth do
659
656
  before( :each ) do
660
657
  @app.no_auth_for( '/onlyauth' )
661
658
  @app.no_auth_for( '/both' )
662
- @app.no_auth_for( '/optional' )
663
- end
664
-
665
- context "and optional auth for a route" do
666
-
667
- it "checks auth without throwing HTTP::AUTH_REQUIRED" do
668
- req = @request_factory.get( '/api/v1/optional' )
669
-
670
- app = @app.new
671
- expect( app.auth_provider ).to receive( :authenticate )
672
- expect( app.auth_provider ).to receive( :authorize )
673
-
674
- app.handle( req )
675
- end
676
659
  end
677
660
 
678
661
  context "and positive perms criteria" do
@@ -686,7 +669,7 @@ describe Strelka::App::Auth do
686
669
  req = @request_factory.get( '/api/v1/onlyperms' )
687
670
 
688
671
  app = @app.new
689
- expect( app.auth_provider ).to receive( :authenticate )
672
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
690
673
  expect( app.auth_provider ).to receive( :authorize )
691
674
 
692
675
  app.handle( req )
@@ -716,7 +699,7 @@ describe Strelka::App::Auth do
716
699
  req = @request_factory.get( '/api/v1/neither' )
717
700
 
718
701
  app = @app.new
719
- expect( app.auth_provider ).to receive( :authenticate )
702
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
720
703
  expect( app.auth_provider ).to_not receive( :authorize )
721
704
 
722
705
  app.handle( req )
@@ -735,7 +718,7 @@ describe Strelka::App::Auth do
735
718
  req = @request_factory.get( '/api/v1/onlyperms' )
736
719
 
737
720
  app = @app.new
738
- expect( app.auth_provider ).to receive( :authenticate )
721
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
739
722
  expect( app.auth_provider ).to_not receive( :authorize )
740
723
 
741
724
  app.handle( req )
@@ -765,7 +748,7 @@ describe Strelka::App::Auth do
765
748
  req = @request_factory.get( '/api/v1/neither' )
766
749
 
767
750
  app = @app.new
768
- expect( app.auth_provider ).to receive( :authenticate )
751
+ expect( app.auth_provider ).to receive( :authenticate ).and_return( true )
769
752
  expect( app.auth_provider ).to receive( :authorize )
770
753
 
771
754
  app.handle( req )
@@ -796,6 +779,7 @@ describe Strelka::App::Auth do
796
779
 
797
780
  end
798
781
 
782
+
799
783
  end
800
784
 
801
785
  end
@@ -87,7 +87,7 @@ describe Strelka::HTTPRequest, "accept params" do
87
87
  it "rejects invalid Accept header values" do
88
88
  expect {
89
89
  Strelka::HTTPRequest::MediaType.parse( 'porksausage' )
90
- }.to raise_error()
90
+ }.to raise_error( ArgumentError, /no media-range/i )
91
91
  end
92
92
 
93
93
 
@@ -6,6 +6,7 @@ require_relative '../../helpers'
6
6
  require 'rspec'
7
7
 
8
8
  require 'strelka'
9
+ require 'strelka/authprovider'
9
10
  require 'strelka/httprequest/auth'
10
11
 
11
12
 
@@ -19,22 +20,139 @@ describe Strelka::HTTPRequest::Auth do
19
20
  @request_factory = Mongrel2::RequestFactory.new( route: '/service/user' )
20
21
  end
21
22
 
22
- before( :each ) do
23
- @req = @request_factory.get( '/service/user/estark' )
24
- @req.extend( described_class )
23
+
24
+ let( :request ) do
25
+ request = @request_factory.get( '/service/user/astark' )
26
+ request.extend( described_class )
27
+ request
25
28
  end
26
29
 
27
30
 
31
+
28
32
  it "adds an authenticated? predicate" do
29
- expect( @req ).to_not be_authenticated()
30
- @req.authenticated_user = 'anonymous'
31
- expect( @req ).to be_authenticated()
33
+ expect( request ).to_not be_authenticated()
34
+ request.authenticated_user = 'anonymous'
35
+ expect( request ).to be_authenticated()
32
36
  end
33
37
 
34
38
  it "adds an authenticated_user attribute" do
35
- expect( @req.authenticated_user ).to be_nil()
36
- @req.authenticated_user = 'someone'
37
- expect( @req.authenticated_user ).to eq( 'someone' )
39
+ expect( request.authenticated_user ).to be_nil()
40
+ request.authenticated_user = 'someone'
41
+ expect( request.authenticated_user ).to eq( 'someone' )
42
+ end
43
+
44
+
45
+ context "authentication method" do
46
+
47
+ it "sets the authenticated user to the result of the authenticate block" do
48
+ request.authenticate do
49
+ :the_user
50
+ end
51
+
52
+ expect( request.authenticated_user ).to eq( :the_user )
53
+ end
54
+
55
+ it "calls #authenticate on the request's auth_provider if no block is given" do
56
+ request.auth_provider = instance_double( Strelka::AuthProvider )
57
+
58
+ expect( request.auth_provider ).to receive( :authenticate ).with( request ).
59
+ and_return( :the_user )
60
+
61
+ expect( request.authenticate ).to eq( :the_user )
62
+ expect( request.authenticated_user ).to eq( :the_user )
63
+ end
64
+
65
+ it "finishes with a 401 Auth Required if the provided block returns a false value" do
66
+ expect {
67
+ request.authenticate { false }
68
+ }.to finish_with( HTTP::UNAUTHORIZED )
69
+ end
70
+
71
+ it "doesn't 401 if provided block returns false when called with optional: true" do
72
+ expect {
73
+ request.authenticate( optional: true ) { false }
74
+ }.to_not finish_with( HTTP::UNAUTHORIZED )
75
+ end
76
+
77
+ end
78
+
79
+
80
+ context "authorization method" do
81
+
82
+ it "is a noop if the provided block returns true" do
83
+ expect {
84
+ request.authorize { :the_user }
85
+ }.to_not finish_with( HTTP::FORBIDDEN )
86
+ end
87
+
88
+
89
+ it "calls #authorize on the request's auth_provider if no block is given" do
90
+ request.authenticated_user = :the_user
91
+ request.auth_provider = instance_double( Strelka::AuthProvider )
92
+
93
+ expect( request.auth_provider ).to_not receive( :authenticate )
94
+ expect( request.auth_provider ).to receive( :authorize ).
95
+ with( :the_user, request, [] ).
96
+ and_return( true )
97
+
98
+ result = request.authorize
99
+
100
+ expect( result ).to eq( :the_user )
101
+ expect( request.authenticated_user ).to eq( :the_user )
102
+ end
103
+
104
+
105
+ it "trys to authenticate if called without a block and the request doesn't have an authorized_user" do
106
+ request.authenticated_user = nil
107
+ request.auth_provider = instance_double( Strelka::AuthProvider )
108
+
109
+ expect( request.auth_provider ).to receive( :authenticate ).with( request ).
110
+ and_return( :the_user )
111
+ expect( request.auth_provider ).to receive( :authorize ).
112
+ with( :the_user, request, [] ).
113
+ and_return( true )
114
+
115
+ result = request.authorize
116
+
117
+ expect( result ).to eq( :the_user )
118
+ expect( request.authenticated_user ).to eq( :the_user )
119
+ end
120
+
121
+
122
+ it "finishes with a 401 Auth Required if calling #authorize without a block and auth fails" do
123
+ request.auth_provider = instance_double( Strelka::AuthProvider )
124
+
125
+ expect( request.auth_provider ).to receive( :authenticate ) do |arg|
126
+ expect( arg ).to be( request )
127
+ Strelka::ResponseHelpers.finish_with( HTTP::UNAUTHORIZED )
128
+ end
129
+
130
+ expect { request.authorize }.to finish_with( HTTP::UNAUTHORIZED )
131
+ end
132
+
133
+
134
+ it "finishes with a 403 Forbidden if it returns a false value" do
135
+ expect {
136
+ request.authorize { false }
137
+ }.to finish_with( HTTP::FORBIDDEN )
138
+ end
139
+
140
+
141
+ it "passes permissions to the auth provider" do
142
+ request.authenticated_user = :the_user
143
+ request.auth_provider = instance_double( Strelka::AuthProvider )
144
+
145
+ expect( request.auth_provider ).to receive( :authorize ).
146
+ with( :the_user, request, [ :hand, :meat ] ).
147
+ and_return( true )
148
+
149
+ result = request.authorize( :hand, :meat )
150
+
151
+ expect( result ).to eq( :the_user )
152
+ expect( request.authenticated_user ).to eq( :the_user )
153
+ end
154
+
38
155
  end
39
156
 
157
+
40
158
  end
@@ -29,7 +29,7 @@ describe Strelka::Router do
29
29
  it "is abstract" do
30
30
  expect {
31
31
  Strelka::Router.new
32
- }.to raise_error()
32
+ }.to raise_error( NoMethodError, /private method `new'/i )
33
33
  end
34
34
 
35
35
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strelka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mahlon E. Smith
@@ -31,7 +31,7 @@ cert_chain:
31
31
  G8LHR7EjtPPmqCCunfyecJ6MmCNaiJCBxq2NYzyNmluPyHT8+0fuB5kccUVZm6CD
32
32
  xn3DzOkDE6NYbk8gC9rTsA==
33
33
  -----END CERTIFICATE-----
34
- date: 2015-10-01 00:00:00.000000000 Z
34
+ date: 2016-01-20 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: configurability
@@ -297,14 +297,14 @@ dependencies:
297
297
  requirements:
298
298
  - - "~>"
299
299
  - !ruby/object:Gem::Version
300
- version: '3.13'
300
+ version: '3.14'
301
301
  type: :development
302
302
  prerelease: false
303
303
  version_requirements: !ruby/object:Gem::Requirement
304
304
  requirements:
305
305
  - - "~>"
306
306
  - !ruby/object:Gem::Version
307
- version: '3.13'
307
+ version: '3.14'
308
308
  description: |-
309
309
  Strelka is a framework for creating and deploying
310
310
  Mongrel2[http://mongrel2.org/] web applications in Ruby.
@@ -485,7 +485,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
485
485
  version: '0'
486
486
  requirements: []
487
487
  rubyforge_project:
488
- rubygems_version: 2.4.7
488
+ rubygems_version: 2.4.8
489
489
  signing_key:
490
490
  specification_version: 4
491
491
  summary: Strelka is a framework for creating and deploying Mongrel2[http://mongrel2.org/]
metadata.gz.sig CHANGED
Binary file