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.
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: []