grape-reload 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,60 @@
1
+ require 'grape'
2
+ require 'spec_helper'
3
+
4
+ describe Grape::Reload::Watcher do
5
+ def app; @app end
6
+ before(:example) do
7
+ @app =
8
+ Grape::RackBuilder.setup do
9
+ add_source_path File.expand_path('**/*.rb', APP_ROOT)
10
+ environment 'development'
11
+ reload_threshold 0
12
+ mount 'Test::App1', to: '/test1'
13
+ mount 'Test::App2', to: '/test2'
14
+ end.boot!.application
15
+ end
16
+
17
+ after(:example) do
18
+ Grape::Reload::Watcher.clear
19
+ end
20
+
21
+ it 'reloads changed root app file' do
22
+ get '/test1/test'
23
+ expect(last_response).to succeed
24
+ expect(last_response.body).to eq('test1 response')
25
+
26
+ with_changed_fixture 'app1/test1.rb' do
27
+ get '/test1/test'
28
+ expect(last_response).to succeed
29
+ expect(last_response.body).to eq('test1 response changed')
30
+ end
31
+ end
32
+
33
+ it 'reloads mounted app file' do
34
+ get '/test1/mounted/test1'
35
+ expect(last_response).to succeed
36
+ expect(last_response.body).to eq('mounted test1')
37
+
38
+ with_changed_fixture 'app1/mounts/mount.rb' do
39
+ get '/test1/mounted/test1'
40
+ expect(last_response).to succeed
41
+ expect(last_response.body).to eq('mounted test1 changed')
42
+ end
43
+ end
44
+
45
+ it 'reloads library file and reinits all affected APIs' do
46
+ with_changed_fixture 'app1/test1.rb' do
47
+ get '/test1/lib_mounted/lib_string'
48
+ expect(last_response).to succeed
49
+ expect(last_response.body).to eq('lib string 1')
50
+
51
+ with_changed_fixture 'lib/lib1.rb' do
52
+ get '/test1/lib_mounted/lib_string'
53
+ expect(last_response).to succeed
54
+ expect(last_response.body).to eq('lib string 1 changed')
55
+
56
+ expect(Test::LibMount1.endpoints.first.options[:route_options][:entity].first.get_lib_string).to eq('lib string 1 changed')
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+ require 'ripper/extract_constants'
3
+
4
+ describe 'Ripper.extract_consts' do
5
+ let!(:code1) {
6
+ <<CODE
7
+ class TopClass
8
+ end
9
+
10
+ module Test
11
+ class Test1
12
+ end
13
+
14
+ module Test2
15
+ class Test4
16
+ end
17
+
18
+ class InClassUsage
19
+ t1 = ::TopClass
20
+ t2 = Test1
21
+ t3 = Test::Test1
22
+ t4 = Test2::Test4
23
+ t5 = Test::NotExists::Test1
24
+ end
25
+ end
26
+
27
+ CONST_DEF1 = Test::Test2::InClassUsage
28
+ CONST_DEF2 = Test3::AnotherClass
29
+ CONST_DEF3 = SomeExternalClass
30
+ class Test < Superclass
31
+ test_class_method {params: SomeClass}
32
+
33
+ def test_method
34
+ SomeClass1.call_method
35
+ arg = SomeClass2.new
36
+ end
37
+ end
38
+ end
39
+ CODE
40
+ }
41
+
42
+ let!(:code2) {
43
+ <<CODE
44
+ module Test
45
+ class App2 < Grape::API
46
+ format :txt
47
+ mount Test::Mount2 => '/mounted'
48
+ mount Test::Mount10 => '/mounted2'
49
+ desc 'Blablabla',
50
+ entity: [Test::SomeAnotherEntity]
51
+ get :test do
52
+ SomeClass.usage
53
+ 'test2 response'
54
+ end
55
+ end
56
+ end
57
+ CODE
58
+ }
59
+
60
+ it 'extract consts from code1 correctly' do
61
+ consts = Ripper.extract_constants(code1)
62
+ expect(consts[:declared].flatten).to include(
63
+ '::TopClass',
64
+ '::Test::Test1',
65
+ '::Test::Test2::Test4',
66
+ '::Test::Test2::InClassUsage',
67
+ '::Test::CONST_DEF1',
68
+ '::Test::CONST_DEF2',
69
+ '::Test::CONST_DEF3',
70
+ '::Test::Test'
71
+ )
72
+
73
+ expect(consts[:used].flatten).to include(
74
+ '::Test3::AnotherClass',
75
+ '::Test::NotExists::Test1',
76
+ '::SomeExternalClass',
77
+ '::Superclass',
78
+ '::SomeClass1',
79
+ '::SomeClass2'
80
+ )
81
+
82
+ end
83
+ it 'extract consts from code2 correctly' do
84
+ consts = Ripper.extract_constants(code2)
85
+ expect(consts[:declared].flatten).to include(
86
+ '::Test::App2'
87
+ )
88
+
89
+ expect(consts[:used].flatten).to include(
90
+ '::Test::Mount2',
91
+ '::Test::Mount10',
92
+ '::Test::SomeAnotherEntity',
93
+ '::SomeClass'
94
+ )
95
+
96
+ end
97
+ end
@@ -0,0 +1,79 @@
1
+ require 'pry'
2
+ require 'grape/reload'
3
+ require 'rack'
4
+ require 'rack/test'
5
+ require 'grape'
6
+ require 'rspec/mocks'
7
+
8
+ APP_ROOT = File.expand_path('spec/fixtures')
9
+
10
+ module FileHelpers
11
+ class FixtureChangesStorage
12
+ def self.fixture_modified(file_name, original_content)
13
+ modified_fixtures[file_name] = original_content
14
+ end
15
+
16
+ def self.revert_fixtures!
17
+ modified_fixtures.each_pair do |file_name, content|
18
+ revert_fixture(file_name)
19
+ end
20
+ @modified_fixtures = {}
21
+ end
22
+
23
+ def self.revert_fixture(file_name)
24
+ return unless modified_fixtures[file_name]
25
+ data = modified_fixtures.delete(file_name)
26
+ File.write(file_name, data.last)
27
+ File.utime(File.atime(file_name), data.first, file_name)
28
+ end
29
+
30
+ def self.modified_fixtures
31
+ @modified_fixtures ||= {}
32
+ end
33
+ end
34
+
35
+ def with_changed_fixture(file_name, &block)
36
+ file_name = File.expand_path(file_name, APP_ROOT)
37
+ lines = File.read(file_name).split("\n")
38
+ new_lines = []
39
+ lines.each do |l|
40
+ if (/^(?<prepend>\s*).+\#\s?changed:\s?(?<changes>.+)/ =~ l).nil?
41
+ new_lines << l
42
+ else
43
+ new_lines << prepend + changes
44
+ end
45
+ end
46
+ File.write(file_name, new_lines.join("\n"))
47
+ mtime = File.mtime(file_name)
48
+ File.utime(File.atime(file_name), 1.day.from_now, file_name)
49
+ FixtureChangesStorage.fixture_modified(file_name, [mtime, lines.join("\n")])
50
+ yield if block_given?
51
+ FixtureChangesStorage.revert_fixture(file_name)
52
+ end
53
+ end
54
+
55
+ RSpec::Matchers.define :succeed do
56
+ match do |actual|
57
+ (actual.status == 200) || (actual.status == 201)
58
+ end
59
+
60
+ failure_message do |actual|
61
+ "expected that #{actual} succeed, but got #{actual.status} error:\n#{actual.body}"
62
+ end
63
+
64
+ failure_message_when_negated do |actual|
65
+ "expected that #{actual} fails, but got #{actual.status}"
66
+ end
67
+
68
+ description do
69
+ 'respond with 200 or 201 status code'
70
+ end
71
+ end
72
+
73
+ RSpec.configure do |c|
74
+ c.include FileHelpers
75
+ c.include Rack::Test::Methods
76
+ c.after(:suite) do |*args|
77
+ FileHelpers::FixtureChangesStorage.revert_fixtures!
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,271 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grape-reload
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - AMar4enko
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: grape
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.5.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.5.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: terminal-notifier-guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-nc
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: guard
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'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard-rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry-remote
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry-nav
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description:
196
+ email:
197
+ - amar4enko@gmail.com
198
+ executables: []
199
+ extensions: []
200
+ extra_rdoc_files: []
201
+ files:
202
+ - ".gitignore"
203
+ - ".travis.yml"
204
+ - Gemfile
205
+ - Guardfile
206
+ - LICENSE.txt
207
+ - README.md
208
+ - Rakefile
209
+ - grape-reload.gemspec
210
+ - lib/core_ext/object_space.rb
211
+ - lib/grape/reload.rb
212
+ - lib/grape/reload/dependency_map.rb
213
+ - lib/grape/reload/grape_api.rb
214
+ - lib/grape/reload/rack_builder.rb
215
+ - lib/grape/reload/storage.rb
216
+ - lib/grape/reload/version.rb
217
+ - lib/grape/reload/watcher.rb
218
+ - lib/ripper/extract_constants.rb
219
+ - spec/fixtures/app1/mounts/lib.rb
220
+ - spec/fixtures/app1/mounts/mount.rb
221
+ - spec/fixtures/app1/test1.rb
222
+ - spec/fixtures/app2/mounts/lib.rb
223
+ - spec/fixtures/app2/mounts/mount.rb
224
+ - spec/fixtures/app2/test2.rb
225
+ - spec/fixtures/lib/lib1.rb
226
+ - spec/fixtures/lib/lib2.rb
227
+ - spec/grape/reload/autoreload_interceptor_spec.rb
228
+ - spec/grape/reload/dependency_map_spec.rb
229
+ - spec/grape/reload/rack_builder_spec.rb
230
+ - spec/grape/reload/watcher_spec.rb
231
+ - spec/ripper/extract_constants_spec.rb
232
+ - spec/spec_helper.rb
233
+ homepage: ''
234
+ licenses:
235
+ - MIT
236
+ metadata: {}
237
+ post_install_message:
238
+ rdoc_options: []
239
+ require_paths:
240
+ - lib
241
+ required_ruby_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ required_rubygems_version: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ requirements: []
252
+ rubyforge_project:
253
+ rubygems_version: 2.2.2
254
+ signing_key:
255
+ specification_version: 4
256
+ summary: Grape autoreload gem
257
+ test_files:
258
+ - spec/fixtures/app1/mounts/lib.rb
259
+ - spec/fixtures/app1/mounts/mount.rb
260
+ - spec/fixtures/app1/test1.rb
261
+ - spec/fixtures/app2/mounts/lib.rb
262
+ - spec/fixtures/app2/mounts/mount.rb
263
+ - spec/fixtures/app2/test2.rb
264
+ - spec/fixtures/lib/lib1.rb
265
+ - spec/fixtures/lib/lib2.rb
266
+ - spec/grape/reload/autoreload_interceptor_spec.rb
267
+ - spec/grape/reload/dependency_map_spec.rb
268
+ - spec/grape/reload/rack_builder_spec.rb
269
+ - spec/grape/reload/watcher_spec.rb
270
+ - spec/ripper/extract_constants_spec.rb
271
+ - spec/spec_helper.rb