scenario_server 0.1.1 → 0.1.2
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 +4 -4
- data/Gemfile.lock +18 -18
- data/README.md +70 -34
- data/lib/scenarios/application/app.rb +33 -33
- data/lib/scenarios/scenario_db.rb +2 -3
- data/lib/scenarios/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2d129f756b4fd46d7b76c1e9c4da719f8b54d60
|
4
|
+
data.tar.gz: 86ccf9bc6aef34399203dd7b4d4b509e1a78d5fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67f361fc85f467f9ca87090dee26eaccc747a14b54b639c7a7ea406612403805338226f5a4698c4b90258c90a27869d65b714dd491485f39e4053515b299ac85
|
7
|
+
data.tar.gz: 8bb363a05b863f1cbf27a2341a0382600ed80e8a97a075ea2a2ed372708eabb28db66bbb75ac7c3e949a14a10ff91079188debd23ae2229ebcc27288ad0657ab
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scenario_server (0.
|
4
|
+
scenario_server (0.1.1)
|
5
5
|
daemons (~> 1.1)
|
6
6
|
sequel (= 4.7)
|
7
7
|
sinatra (~> 1.4)
|
@@ -11,29 +11,29 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
backports (3.6.
|
14
|
+
backports (3.6.4)
|
15
15
|
daemons (1.1.9)
|
16
16
|
diff-lcs (1.2.5)
|
17
|
-
json_spec (1.1.
|
17
|
+
json_spec (1.1.4)
|
18
18
|
multi_json (~> 1.0)
|
19
|
-
rspec (
|
20
|
-
multi_json (1.
|
21
|
-
rack (1.
|
22
|
-
rack-protection (1.5.
|
19
|
+
rspec (>= 2.0, < 4.0)
|
20
|
+
multi_json (1.10.1)
|
21
|
+
rack (1.6.0)
|
22
|
+
rack-protection (1.5.3)
|
23
23
|
rack
|
24
|
-
rack-test (0.6.
|
24
|
+
rack-test (0.6.3)
|
25
25
|
rack (>= 1.0)
|
26
|
-
rake (10.
|
27
|
-
rspec (2.
|
28
|
-
rspec-core (~> 2.
|
29
|
-
rspec-expectations (~> 2.
|
30
|
-
rspec-mocks (~> 2.
|
31
|
-
rspec-core (2.
|
32
|
-
rspec-expectations (2.
|
26
|
+
rake (10.4.2)
|
27
|
+
rspec (2.99.0)
|
28
|
+
rspec-core (~> 2.99.0)
|
29
|
+
rspec-expectations (~> 2.99.0)
|
30
|
+
rspec-mocks (~> 2.99.0)
|
31
|
+
rspec-core (2.99.2)
|
32
|
+
rspec-expectations (2.99.2)
|
33
33
|
diff-lcs (>= 1.1.3, < 2.0)
|
34
|
-
rspec-mocks (2.
|
34
|
+
rspec-mocks (2.99.3)
|
35
35
|
sequel (4.7.0)
|
36
|
-
sinatra (1.4.
|
36
|
+
sinatra (1.4.5)
|
37
37
|
rack (~> 1.4)
|
38
38
|
rack-protection (~> 1.4)
|
39
39
|
tilt (~> 1.3, >= 1.3.4)
|
@@ -44,7 +44,7 @@ GEM
|
|
44
44
|
rack-test
|
45
45
|
sinatra (~> 1.4.0)
|
46
46
|
tilt (~> 1.3)
|
47
|
-
sqlite3 (1.3.
|
47
|
+
sqlite3 (1.3.10)
|
48
48
|
tilt (1.4.1)
|
49
49
|
|
50
50
|
PLATFORMS
|
data/README.md
CHANGED
@@ -1,59 +1,95 @@
|
|
1
1
|
# Scenarios
|
2
2
|
|
3
|
-
This gem
|
3
|
+
This gem can be used to setup a quick local api server.
|
4
4
|
|
5
|
-
|
6
|
-
Here a "default" scenario is present. You can add various routes to this scenario.
|
5
|
+
## Installation
|
7
6
|
|
8
|
-
|
9
|
-
GET , '/v1/season' {"temperature":"cold"}
|
7
|
+
Add this line to your application's Gemfile:
|
10
8
|
|
11
|
-
|
12
|
-
curl -i http://localhost:9000/v1/season
|
13
|
-
you will receive the json fixture added for that route.
|
9
|
+
gem 'scenario_server'
|
14
10
|
|
15
|
-
|
11
|
+
Or manually install it:
|
16
12
|
|
17
|
-
|
13
|
+
$ gem install scenario_server
|
18
14
|
|
19
|
-
|
20
|
-
e.g.
|
21
|
-
curl -i -H "SCENE:march" http://localhost:9000/v1/season
|
15
|
+
## Configuration
|
22
16
|
|
23
|
-
|
17
|
+
A yaml file when provided at the following location
|
18
|
+
> ~/.scenarios/config.yml
|
24
19
|
|
25
|
-
|
20
|
+
can be used to define the port and path of the sqlite database holding the routes.
|
21
|
+
If this file is not provided, the db file is created wherever the ruby gem is installed.
|
26
22
|
|
27
|
-
|
23
|
+
#### Config.yml
|
24
|
+
>localport: 4567
|
25
|
+
>localdbfile: /Users/vaibhav/.scenarios/scenarios.sqlite3
|
28
26
|
|
29
|
-
|
27
|
+
## Usage
|
28
|
+
|
29
|
+
The server can be started in daemon mode by
|
30
30
|
|
31
|
-
|
31
|
+
scenario_service start
|
32
32
|
|
33
|
-
|
33
|
+
or without a daemon mode
|
34
34
|
|
35
|
-
|
35
|
+
scenario_service start -t
|
36
36
|
|
37
|
-
|
37
|
+
### What are Scenarios
|
38
|
+
Scenarios is a context in which you are using your local api server. Each scenario contains one or more routes.
|
38
39
|
|
39
|
-
|
40
|
+
e.g.
|
41
|
+
1. Default
|
42
|
+
* GET , '/v1/season', 200, {"name":"summer","temperature":70}
|
43
|
+
* GET , '/v1/city' , 200, {"name":"Seattle"}
|
44
|
+
1. Rainy
|
45
|
+
* GET , '/v1/season', 200, {"name":"rainy","temperature":50,"precipitation":5}
|
46
|
+
1. Error
|
47
|
+
* GET , '/v1/season', 404, {"error":"sensors not found"}
|
48
|
+
* GET , '/v1/city' , 500, {"error":"server error"}
|
49
|
+
|
50
|
+
Scenarios are usually broken up as:
|
51
|
+
* For handling most common api response: 'Default' Scenario server comes with the server and this cannot be deleted.
|
52
|
+
* For handling alternate api response e.g. 'Rainy' with precipitation information in our current example
|
53
|
+
* For handling error responses e.g. 'error'
|
54
|
+
|
55
|
+
On startup, all responses returned from the server are from default scenario.
|
56
|
+
|
57
|
+
### To fetch data from routes
|
58
|
+
|
59
|
+
Make a request with scenario server url and path of the route with the correct request type. Also specify header **SCENE** with your scenario name,
|
60
|
+
This will return the fixture under that scenario, with status code and headers specified
|
61
|
+
e.g.
|
40
62
|
|
41
|
-
|
63
|
+
curl -X GET -H "SCENE:rainy" http://localhost:4567/v1/season
|
42
64
|
|
43
|
-
|
65
|
+
If the header **SCENE** is not present, the current scenario set on the server would be used.
|
44
66
|
|
45
|
-
|
67
|
+
will return
|
68
|
+
` {"name":"rainy","temperature":50,"precipitation":5} `
|
46
69
|
|
47
|
-
|
70
|
+
### To list all scenarios
|
71
|
+
curl http://localhost:4567/scenarios
|
72
|
+
or point the browser to http://localhost:4567/scenarios
|
48
73
|
|
49
|
-
|
74
|
+
### To check the current scenario
|
75
|
+
curl http://localhost:4567/scenario
|
76
|
+
or point the browser to http://localhost:4567/scenario
|
50
77
|
|
51
|
-
|
78
|
+
### To change the current scenario from 'default' to 'rainy'
|
79
|
+
curl -X PUT http://localhost:4567/scenario/rainy -d ''
|
80
|
+
|
81
|
+
Note: If you are not in 'default' scenario and make a call to a route which is not defined, server will also check 'default' for that route. If present, it will return data from that route else will give a 404.
|
82
|
+
|
83
|
+
### To add a new scenario 'winter'
|
84
|
+
curl -X POST http://localhost:4567/scenarios/new -d 'winter'
|
85
|
+
or point the browser to http://localhost:4567/scenarios and add name in the text box below **New scenario** and then click **submit**.
|
86
|
+
|
87
|
+
### To delete scenario 'winter'
|
88
|
+
Given that winter scenario has an id **3**
|
89
|
+
|
90
|
+
curl -X DELETE http://localhost:4567/scenarios/3
|
52
91
|
|
53
|
-
|
54
|
-
|
55
|
-
to hold the port to be used and the path of a sqlite database.
|
56
|
-
If this file is not provided, the db file is created inside the
|
57
|
-
gem folder.
|
92
|
+
### To get all routes from 'rainy' scenario
|
93
|
+
Given that 'rainy' scenario has an id **2**
|
58
94
|
|
59
|
-
|
95
|
+
curl http://localhost:4567/scenarios/2/routes
|
@@ -12,7 +12,7 @@ class ScenarioServer < Sinatra::Base
|
|
12
12
|
register Sinatra::ConfigFile
|
13
13
|
use Rack::MethodOverride
|
14
14
|
|
15
|
-
|
15
|
+
configure :production do
|
16
16
|
puts 'Production Environment'
|
17
17
|
config_file File.expand_path('~/.scenarios') + '/config.yml'
|
18
18
|
set :db_file , File.dirname(File.expand_path(__FILE__)) + '/../data/scenario_db.sqlite3'
|
@@ -88,7 +88,7 @@ class ScenarioServer < Sinatra::Base
|
|
88
88
|
selected_scenario = self.scenario_db.get_scenario_for_id(params[:scenario_id])
|
89
89
|
routes = self.scenario_db.get_routes_for_scenario(params[:scenario_id])
|
90
90
|
|
91
|
-
|
91
|
+
if (request.env['HTTP_ACCEPT'] && request.env['HTTP_ACCEPT'].include?('text/html'))
|
92
92
|
if params.has_key?('error')
|
93
93
|
erb :'scenario', :locals => {'scenario'=>selected_scenario, 'routes'=>routes, 'error'=>params['error']}
|
94
94
|
else
|
@@ -132,10 +132,10 @@ class ScenarioServer < Sinatra::Base
|
|
132
132
|
if valid_fixture
|
133
133
|
self.scenario_db.add_route_for_scenario(params['route_type'],
|
134
134
|
params['path'],
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
135
|
+
params['status_code'],
|
136
|
+
params['headers'],
|
137
|
+
params['fixture'],
|
138
|
+
params[:scenario_id])
|
139
139
|
redirect('/scenarios/'+params[:scenario_id])
|
140
140
|
else
|
141
141
|
redirect('/scenarios/'+params[:scenario_id]+'?error=invalid%20json')
|
@@ -145,10 +145,10 @@ class ScenarioServer < Sinatra::Base
|
|
145
145
|
json_body = JSON.parse(request.body.read)
|
146
146
|
route_id = self.scenario_db.add_route_for_scenario(json_body['route_type'],
|
147
147
|
json_body['path'],
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
148
|
+
json_body['status_code'],
|
149
|
+
json_body['headers'],
|
150
|
+
json_body['fixture'],
|
151
|
+
params[:scenario_id])
|
152
152
|
content = {'url'=>'/scenarios/'+params[:scenario_id]+'/routes/'+route_id.to_s}.to_json
|
153
153
|
[200, content]
|
154
154
|
end
|
@@ -212,32 +212,32 @@ class ScenarioServer < Sinatra::Base
|
|
212
212
|
end
|
213
213
|
|
214
214
|
# route path calls
|
215
|
-
get '/*' do
|
216
|
-
|
217
|
-
|
215
|
+
get '/*' do
|
216
|
+
#TODO: Validate scene from the list of scenarios
|
217
|
+
ordered_scenarios = self.scenario_db.get_ordered_scenarios
|
218
218
|
|
219
219
|
|
220
|
-
|
221
|
-
|
222
|
-
|
220
|
+
#TODO: dry up the implementation
|
221
|
+
#TODO: add ignore scene header
|
222
|
+
current_scenario = settings.scenario
|
223
223
|
if (request.env['HTTP_SCENE'])
|
224
|
-
|
225
|
-
|
224
|
+
current_scenario = request.env['HTTP_SCENE']
|
225
|
+
end
|
226
226
|
|
227
227
|
route_type = request.request_method.upcase
|
228
228
|
path = request.path.downcase
|
229
229
|
|
230
230
|
status_code, header, fixture = get_fixture(route_type, path, current_scenario)
|
231
231
|
if header.nil? || header == ""
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
232
|
+
header = {'Content-Type' => 'application/json'}
|
233
|
+
else
|
234
|
+
header = eval(header)
|
235
|
+
end
|
236
236
|
|
237
|
-
|
237
|
+
if fixture.nil?
|
238
238
|
404
|
239
239
|
else
|
240
|
-
|
240
|
+
status status_code
|
241
241
|
headers header
|
242
242
|
body fixture
|
243
243
|
end
|
@@ -249,10 +249,10 @@ class ScenarioServer < Sinatra::Base
|
|
249
249
|
route_type = request.request_method.upcase
|
250
250
|
path = request.path.downcase
|
251
251
|
|
252
|
-
|
252
|
+
current_scenario = settings.scenario
|
253
253
|
if (request.env['HTTP_SCENE'])
|
254
|
-
|
255
|
-
|
254
|
+
current_scenario = request.env['HTTP_SCENE']
|
255
|
+
end
|
256
256
|
|
257
257
|
status_code, header, fixture = get_fixture(route_type, path, current_scenario)
|
258
258
|
if fixture.nil?
|
@@ -268,10 +268,10 @@ class ScenarioServer < Sinatra::Base
|
|
268
268
|
route_type = request.request_method.upcase
|
269
269
|
path = request.path.downcase
|
270
270
|
|
271
|
-
|
271
|
+
current_scenario = settings.scenario
|
272
272
|
if (request.env['HTTP_SCENE'])
|
273
|
-
|
274
|
-
|
273
|
+
current_scenario = request.env['HTTP_SCENE']
|
274
|
+
end
|
275
275
|
|
276
276
|
status_code, header, fixture = get_fixture(route_type, path, current_scenario)
|
277
277
|
if fixture.nil?
|
@@ -289,10 +289,10 @@ class ScenarioServer < Sinatra::Base
|
|
289
289
|
route_type = request.request_method.upcase
|
290
290
|
path = request.path.downcase
|
291
291
|
|
292
|
-
|
292
|
+
current_scenario = settings.scenario
|
293
293
|
if (request.env['HTTP_SCENE'])
|
294
|
-
|
295
|
-
|
294
|
+
current_scenario = request.env['HTTP_SCENE']
|
295
|
+
end
|
296
296
|
|
297
297
|
status_code, header, fixture = get_fixture(route_type, path, current_scenario)
|
298
298
|
if fixture.nil?
|
@@ -236,9 +236,8 @@ class ScenarioDB
|
|
236
236
|
end
|
237
237
|
|
238
238
|
def get_fixture_from_routes(route_type, path, scenario_name)
|
239
|
-
self.routes.left_outer_join(:scenarios,
|
240
|
-
|
241
|
-
:name=>scenario_name).map([:status_code, :headers, :fixture]).first
|
239
|
+
self.routes.left_outer_join(:scenarios,
|
240
|
+
:id=>:scenario_id).where{Sequel.&({:route_type => route_type, :name=>scenario_name}, Sequel.ilike(:path,path))}.map([:status_code,:headers,:fixture]).first
|
242
241
|
|
243
242
|
end
|
244
243
|
|
data/lib/scenarios/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scenario_server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vaibhav Bhatia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|