cameleon 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Yjg2ZDYwYjQ4NjYwNzNlOTczM2FhZjc3ZjI5NTYwNGFhMDMxMmE3OQ==
5
+ data.tar.gz: !binary |-
6
+ MDRkNmM1ZDJhMjMzZDg5MGRhY2NiMjIxYzE1YTBmODM0ZDYzOTMxMg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NzkzNzkzYzJiMWRlYTdjNTViYTFjN2U4NWU3Yjk5MzdlODhkZDhiOWI5ZDAz
10
+ MTkwYjQxNjg1NTdjOGEyNzBiZTZkMjdiNTZlOWRmYjI1OTAyMTFkNzRiZDAw
11
+ NmZjYjYwMzRiNDgwNDNiNDI3NWI2ODRiNWRjMjA1M2IzMzM2MWQ=
12
+ data.tar.gz: !binary |-
13
+ YzdhMTYyNzgwYTY0NzgzZDVmNDk5NTg4NWE2MDNjYzU3NjU0ODMwY2RjNTJj
14
+ N2I2MDNkZTMyZmUxNTZlYzgyZmFkM2RlNWE2MjU2M2Q5ZTQxNDRkZDRhZjYw
15
+ YzFlY2U0MTU3YzUzMTgwZjYyNzE2Y2NhMGJkYWFiYjMzZmFjNWI=
data/Gemfile CHANGED
@@ -3,11 +3,11 @@ gem "erubis"
3
3
  gem "rack"
4
4
  gem "hashie"
5
5
  gem "json"
6
+ gem "json-schema"
6
7
  gem "nokogiri"
7
8
 
8
9
  group :development do
9
10
  gem "shoulda", ">= 0"
10
- gem "bundler", "~> 1.0.0"
11
- gem "jeweler", "~> 1.6.4"
12
- gem "rcov", ">= 0"
11
+ gem "bundler"
12
+ gem "jeweler"#, "~> 1.6.4"
13
13
  end
data/README.md CHANGED
@@ -1,15 +1,17 @@
1
1
  Cameleon
2
2
  =======================================
3
3
 
4
- Cameleon (not Chameleon!) is HTTP mock server framework based on Rack. You can easily create HTTP server for mockup or stub of external system for your application.
4
+ Cameleon (not Chameleon!) is HTTP mock/stub server framework based on Rack.
5
+ You can easily create HTTP server behaves as external system for your application.
5
6
 
6
- All you have to do to create a new interface is simply make directory and put text file into the directory.
7
+ All you have to do to create a new HTTP interface is simply make directory and put response file into the directory.
7
8
 
8
9
  Features:
9
10
 
11
+ - Easy to create new HTTP interfaces (only to create directory and put response file into it)
10
12
  - Simple API for "_switch.rb" (for selecting response file)
11
- - Communicate in JSON, XML or any format over HTTP
12
- - Easy to create RESTful API
13
+ - Communicate in JSON, XML or any other format over HTTP
14
+ - Ready for RESTful API
13
15
 
14
16
 
15
17
  ## Installation
@@ -19,11 +21,11 @@ You can install Cameleon using RubyGems as below:
19
21
 
20
22
 
21
23
  ## Getting started
22
- First, create a new Cameleon project.
24
+ First, create a new Cameleon project using 'cameleon new' command.
23
25
 
24
- $ cameleon new your_project_name.
26
+ $ cameleon new your_project_name
25
27
 
26
- Then move the directory now you created, and launch cameleon server.
28
+ Move into the directory you've created now, and start cameleon server.
27
29
 
28
30
  $ cd your_project_name
29
31
  $ cameleon server
@@ -43,7 +45,7 @@ Think about creating HTTP interface such like below:
43
45
  - URL: /path/to/interface
44
46
  - response: "ok"
45
47
 
46
- Then all you have to do are below:
48
+ Follow these steps:
47
49
 
48
50
  $ mkdir -p response/path/to/interface
49
51
  $ cd response/path/to/interface
@@ -55,7 +57,7 @@ Test the interface:
55
57
  ok
56
58
 
57
59
  ### generate command
58
- Or simply, you can create a interface using "cameleon generate" command.
60
+ You can create a interface using "cameleon generate" command.
59
61
  If you want to create a new interface "/path/to/foo", type:
60
62
 
61
63
  $ cameleon generate path/to/foo
@@ -65,10 +67,11 @@ and test it.
65
67
  $ curl http://localhost:9292/path/to/foo
66
68
  edit me: response/path/to/foo/default
67
69
 
68
- So edit the file as you need.
70
+ Edit the file as you need.
69
71
 
70
72
  ### _switch.rb
71
- If you want to change the response by HTTP request, you shold create "_switch.rb" in your response directory.
73
+ If you want to change the response by HTTP request, you should create "_switch.rb" in your response directory.
74
+ "_switch.rb" should be pure Ruby file. You can write any logic you need in Ruby.
72
75
 
73
76
  Below shows a sample of "_switch.rb".
74
77
 
@@ -85,9 +88,38 @@ Below shows a sample of "_switch.rb".
85
88
 
86
89
  # if else, render "default" (any extention acceptable) file.
87
90
 
91
+ ### Validation
92
+ Cameleon can validate HTTP request body. Currently JSON format is supported. If you want to validate your request to Cameleon, add 'validation' attribute and 'type' sub-attribute as 'json' into your 'cameleon.yml' config file.
93
+
94
+ port: 9292
95
+ validation:
96
+ type: json
97
+
98
+ then put 'request.schema.json' into response directory. If your interface allows json request body like:
99
+
100
+ {"a": 1}
101
+
102
+ You should create 'request.schema.json' like:
103
+
104
+ {
105
+ "type" : "object",
106
+ "properties" : {
107
+ "a" : {
108
+ "type" : "integer",
109
+ "required" : true
110
+ }
111
+ }
112
+ }
113
+
114
+ Cameleon uses json-schema gem as validation engine, and it's based on [JSON Schema Draft 3](http://tools.ietf.org/html/draft-zyp-json-schema-03). See [json-schema](https://github.com/hoxworth/json-schema) for more detail.
115
+
116
+ Notice:
117
+
118
+ Cameleon validates request body only in POST or PUT http method.
88
119
 
89
120
  ## Gallery
90
121
  You can get various samples using "cameleon gallery" command.
122
+
91
123
  $ cd YOUR_CAMELEON_HOME
92
124
  $ cameleon gallery
93
125
 
data/Rakefile CHANGED
@@ -31,23 +31,4 @@ Rake::TestTask.new(:test) do |test|
31
31
  test.pattern = 'test/**/test_*.rb'
32
32
  test.verbose = true
33
33
  end
34
-
35
- require 'rcov/rcovtask'
36
- Rcov::RcovTask.new do |test|
37
- test.libs << 'test'
38
- test.pattern = 'test/**/test_*.rb'
39
- test.verbose = true
40
- test.rcov_opts << '--exclude "gems/*"'
41
- end
42
-
43
34
  task :default => :test
44
-
45
- require 'rake/rdoctask'
46
- Rake::RDocTask.new do |rdoc|
47
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
-
49
- rdoc.rdoc_dir = 'rdoc'
50
- rdoc.title = "cameleon #{version}"
51
- rdoc.rdoc_files.include('README*')
52
- rdoc.rdoc_files.include('lib/**/*.rb')
53
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/cameleon.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cameleon}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{daixque}]
@@ -1,7 +1,14 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'erubis'
3
+ require 'json-schema'
3
4
 
4
5
  class Cameleon
6
+ class ValidationError < Exception
7
+ def initialize(msg)
8
+ super(msg)
9
+ end
10
+ end
11
+
5
12
  class Action
6
13
  def find_default_file
7
14
  Dir.entries(@base_path).find { |f| f =~ /^default\./ }
@@ -14,6 +21,13 @@ class Cameleon
14
21
  end
15
22
  @params = req.params
16
23
  @body = req.body.read
24
+ if ["POST", "PUT"].include? req.request_method
25
+ begin
26
+ validate_request_body
27
+ rescue Cameleon::ValidationError => e
28
+ return [400, {}, [e.message]]
29
+ end
30
+ end
17
31
  switch_filepath = File.join @base_path, "_switch.rb"
18
32
  renderer = nil
19
33
  if !File.exists?(@base_path)
@@ -25,5 +39,29 @@ class Cameleon
25
39
  end
26
40
  renderer.build_response
27
41
  end
42
+
43
+ def validate_request_body
44
+ validation_type = Cameleon.config.validation && Cameleon.config.validation.type
45
+ case validation_type
46
+ when "json"
47
+ validate_json
48
+ when nil
49
+ else
50
+ raise "unknown validation type '#{validation_type}' in config.yml"
51
+ end
52
+ end
53
+
54
+ def validate_json
55
+ schema_filepath = File.join(@base_path, "request.schema.json")
56
+ if File.exists? schema_filepath
57
+ begin
58
+ schema = JSON.parse File.read(schema_filepath)
59
+ JSON::Validator.validate!(schema, @body)
60
+ rescue JSON::Schema::ValidationError => e
61
+ error_body = {"error" => e.message}.to_json
62
+ raise Cameleon::ValidationError.new(error_body)
63
+ end
64
+ end
65
+ end
28
66
  end
29
67
  end
@@ -11,5 +11,9 @@ when "bar"
11
11
  render "bar.json"
12
12
  end
13
13
 
14
+ # when you enable JSON validation (edit cameleon.yml)
15
+ # you may receive error if you post invalid request
16
+ # curl -XPOST http://localhost:9292/gallery/json -d"{\"invalid\":\"format\"}"
17
+
14
18
  # if nothing to match, use 404 HTTP Status Code and render default.json.
15
19
  status_code 404
@@ -1 +1,5 @@
1
- port: 9292
1
+ port: 9292
2
+
3
+ # uncommnet to enable JSON format validation feature
4
+ #validation:
5
+ # type: json
metadata CHANGED
@@ -1,115 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cameleon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - daixque
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-09-11 00:00:00.000000000Z
11
+ date: 2011-09-11 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: erubis
16
- requirement: &2156026340 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *2156026340
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rack
27
- requirement: &2156019320 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ! '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *2156019320
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: hashie
38
- requirement: &2156012980 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ! '>='
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *2156012980
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: json
49
- requirement: &2156005480 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :runtime
56
63
  prerelease: false
57
- version_requirements: *2156005480
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: nokogiri
60
- requirement: &2156000260 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
73
  - - ! '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :runtime
67
77
  prerelease: false
68
- version_requirements: *2156000260
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: shoulda
71
- requirement: &2155995580 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
87
  - - ! '>='
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *2155995580
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: bundler
82
- requirement: &2155991700 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
101
  - - ~>
86
102
  - !ruby/object:Gem::Version
87
103
  version: 1.0.0
88
104
  type: :development
89
105
  prerelease: false
90
- version_requirements: *2155991700
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.0.0
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: jeweler
93
- requirement: &2155982160 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
115
  - - ~>
97
116
  - !ruby/object:Gem::Version
98
117
  version: 1.6.4
99
118
  type: :development
100
119
  prerelease: false
101
- version_requirements: *2155982160
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 1.6.4
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: rcov
104
- requirement: &2155978480 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
129
  - - ! '>='
108
130
  - !ruby/object:Gem::Version
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *2155978480
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
113
139
  description: Cameleon is HTTP mock server framework based on Rack. You can easily
114
140
  create HTTP server for mockup or stub of external system for your application.
115
141
  email: daixque@gmail.com
@@ -165,28 +191,24 @@ files:
165
191
  homepage: http://github.com/daixque/cameleon
166
192
  licenses:
167
193
  - MIT
194
+ metadata: {}
168
195
  post_install_message:
169
196
  rdoc_options: []
170
197
  require_paths:
171
198
  - lib
172
199
  required_ruby_version: !ruby/object:Gem::Requirement
173
- none: false
174
200
  requirements:
175
201
  - - ! '>='
176
202
  - !ruby/object:Gem::Version
177
203
  version: '0'
178
- segments:
179
- - 0
180
- hash: -2425352503709104828
181
204
  required_rubygems_version: !ruby/object:Gem::Requirement
182
- none: false
183
205
  requirements:
184
206
  - - ! '>='
185
207
  - !ruby/object:Gem::Version
186
208
  version: '0'
187
209
  requirements: []
188
210
  rubyforge_project:
189
- rubygems_version: 1.8.6
211
+ rubygems_version: 2.0.3
190
212
  signing_key:
191
213
  specification_version: 3
192
214
  summary: Cameleon is HTTP mock server framework.