fakerest 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/fakerest +3 -0
  2. data/lib/fakerest.rb +191 -0
  3. metadata +48 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fakerest'
@@ -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: []