fakerest 0.0.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.
- data/bin/fakerest +3 -0
- data/lib/fakerest.rb +191 -0
- metadata +48 -0
data/bin/fakerest
ADDED
data/lib/fakerest.rb
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'yaml'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
|
6
|
+
module FakeRest
|
7
|
+
|
8
|
+
class ArgumentsParser
|
9
|
+
|
10
|
+
def parse(args)
|
11
|
+
options = {}
|
12
|
+
|
13
|
+
optparse = OptionParser.new do |opts|
|
14
|
+
opts.banner = "Usage: fakerest.rb [options]"
|
15
|
+
|
16
|
+
options[:port] = 1111
|
17
|
+
options[:config] = nil
|
18
|
+
options[:views] = 'views/'
|
19
|
+
options[:uploads] = 'uploads/'
|
20
|
+
|
21
|
+
opts.on("-c","--config CONFIG_FILE","Confilg file to load request mappings (required)") do |cfg|
|
22
|
+
options[:config] = cfg
|
23
|
+
end
|
24
|
+
|
25
|
+
opts.on("-p","--port PORT","Port on which the fakerest to be run. Default = 1111") do |prt|
|
26
|
+
options[:port] = prt
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on("-w","--views VIEWS_FOLDER","Folder path that contains the views (required)") do |views|
|
30
|
+
options[:views] = views
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on("-u","--uploads UPLOADS_FOLDER","Folder to which any file uploads to be stored (required)") do |uploads|
|
34
|
+
options[:uploads] = uploads
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on( "-h", "--help", "Displays help message" ) do
|
38
|
+
puts opts
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
optparse.parse!(args)
|
43
|
+
|
44
|
+
|
45
|
+
if(options[:config] == nil)
|
46
|
+
puts optparse
|
47
|
+
exit(-1)
|
48
|
+
end
|
49
|
+
|
50
|
+
options
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
class RequestMapping
|
57
|
+
attr_reader :status_code, :response_file, :content_type, :method, :path
|
58
|
+
def initialize(method, path, status_code, response_file, content_type)
|
59
|
+
@method = method
|
60
|
+
@path = path
|
61
|
+
@status_code = status_code
|
62
|
+
@response_file = response_file
|
63
|
+
@content_type = content_type
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class UserRequest
|
68
|
+
attr_reader :response_status_code, :url, :body, :method, :request_file_path, :request_file_type
|
69
|
+
def initialize(method, url, body, response_status_code, request_file_path = "", request_file_type = "")
|
70
|
+
@method = method
|
71
|
+
@url = url
|
72
|
+
@body = body
|
73
|
+
@response_status_code = response_status_code
|
74
|
+
@request_file_path = request_file_path
|
75
|
+
@request_file_type = request_file_type
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_s
|
79
|
+
"#{method} #{url} #{response_status_code}\n#{body}\n\n"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class ProfileLoader
|
84
|
+
@@user_requests = []
|
85
|
+
@@options = {}
|
86
|
+
|
87
|
+
def self.load(profile_file, options)
|
88
|
+
@@options = options
|
89
|
+
request_mappings = []
|
90
|
+
profile_file_path = profile_file
|
91
|
+
|
92
|
+
defns = YAML::load_documents(File.open(profile_file_path))
|
93
|
+
defns.each do |doc|
|
94
|
+
method = doc['method']
|
95
|
+
path = doc['path']
|
96
|
+
|
97
|
+
response = doc['response']
|
98
|
+
response_file = response['content_file']
|
99
|
+
content_type = response['content_type']
|
100
|
+
status_code = response['status_code']
|
101
|
+
|
102
|
+
request_mappings << RequestMapping.new(method, path, status_code, response_file, content_type)
|
103
|
+
end
|
104
|
+
|
105
|
+
configure_requests(request_mappings)
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.configure_requests(request_mappings)
|
109
|
+
request_mappings.each do |request_mapping|
|
110
|
+
block = Proc.new {
|
111
|
+
request_file_path, request_file_type = ProfileLoader.upload_file(params['file']) if(params[:file] != nil)
|
112
|
+
|
113
|
+
content_type request_mapping.content_type
|
114
|
+
status request_mapping.status_code
|
115
|
+
request_body = ProfileLoader.generate_request_body(params, request)
|
116
|
+
|
117
|
+
@@user_requests << UserRequest.new(request.request_method, request.url, request_body, request_mapping.status_code, request_file_path, request_file_type)
|
118
|
+
erb request_mapping.response_file.to_sym, params
|
119
|
+
}
|
120
|
+
|
121
|
+
send request_mapping.method, request_mapping.path, &block
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.upload_file(file_params)
|
126
|
+
file_name = file_params[:filename] + Time.now.strftime("%Y%m%d%H%M%S")
|
127
|
+
File.open("#{@@options[:uploads]}" + file_name, "w") do |f|
|
128
|
+
f.write(file_params[:tempfile].read)
|
129
|
+
end
|
130
|
+
[file_name, file_params[:type]]
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.generate_request_body(params, request)
|
134
|
+
request_body = "Params are: "
|
135
|
+
params.each do |key, value|
|
136
|
+
next if key == 'file' or key == 'splat' or key == 'captures'
|
137
|
+
request_body += value != nil ? (key + "=" + value + ",") : (key + ",")
|
138
|
+
end
|
139
|
+
request_body += "\nBody is: " + request.body.read
|
140
|
+
request_body
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.user_requests
|
144
|
+
@@user_requests
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
options = FakeRest::ArgumentsParser.new.parse(ARGV)
|
150
|
+
|
151
|
+
require 'sinatra'
|
152
|
+
|
153
|
+
set :port, options[:port]
|
154
|
+
set :views, options[:views]
|
155
|
+
set :run, true
|
156
|
+
profile_file_path = options[:config]
|
157
|
+
|
158
|
+
FakeRest::ProfileLoader.load(profile_file_path, options)
|
159
|
+
|
160
|
+
get "/requests/:count" do
|
161
|
+
user_requests = FakeRest::ProfileLoader.user_requests
|
162
|
+
requests_count = params[:count].to_i
|
163
|
+
|
164
|
+
start_index = requests_count > user_requests.count ? 0 : ((user_requests.count - requests_count))
|
165
|
+
end_index = user_requests.count
|
166
|
+
range = start_index..end_index
|
167
|
+
|
168
|
+
requests_template = '<%= "No requests found" if user_requests.empty? %>
|
169
|
+
<% user_requests.each do |request| %>
|
170
|
+
<%= "<b>Method:</b> #{request.method} <b>Status:</b> #{request.response_status_code} <b>URL:</b> #{request.url}" %></br>
|
171
|
+
<pre><%= request.body %></pre>
|
172
|
+
<% if request.request_file_path != nil %>
|
173
|
+
<a href="/<%= request.request_file_path%>"><%= request.request_file_path%></a><br/>
|
174
|
+
Type: <%= request.request_file_type%>
|
175
|
+
<% end %>
|
176
|
+
<hr/>
|
177
|
+
<% end %>'
|
178
|
+
|
179
|
+
erb requests_template, :locals => {:user_requests => user_requests[range].reverse}
|
180
|
+
end
|
181
|
+
|
182
|
+
get "/" do
|
183
|
+
|
184
|
+
template = '<div>
|
185
|
+
Current Profile : <%= current_profile%>
|
186
|
+
</div>
|
187
|
+
<br/>'
|
188
|
+
|
189
|
+
erb template, :locals => {:current_profile => profile_file_path}
|
190
|
+
end
|
191
|
+
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fakerest
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Srivatsa Katta
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Sinatra base http server which fakes the rest services based on the config
|
15
|
+
given
|
16
|
+
email: vatsa.katta@gmail.com
|
17
|
+
executables:
|
18
|
+
- fakerest
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- lib/fakerest.rb
|
23
|
+
- bin/fakerest
|
24
|
+
homepage: http://github.com/katta/fakerest
|
25
|
+
licenses: []
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 1.8.24
|
45
|
+
signing_key:
|
46
|
+
specification_version: 3
|
47
|
+
summary: Fake rest
|
48
|
+
test_files: []
|