api_sim 2.2.0 → 3.0.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: cbfb4f82a254fc887ef63f48e4c3a04733dcae00
4
- data.tar.gz: b23ca755915f2cfe063cd7c45fae8af53d5c0455
3
+ metadata.gz: b861496c5eace589914cf22783667e76a98b9e58
4
+ data.tar.gz: 18936141652259c619b2432669a2b926ffe33997
5
5
  SHA512:
6
- metadata.gz: f2867efebd7de8faf3a1f9427f9125d8be5c75e07e51183e218c13d7fd71de933972190e18d565600da81daf31d00f507c52d932f50ffb5eee180d8deb63c6e8
7
- data.tar.gz: b174edc0615398d14e777e4e23fd53080712adecf11bb98067ab0b10085237c2f1ed93970d9aaa771581811a8be96102b89702e8f50bdfb8764682367e8c13fd
6
+ metadata.gz: 6916e181541ce761dd3fdf4182efc6e2b0f45ebf0c2e61aa893f7b8e5e27e5be9e41454827f3a3c43b1156e5673c0adce7ab30db76a715821266cb717e903f44
7
+ data.tar.gz: d4518904d1c87e9684ed66453cafe275991ed4dd0f5f544f6d48a67407c8763679bc2a715827e7c8c2b4381cded513aa085f6fa149d5424bb571a12bc42f0b65
data/README.md CHANGED
@@ -25,7 +25,7 @@ Or install it yourself as:
25
25
  ```ruby
26
26
  require 'api_sim'
27
27
 
28
- ENDPOINT_JSON_SCHEMA = {"type": "object", "properties": {"a": {"type": "integer"}}}.to_json
28
+ ENDPOINT_JSON_SCHEMA = {type: "object", properties: {a: {type: "integer"}}}.to_json
29
29
 
30
30
  app = ApiSim.build_app do
31
31
  configure_endpoint 'GET', '/endpoint', 'Hi!', 200, {'X-CUSTOM-HEADER' => 'easy as abc'}, ENDPOINT_JSON_SCHEMA
@@ -43,11 +43,11 @@ end
43
43
  run app
44
44
  ```
45
45
 
46
- The above is an exact copy of the `config.example.ru` from the root of the repo. You can boot this without too much
46
+ The above is an exact copy of the `basic/config.ru` from the examples. You can boot this without too much
47
47
  effort by running:
48
48
 
49
49
  ```bash
50
- bundle check || bundle install && bundle exec rackup -Ilib config.example.ru
50
+ cd examples/basic && bundle check || bundle install && bundle exec rackup -I../../lib
51
51
  ```
52
52
 
53
53
  After which the simulators should be running on port 9292.
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'api_sim', path: '../../'
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: ../../
3
+ specs:
4
+ api_sim (2.2.0)
5
+ json-schema (>= 2.5)
6
+ nokogiri (~> 1.6.7)
7
+ sinatra (~> 1.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ addressable (2.3.8)
13
+ json-schema (2.6.2)
14
+ addressable (~> 2.3.8)
15
+ mini_portile2 (2.1.0)
16
+ nokogiri (1.6.8)
17
+ mini_portile2 (~> 2.1.0)
18
+ pkg-config (~> 1.1.7)
19
+ pkg-config (1.1.7)
20
+ rack (1.6.4)
21
+ rack-protection (1.5.3)
22
+ rack
23
+ sinatra (1.4.7)
24
+ rack (~> 1.5)
25
+ rack-protection (~> 1.4)
26
+ tilt (>= 1.3, < 3)
27
+ tilt (2.0.5)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ api_sim!
34
+
35
+ BUNDLED WITH
36
+ 1.12.5
@@ -1,6 +1,6 @@
1
1
  require 'api_sim'
2
2
 
3
- ENDPOINT_JSON_SCHEMA = {"type": "object", "properties": {"a": {"type": "integer"}}}.to_json
3
+ ENDPOINT_JSON_SCHEMA = {type: "object", properties: {a: {type: "integer"}}}.to_json
4
4
 
5
5
  app = ApiSim.build_app do
6
6
  configure_endpoint 'GET', '/endpoint', 'Hi!', 200, {'X-CUSTOM-HEADER' => 'easy as abc'}, ENDPOINT_JSON_SCHEMA
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'api_sim', path: '../../'
4
+ gem 'rack-cors', require: 'rack/cors'
@@ -0,0 +1,38 @@
1
+ PATH
2
+ remote: ../../
3
+ specs:
4
+ api_sim (2.2.0)
5
+ json-schema (>= 2.5)
6
+ nokogiri (~> 1.6.7)
7
+ sinatra (~> 1.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ addressable (2.3.8)
13
+ json-schema (2.6.2)
14
+ addressable (~> 2.3.8)
15
+ mini_portile2 (2.1.0)
16
+ nokogiri (1.6.8)
17
+ mini_portile2 (~> 2.1.0)
18
+ pkg-config (~> 1.1.7)
19
+ pkg-config (1.1.7)
20
+ rack (1.6.4)
21
+ rack-cors (0.4.0)
22
+ rack-protection (1.5.3)
23
+ rack
24
+ sinatra (1.4.7)
25
+ rack (~> 1.5)
26
+ rack-protection (~> 1.4)
27
+ tilt (>= 1.3, < 3)
28
+ tilt (2.0.5)
29
+
30
+ PLATFORMS
31
+ ruby
32
+
33
+ DEPENDENCIES
34
+ api_sim!
35
+ rack-cors
36
+
37
+ BUNDLED WITH
38
+ 1.12.5
@@ -0,0 +1,6 @@
1
+ # CORS Example for APISim
2
+
3
+ As a fairly common usecase for things like this is to simulate APIs for static UI apps,
4
+ this example shows how you can use the Rack Middleware Rack-CORS to setup CORS support.
5
+
6
+ Like the other examples, you can just copy and paste this, and tweak to your liking.
@@ -0,0 +1,19 @@
1
+ require 'rack/cors'
2
+ require 'api_sim'
3
+
4
+ app = ApiSim.build_app do
5
+ configure_endpoint 'GET', '/endpoint', 'Hi!', 200, {'X-CUSTOM-HEADER' => 'easy as abc'}
6
+ end
7
+
8
+ # See the documentation for Rack::Cors for all the options here.
9
+ use Rack::Cors do
10
+ allow do
11
+ origins '*'
12
+ resource '/*',
13
+ :methods => [:get, :post, :delete, :put, :patch, :options, :head],
14
+ :headers => :any,
15
+ :max_age => 600
16
+ end
17
+ end
18
+
19
+ run app
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'api_sim', path: '../../'
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: ../../
3
+ specs:
4
+ api_sim (2.2.0)
5
+ json-schema (>= 2.5)
6
+ nokogiri (~> 1.6.7)
7
+ sinatra (~> 1.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ addressable (2.3.8)
13
+ json-schema (2.6.2)
14
+ addressable (~> 2.3.8)
15
+ mini_portile2 (2.1.0)
16
+ nokogiri (1.6.8)
17
+ mini_portile2 (~> 2.1.0)
18
+ pkg-config (~> 1.1.7)
19
+ pkg-config (1.1.7)
20
+ rack (1.6.4)
21
+ rack-protection (1.5.3)
22
+ rack
23
+ sinatra (1.4.7)
24
+ rack (~> 1.5)
25
+ rack-protection (~> 1.4)
26
+ tilt (>= 1.3, < 3)
27
+ tilt (2.0.5)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ api_sim!
34
+
35
+ BUNDLED WITH
36
+ 1.12.5
@@ -0,0 +1,30 @@
1
+ require 'api_sim'
2
+ require 'find'
3
+
4
+ DATA_DIR = File.expand_path('./data', __dir__)
5
+ endpoints = []
6
+ Find.find(DATA_DIR) do |path|
7
+ next if Dir.exist?(path) # Skip directories
8
+ http_method = File.basename(path, '.json') # our files are their HTTP method with the mime-type as the extension
9
+ route = File.dirname(path).gsub(DATA_DIR, '') # the endpoint URL is everything else
10
+ response = JSON.parse(File.read(path))
11
+ status = response['status']
12
+ headers = response['headers']
13
+ body = response['body'].to_json
14
+ schema = response['schema'].to_json
15
+ puts "Configuring endpoint #{http_method} #{route}"
16
+ endpoints << [
17
+ http_method,
18
+ route,
19
+ body,
20
+ status,
21
+ headers,
22
+ schema
23
+ ]
24
+ end
25
+
26
+ app = ApiSim.build_app do
27
+ endpoints.each {|endpoint| configure_endpoint(*endpoint) }
28
+ end
29
+
30
+ run app
@@ -0,0 +1,17 @@
1
+ {
2
+ "status": 201,
3
+ "body": {
4
+ "id": 1,
5
+ "name": "Polly Peppers"
6
+ },
7
+ "headers": {
8
+ "Content-Type": "application/json"
9
+ },
10
+ "schema": {
11
+ "type": "object",
12
+ "properties": {
13
+ "id": {"type": "integer"},
14
+ "name": {"type": "string"}
15
+ }
16
+ }
17
+ }
@@ -36,7 +36,7 @@ module ApiSim
36
36
  post '/ui/response/:method/*' do
37
37
  @config = matcher(faux_request(http_method, route, faux_body))
38
38
  unless params['schema'].empty?
39
- @errors = JSON::Validator.fully_validate(params['schema'], params['body'])
39
+ @errors = JSON::Validator.fully_validate(JSON.parse(params['schema']), params['body'])
40
40
  if @errors.any?
41
41
  return erb :'responses/form.html', layout: :'layout.html'
42
42
  end
@@ -79,7 +79,7 @@ module ApiSim
79
79
  endpoint.requests.to_json
80
80
  end
81
81
 
82
- %i(get post put patch delete).each do |http_method|
82
+ %i(get post put patch delete options).each do |http_method|
83
83
  public_send(http_method, '/*') do
84
84
  endpoint = matcher(request)
85
85
  endpoint.record_request(request)
@@ -49,6 +49,19 @@ module ApiSim
49
49
  def response(_)
50
50
  [response_code, headers, response_body]
51
51
  end
52
+
53
+ protected
54
+
55
+ def matches_route_pattern?(request)
56
+ route_tokens = route.split('/')
57
+ request_tokens = request.path.split('/')
58
+
59
+ return false if route_tokens.count != request_tokens.count && !route_tokens.include?('*')
60
+ route_tokens.zip(request_tokens).all? do |matcher_part, request_part|
61
+ break true if matcher_part == '*'
62
+ matcher_part == request_part || matcher_part.start_with?(':')
63
+ end
64
+ end
52
65
  end
53
66
  end
54
67
  end
@@ -15,7 +15,7 @@ module ApiSim
15
15
  end
16
16
 
17
17
  def matches?(request)
18
- request.path == route && request.request_method == http_method && matcher.call(request)
18
+ matches_route_pattern?(request) && request.request_method == http_method && matcher.call(request)
19
19
  end
20
20
 
21
21
  def response(request)
@@ -33,4 +33,4 @@ module ApiSim
33
33
  end
34
34
  end
35
35
  end
36
- end
36
+ end
@@ -18,11 +18,7 @@ module ApiSim
18
18
  end
19
19
 
20
20
  def matches?(request)
21
- matches_dynamic_path?(request) && request.request_method == http_method && matcher.call(request)
22
- end
23
-
24
- def custom_matcher?
25
- matcher != ALWAYS_TRUE_MATCHER
21
+ matches_route_pattern?(request) && request.request_method == http_method && matcher.call(request)
26
22
  end
27
23
 
28
24
  def overridden!
@@ -33,25 +29,11 @@ module ApiSim
33
29
  !!@overridden
34
30
  end
35
31
 
36
- def requests
37
- @requests ||= []
38
- end
39
-
40
32
  def to_s
41
33
  <<-DOC.gsub(/^\s+/, '')
42
34
  #{http_method} #{route} -> (#{response_code}) #{response_body[0..20]}...
43
35
  DOC
44
36
  end
45
-
46
- def matches_dynamic_path?(request)
47
- route_tokens = route.split('/')
48
- request_tokens = request.path.split('/')
49
-
50
- return false unless route_tokens.count == request_tokens.count
51
- route_tokens.zip(request_tokens).all? do |matcher_part, request_part|
52
- matcher_part == request_part || matcher_part.start_with?(':')
53
- end
54
- end
55
37
  end
56
38
  end
57
- end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module ApiSim
2
- VERSION = "2.2.0"
2
+ VERSION = "3.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_sim
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-12 00:00:00.000000000 Z
11
+ date: 2016-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -126,7 +126,17 @@ files:
126
126
  - api_sim.gemspec
127
127
  - bin/console
128
128
  - bin/setup
129
- - config.example.ru
129
+ - examples/basic/Gemfile
130
+ - examples/basic/Gemfile.lock
131
+ - examples/basic/config.ru
132
+ - examples/cors/Gemfile
133
+ - examples/cors/Gemfile.lock
134
+ - examples/cors/README.md
135
+ - examples/cors/config.ru
136
+ - examples/with-fixtures/Gemfile
137
+ - examples/with-fixtures/Gemfile.lock
138
+ - examples/with-fixtures/config.ru
139
+ - examples/with-fixtures/data/users/1/GET.json
130
140
  - lib/api_sim.rb
131
141
  - lib/api_sim/app_builder.rb
132
142
  - lib/api_sim/built_app.rb