mockws 0.1.0 → 0.1.1
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 +4 -4
- data/VERSION +1 -1
- data/config/mockws.yml +18 -1
- data/lib/mockws/crud_manager.rb +254 -0
- data/lib/mockws/route_manager.rb +1 -1
- data/lib/mockws.rb +3 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e1de112950ca390d13246ecbef426a8536892e2d35c34d73d9c45e437b218c0
|
4
|
+
data.tar.gz: e0014929f12a7fa0676d4cf54c8d06f1fb287838a3fdfa23e3023c7abd754bca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 161e1e3bbc8c2e523e54a900f3063736b6b3232f1d3b78dca3fbd715a45ea640fd8d482f60b85ebb8e984bb505e0d85961cf80957dfe685e3418c725642469fa
|
7
|
+
data.tar.gz: 2443ee795e54babb3a8e6999cebc6f76a8778d2beaec79f4c3273c1c0274d34590b06621a110b22fd66010a3b6b531df6bfe679058a42ead0e33b042a7897d65
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/config/mockws.yml
CHANGED
@@ -40,4 +40,21 @@
|
|
40
40
|
:value2: "partial"
|
41
41
|
:to: :json
|
42
42
|
:response_time: 2
|
43
|
-
|
43
|
+
:crud_test:
|
44
|
+
:type: :crud
|
45
|
+
:object: post
|
46
|
+
:to: :json
|
47
|
+
:model:
|
48
|
+
:name:
|
49
|
+
:type: :string
|
50
|
+
:unicity: true
|
51
|
+
:mandatory: true
|
52
|
+
:title:
|
53
|
+
:type: :string
|
54
|
+
:unicity: false
|
55
|
+
:mandatory: true
|
56
|
+
:description:
|
57
|
+
:type: :string
|
58
|
+
:unicity: false
|
59
|
+
:mandatory: false
|
60
|
+
:primary_key: :name
|
@@ -0,0 +1,254 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'uuid'
|
3
|
+
|
4
|
+
module MockWS
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
class Store
|
9
|
+
|
10
|
+
TYPE_MAP = {
|
11
|
+
:string => :to_s,
|
12
|
+
:integer => :to_i,
|
13
|
+
:other => :to_s
|
14
|
+
|
15
|
+
}
|
16
|
+
def initialize( )
|
17
|
+
@models = {}
|
18
|
+
@definitions = {}
|
19
|
+
@keys = {}
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def models
|
24
|
+
return @models.keys
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_model(definition:)
|
28
|
+
@models[definition[:object]] = []
|
29
|
+
@definitions[definition[:object]] = definition[:model]
|
30
|
+
@keys[definition[:object]] = definition[:primary_key]
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_model(name:)
|
34
|
+
@models.delete(name)
|
35
|
+
end
|
36
|
+
|
37
|
+
def create(model:, data:)
|
38
|
+
data[:id] = UUID.generate
|
39
|
+
status = check_record(model: model, data: data)
|
40
|
+
@models[model].push data if status[:status] == true
|
41
|
+
return status
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def retrieve(model:, key:)
|
46
|
+
return @models[model].select{|value| value[@keys[model]] == key}.first
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def update(model:, key:, data:)
|
51
|
+
record = @models[model].select{|value| value[@keys[model]] == key}.first
|
52
|
+
status = check_record(model: model, data: data, update: true)
|
53
|
+
record.merge! data if status[:status] == true
|
54
|
+
return status
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def destroy(model:, key:)
|
59
|
+
res = @models[model].reject!{|value| value[@keys[model]] == key}
|
60
|
+
return (res.nil?)? false : true
|
61
|
+
end
|
62
|
+
|
63
|
+
def list(model: )
|
64
|
+
return @models[model]
|
65
|
+
end
|
66
|
+
|
67
|
+
def exist?(model:, key:)
|
68
|
+
return @models[model].index{|value| value[@keys[model]] == key} == 1
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
def check_record(model:, data: , update: false)
|
73
|
+
result = {status: true, unknowns: [],mandatories: [], unicity: []}
|
74
|
+
result[:unknowns].concat check_unknown(model: model, data: data)
|
75
|
+
result[:mandatories].concat check_mandatory(model: model, data: data) unless update
|
76
|
+
result[:unicity].concat check_unicity(model: model, data: data)
|
77
|
+
result[:status] = false if (!result[:unknowns].empty? or !result[:mandatories].empty? or !result[:unicity].empty?)
|
78
|
+
return result
|
79
|
+
end
|
80
|
+
|
81
|
+
def check_unknown(model:, data: )
|
82
|
+
unknowns = []
|
83
|
+
data.keys.each do |item|
|
84
|
+
unknowns.push item unless @definitions[model].keys.include? item
|
85
|
+
end
|
86
|
+
unknowns.delete :id
|
87
|
+
return unknowns
|
88
|
+
end
|
89
|
+
|
90
|
+
def check_mandatory(model:, data: )
|
91
|
+
mandatories = []
|
92
|
+
@definitions[model].select {|_key, value| value.dig(:mandatory) == true }.keys.each do |key|
|
93
|
+
mandatories.push key unless data.keys.include? key
|
94
|
+
end
|
95
|
+
return mandatories
|
96
|
+
end
|
97
|
+
|
98
|
+
def check_unicity(model:, data: )
|
99
|
+
unicity = []
|
100
|
+
data.each do |key,value|
|
101
|
+
if @definitions[model].dig(key, :unicity) then
|
102
|
+
unicity.push key unless @models[model].select {|item| item[key] == value }.empty?
|
103
|
+
end
|
104
|
+
end
|
105
|
+
return unicity
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
class CRUDManager
|
117
|
+
|
118
|
+
extend Carioca::Injector
|
119
|
+
inject service: :output
|
120
|
+
inject service: :configuration
|
121
|
+
|
122
|
+
DEFAULT_STATUS = 200
|
123
|
+
|
124
|
+
def self.get_response_time(value)
|
125
|
+
return {value: value[:response_time], type: :static} if value.include? :response_time
|
126
|
+
return {value: rand(1..value[:random_time]), type: :random} if value.include? :random_time
|
127
|
+
return {value: 0, type: :instant}
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
def self.configure(service)
|
132
|
+
@@service = service
|
133
|
+
unless configuration.settings.services.select {|key,value| value[:type] == :crud }.empty? then
|
134
|
+
@@store = MockWS::Store::new
|
135
|
+
output.info "Mock CRUD initialisation : "
|
136
|
+
configuration.settings.services.select {|key,value| value[:type] == :crud }.each do |_key, definition|
|
137
|
+
@@store.add_model definition: definition
|
138
|
+
output.item "Create JSON CRUD for #{definition[:object]}"
|
139
|
+
output.arrow "GET /crud/#{definition[:object]}/list"
|
140
|
+
output.arrow "GET /crud/#{definition[:object]}/<KEY>"
|
141
|
+
output.arrow "POST /crud/#{definition[:object]} [JSON BODY]"
|
142
|
+
output.arrow "PUT /crud/#{definition[:object]} [JSON BODY]"
|
143
|
+
output.arrow "DELETE /crud/#{definition[:object]}/<KEY> "
|
144
|
+
|
145
|
+
end
|
146
|
+
create_crud_service
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
|
152
|
+
def self.create_crud_service
|
153
|
+
@@service.get '/crud/:model/list' do |model|
|
154
|
+
result = finisher.secure_api_return(return_case: :status_ok, structured: true, json: true) do
|
155
|
+
finisher.secure_raise message: "Error model #{model} not found !", error_case: :bad_request unless @@store.models.include? model
|
156
|
+
@@store.list(model: model)
|
157
|
+
end
|
158
|
+
status result[:code]
|
159
|
+
result[:data]
|
160
|
+
end
|
161
|
+
|
162
|
+
@@service.get '/crud/:model/:item' do |model,item|
|
163
|
+
result = finisher.secure_api_return(return_case: :accepted, structured: true, json: true) do
|
164
|
+
finisher.secure_raise message: "Error model #{model} not found !", error_case: :bad_request unless @@store.models.include? model
|
165
|
+
res = @@store.retrieve(model: model, key: item)
|
166
|
+
finisher.secure_raise message: "No record found", error_case: :no_content if res.nil?
|
167
|
+
res
|
168
|
+
end
|
169
|
+
status result[:code]
|
170
|
+
result[:data]
|
171
|
+
end
|
172
|
+
|
173
|
+
@@service.put '/crud/:model/:item' do |model,item|
|
174
|
+
result = finisher.secure_api_return(return_case: :accepted, structured: true, json: true) do
|
175
|
+
finisher.secure_raise message: "Error model #{model} not found !", error_case: :bad_request unless @@store.models.include? model
|
176
|
+
data = JSON.parse(request.body.read, symbolize_names: true)
|
177
|
+
res = @@store.update model: model, key: item, data: data
|
178
|
+
code = res.delete(:status)
|
179
|
+
res = "Record successfully updated"
|
180
|
+
finisher.secure_raise message: "Update Error : #{res} ", error_case: :status_ko unless code
|
181
|
+
res
|
182
|
+
|
183
|
+
end
|
184
|
+
status result[:code]
|
185
|
+
result[:data]
|
186
|
+
end
|
187
|
+
|
188
|
+
@@service.post '/crud/:model' do |model|
|
189
|
+
result = finisher.secure_api_return(return_case: :created, structured: true, json: true) do
|
190
|
+
data = JSON.parse(request.body.read, symbolize_names: true)
|
191
|
+
finisher.secure_raise message: "Error model #{model} not found !", error_case: :bad_request unless @@store.models.include? model
|
192
|
+
res = @@store.create model: model, data: data
|
193
|
+
code = res.delete(:status)
|
194
|
+
res = "Record successfully created"
|
195
|
+
finisher.secure_raise message: "Creation Error : #{res} ", error_case: :bad_request unless code
|
196
|
+
res
|
197
|
+
end
|
198
|
+
status result[:code]
|
199
|
+
result[:data]
|
200
|
+
end
|
201
|
+
|
202
|
+
@@service.delete '/crud/:model/:item' do |model,item|
|
203
|
+
result = finisher.secure_api_return(return_case: :accepted, structured: true, json: true) do
|
204
|
+
finisher.secure_raise message: "Error model #{model} not found !", error_case: :bad_request unless @@store.models.include? model
|
205
|
+
if @@store.destroy(model: model, key: item) then
|
206
|
+
res = "Record #{item} successfully deleted"
|
207
|
+
else
|
208
|
+
finisher.secure_raise message: "Suppression failed : #{item} ", error_case: :bad_request unless @@store.destroy(model: model, key: item)
|
209
|
+
end
|
210
|
+
res
|
211
|
+
end
|
212
|
+
status result[:code]
|
213
|
+
result[:data]
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
# store = MockWS::Store::new
|
229
|
+
# store.add_model definition: {:type=>:crud,
|
230
|
+
# :object=>"post",
|
231
|
+
# :primary_key => :name,
|
232
|
+
# :model=>{
|
233
|
+
# :name => {:type => :string, :mandatory => true, :unicity => true},
|
234
|
+
# :title=> {:type => :string, :mandatory => true, :unicity => false},
|
235
|
+
# :description=> {:type => :string, :mandatory => false, :unicity => false}
|
236
|
+
# }
|
237
|
+
# }
|
238
|
+
# print "* create good post1 : " ;puts (store.create model: "post", data: {name: "post1", title: "mon titre", description: "bla blah"})? "created" : "error"
|
239
|
+
# print "* create good post2 : " ;puts (store.create model: "post", data: {name: "post2", title: "mon titre", description: "bla blah"})? "created" : "error"
|
240
|
+
# print "* create new post2 (duplicate): " ;puts (store.create model: "post", data: {name: "post2", title: "mon titre", description: "bla blah"})? "created" : "error"
|
241
|
+
# print "* create bad post3 (unknown key) : " ;puts (store.create model: "post", data: {name: "post3", title: "mon titre", description: "bla blah", toto: "test"})? "created" : "error"
|
242
|
+
# print "* create bad post5 (mandatory title) : " ;puts (store.create model: "post", data: {name: "post5", description: "bla blah"})? "created" : "error"
|
243
|
+
# print "* list : " ;p store.list model: "post"
|
244
|
+
# print "* get post1 : " ; p store.retrieve model: "post", key: "post1"
|
245
|
+
# print "* update : " ;p store.update model: "post", key: "post2", data: {title: "toto"}
|
246
|
+
# print "* update (not a mandatory): " ;p store.update model: "post", key: "post2", data: {description: "desc 2"}
|
247
|
+
# print "* update bad (unknown key): " ;p store.update model: "post", key: "post2", data: {title: "toto", toto: "test"}
|
248
|
+
# print "* update bad (unicity): " ;p store.update model: "post", key: "post2", data: {title: "toto", name: "post1" }
|
249
|
+
# print "* update change name: " ;p store.update model: "post", key: "post2", data: { name: "post4" }
|
250
|
+
# print "* list : " ;p store.list model: "post"
|
251
|
+
# print "* exists post4 : " ;p store.exist? model: "post", key: "post4"
|
252
|
+
# print "* exists post3 : " ;p store.exist? model: "post", key: "post3"
|
253
|
+
# print "* delete post1 : " ;p store.destroy model: "post", key: "post1"
|
254
|
+
# print "* list : " ; p store.list model: "post"
|
data/lib/mockws/route_manager.rb
CHANGED
@@ -17,7 +17,7 @@ module MockWS
|
|
17
17
|
def self.configure(service)
|
18
18
|
@service = service
|
19
19
|
output.info "Mock routes initialisation : "
|
20
|
-
configuration.settings.services.each do |_key, definition|
|
20
|
+
configuration.settings.services.select {|key,value| [:static,:inline].include? value[:type]}.each do |_key, definition|
|
21
21
|
create_route(definition)
|
22
22
|
end
|
23
23
|
end
|
data/lib/mockws.rb
CHANGED
@@ -72,6 +72,7 @@ end
|
|
72
72
|
|
73
73
|
|
74
74
|
require_relative 'mockws/route_manager'
|
75
|
+
require_relative 'mockws/crud_manager'
|
75
76
|
require_relative 'mockws/data_manager'
|
76
77
|
require_relative 'mockws/daemon_controller'
|
77
78
|
|
@@ -87,11 +88,13 @@ module MockWS
|
|
87
88
|
extend Carioca::Injector
|
88
89
|
inject service: :output
|
89
90
|
inject service: :configuration
|
91
|
+
inject service: :finisher
|
90
92
|
|
91
93
|
|
92
94
|
|
93
95
|
def self.init
|
94
96
|
MockWS::RouteManager::configure(self)
|
97
|
+
MockWS::CRUDManager::configure(self)
|
95
98
|
end
|
96
99
|
|
97
100
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mockws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Camille Paquet
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-10-
|
13
|
+
date: 2023-10-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: code_statistics
|
@@ -201,6 +201,7 @@ files:
|
|
201
201
|
- exe/mockws
|
202
202
|
- lib/mockws.rb
|
203
203
|
- lib/mockws/cli.rb
|
204
|
+
- lib/mockws/crud_manager.rb
|
204
205
|
- lib/mockws/daemon_controller.rb
|
205
206
|
- lib/mockws/data_manager.rb
|
206
207
|
- lib/mockws/route_manager.rb
|