oxidized-web 0.13.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of oxidized-web might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
- data/.github/dependabot.yml +25 -0
- data/.github/workflows/codeql.yml +76 -0
- data/.github/workflows/ruby.yml +42 -0
- data/.github/workflows/stale.yml +18 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +38 -3
- data/.rubocop_todo.yml +28 -207
- data/CHANGELOG.md +28 -0
- data/README.md +8 -5
- data/Rakefile +60 -4
- data/docs/development.md +170 -0
- data/lib/oxidized/web/mig.rb +37 -47
- data/lib/oxidized/web/public/css/oxidized.css +59 -0
- data/lib/oxidized/web/public/scripts/oxidized.js +1 -12
- data/lib/oxidized/web/public/weblibs/bootstrap-icons.css +2078 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js +6314 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js.map +1 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.css +12057 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.css.map +1 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.js +4494 -0
- data/lib/oxidized/web/public/weblibs/bootstrap.js.map +1 -0
- data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.css +398 -0
- data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.js +117 -0
- data/lib/oxidized/web/public/weblibs/buttons.colVis.js +256 -0
- data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.css +487 -0
- data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.js +147 -0
- data/lib/oxidized/web/public/weblibs/dataTables.buttons.js +2820 -0
- data/lib/oxidized/web/public/weblibs/dataTables.js +13171 -0
- data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff +0 -0
- data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff2 +0 -0
- data/lib/oxidized/web/public/weblibs/jquery.js +10716 -0
- data/lib/oxidized/web/version.rb +7 -0
- data/lib/oxidized/web/views/conf_search.haml +14 -13
- data/lib/oxidized/web/views/diffs.haml +5 -5
- data/lib/oxidized/web/views/footer.haml +5 -4
- data/lib/oxidized/web/views/head.haml +21 -7
- data/lib/oxidized/web/views/layout.haml +29 -34
- data/lib/oxidized/web/views/migration.haml +7 -0
- data/lib/oxidized/web/views/node.haml +10 -8
- data/lib/oxidized/web/views/nodes.haml +45 -35
- data/lib/oxidized/web/views/stats.haml +32 -24
- data/lib/oxidized/web/views/version.haml +8 -6
- data/lib/oxidized/web/views/versions.haml +23 -24
- data/lib/oxidized/web/webapp.rb +106 -87
- data/lib/oxidized/web.rb +10 -7
- data/oxidized-web.gemspec +28 -15
- data/package-lock.json +104 -0
- data/package.json +21 -0
- data/spec/node_spec.rb +143 -0
- data/spec/root_spec.rb +18 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/webapp_spec.rb +28 -0
- metadata +187 -73
- data/lib/oxidized/web/public/css/bootstrap.min.css +0 -5
- data/lib/oxidized/web/public/css/buttons.bootstrap.min.css +0 -1
- data/lib/oxidized/web/public/css/dataTables.bootstrap.css +0 -299
- data/lib/oxidized/web/public/css/dataTables.colVis.css +0 -171
- data/lib/oxidized/web/public/css/oxidized_custom.css +0 -19
- data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.svg +0 -229
- data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/oxidized/web/public/images/diff_15x17.png +0 -0
- data/lib/oxidized/web/public/images/sort_asc.png +0 -0
- data/lib/oxidized/web/public/images/sort_asc_disabled.png +0 -0
- data/lib/oxidized/web/public/images/sort_both.png +0 -0
- data/lib/oxidized/web/public/images/sort_desc.png +0 -0
- data/lib/oxidized/web/public/images/sort_desc_disabled.png +0 -0
- data/lib/oxidized/web/public/images/versioning_18px.png +0 -0
- data/lib/oxidized/web/public/scripts/bootstrap.min.js +0 -6
- data/lib/oxidized/web/public/scripts/dataTables.bootstrap.js +0 -186
- data/lib/oxidized/web/public/scripts/dataTables.colVis.js +0 -1123
- data/lib/oxidized/web/public/scripts/jquery-2.1.1.min.js +0 -4
- data/lib/oxidized/web/public/scripts/jquery.dataTables.min.js +0 -157
- data/lib/oxidized/web/public/scripts/jquery.min.js +0 -6
- data/lib/oxidized/web/views/sass/oxidized.sass +0 -113
data/lib/oxidized/web/webapp.rb
CHANGED
@@ -2,33 +2,42 @@ require 'sinatra/base'
|
|
2
2
|
require 'sinatra/json'
|
3
3
|
require 'sinatra/url_for'
|
4
4
|
require 'tilt/haml'
|
5
|
-
|
5
|
+
# We need PP in node.haml, but rubocop can't see this
|
6
|
+
# rubocop:disable Lint/RedundantRequireStatement
|
6
7
|
require 'pp'
|
8
|
+
# rubocop:enable Lint/RedundantRequireStatement
|
7
9
|
require 'oxidized/web/mig'
|
8
10
|
require 'htmlentities'
|
9
11
|
require 'charlock_holmes'
|
10
12
|
module Oxidized
|
11
13
|
module API
|
14
|
+
require 'oxidized/web/version'
|
15
|
+
|
12
16
|
class WebApp < Sinatra::Base
|
13
17
|
helpers Sinatra::UrlForHelper
|
14
|
-
set :public_folder,
|
18
|
+
set :public_folder, proc { File.join(root, 'public') }
|
19
|
+
set :haml, { escape_html: false }
|
15
20
|
|
16
21
|
get '/' do
|
17
22
|
redirect url_for('/nodes')
|
18
23
|
end
|
19
24
|
|
25
|
+
get '/favicon.ico' do
|
26
|
+
redirect url_for('/images/favicon.ico')
|
27
|
+
end
|
28
|
+
|
20
29
|
get '/nodes/:filter/:value.?:format?' do
|
21
30
|
@data = nodes.list.select do |node|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
node
|
31
|
+
next unless node[params[:filter].to_sym] == params[:value]
|
32
|
+
|
33
|
+
node[:status] = 'never'
|
34
|
+
node[:time] = 'never'
|
35
|
+
node[:group] = 'default' unless node[:group]
|
36
|
+
if node[:last]
|
37
|
+
node[:status] = node[:last][:status]
|
38
|
+
node[:time] = node[:last][:end]
|
31
39
|
end
|
40
|
+
node
|
32
41
|
end
|
33
42
|
out :nodes
|
34
43
|
end
|
@@ -54,9 +63,7 @@ module Oxidized
|
|
54
63
|
nodes_list.each do |n|
|
55
64
|
node, @json = route_parse n[:name]
|
56
65
|
config = nodes.fetch node, n[:group]
|
57
|
-
if config[@to_research]
|
58
|
-
@nodes_match.push({ node: n[:name], full_name: n[:full_name] })
|
59
|
-
end
|
66
|
+
@nodes_match.push({ node: n[:name], full_name: n[:full_name] }) if config[@to_research]
|
60
67
|
end
|
61
68
|
@data = @nodes_match
|
62
69
|
out :conf_search
|
@@ -71,40 +78,42 @@ module Oxidized
|
|
71
78
|
end
|
72
79
|
|
73
80
|
get '/reload.?:format?' do
|
74
|
-
|
75
|
-
|
81
|
+
node = params[:node]
|
82
|
+
node ? (nodes.load node) : nodes.load
|
83
|
+
@data = node ? "reloaded #{node}" : 'reloaded list of nodes'
|
76
84
|
out
|
77
85
|
end
|
78
86
|
|
79
|
-
|
87
|
+
# URL: /node/fetch/<group>/<node>.json
|
88
|
+
# Gets the configuration of a node
|
89
|
+
# <group> is optional. If no group is given, nil will be passed to oxidized
|
90
|
+
# .json is optional. If given, will return the output in json format
|
91
|
+
get '/node/fetch/?*?/:node' do
|
92
|
+
node, @json = route_parse :node
|
93
|
+
group = params['splat'].first
|
94
|
+
group = nil if group.empty?
|
80
95
|
begin
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
@data = error.message
|
96
|
+
@data = nodes.fetch node, group
|
97
|
+
rescue NodeNotFound => e
|
98
|
+
@data = e.message
|
85
99
|
end
|
86
100
|
out :text
|
87
101
|
end
|
88
102
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
get '/node/next/?:group?/:node' do
|
103
|
+
# URL: /node/fetch/<group>/<node>.json
|
104
|
+
# <group> is optional, and not used
|
105
|
+
# .json is optional. If given, will return 'ok'
|
106
|
+
# if not, it redirects to /nodes
|
107
|
+
get '/node/next/?*?/:node' do
|
96
108
|
node, @json = route_parse :node
|
97
|
-
|
98
|
-
nodes.next node
|
99
|
-
rescue NodeNotFound
|
100
|
-
end
|
109
|
+
nodes.next node
|
101
110
|
redirect url_for('/nodes') unless @json
|
102
111
|
@data = 'ok'
|
103
112
|
out
|
104
113
|
end
|
105
114
|
|
106
115
|
# use this to attach author/email/message to commit
|
107
|
-
put '/node/next
|
116
|
+
put '/node/next/?*?/:node' do
|
108
117
|
node, @json = route_parse :node
|
109
118
|
opt = JSON.load request.body.read
|
110
119
|
nodes.next node, opt
|
@@ -130,12 +139,12 @@ module Oxidized
|
|
130
139
|
cloginrc_file = params['cloginrc'][:tempfile]
|
131
140
|
path_new_file = params['path_new_file']
|
132
141
|
|
133
|
-
router_db_files =
|
142
|
+
router_db_files = []
|
134
143
|
|
135
144
|
i = 1
|
136
|
-
while i <= number
|
145
|
+
while i <= number
|
137
146
|
router_db_files.push({ file: params["file#{i}"][:tempfile], group: params["group#{i}"] })
|
138
|
-
i
|
147
|
+
i += 1
|
139
148
|
end
|
140
149
|
|
141
150
|
migration = Mig.new(router_db_files, cloginrc_file, path_new_file)
|
@@ -143,10 +152,6 @@ module Oxidized
|
|
143
152
|
redirect url_for('//nodes')
|
144
153
|
end
|
145
154
|
|
146
|
-
get '/css/*.css' do
|
147
|
-
sass "sass/#{params[:splat].first}".to_sym
|
148
|
-
end
|
149
|
-
|
150
155
|
# show the lists of versions for a node
|
151
156
|
get '/node/version.?:format?' do
|
152
157
|
@data = nil
|
@@ -177,9 +182,12 @@ module Oxidized
|
|
177
182
|
}
|
178
183
|
|
179
184
|
the_data = nodes.get_version node, @info[:group], @info[:oid]
|
180
|
-
|
181
|
-
|
182
|
-
|
185
|
+
if params[:format] == 'json' || params[:format] == 'text'
|
186
|
+
@data = the_data
|
187
|
+
else
|
188
|
+
utf8_encoded_content = convert_to_utf8(the_data)
|
189
|
+
@data = HTMLEntities.new.encode(utf8_encoded_content)
|
190
|
+
end
|
183
191
|
out :version
|
184
192
|
end
|
185
193
|
|
@@ -187,11 +195,9 @@ module Oxidized
|
|
187
195
|
get '/node/version/diffs' do
|
188
196
|
node, @json = route_parse :node
|
189
197
|
@data = nil
|
190
|
-
@info = {node: node, group: params[:group], oid: params[:oid], date: params[:date], num: params[:num], num2: (params[:num].to_i - 1)}
|
198
|
+
@info = { node: node, group: params[:group], oid: params[:oid], date: params[:date], num: params[:num], num2: (params[:num].to_i - 1) }
|
191
199
|
group = nil
|
192
|
-
if @info[:group] != ''
|
193
|
-
group = @info[:group]
|
194
|
-
end
|
200
|
+
group = @info[:group] if @info[:group] != ''
|
195
201
|
@oids_dates = nodes.version node, group
|
196
202
|
if params[:oid2]
|
197
203
|
@info[:oid2] = params[:oid2]
|
@@ -199,18 +205,18 @@ module Oxidized
|
|
199
205
|
num = @oids_dates.count + 1
|
200
206
|
@oids_dates.each do |x|
|
201
207
|
num -= 1
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
208
|
+
next unless x[:oid].to_s == params[:oid2]
|
209
|
+
|
210
|
+
oid2 = x[:oid]
|
211
|
+
@info[:num2] = num
|
212
|
+
break
|
207
213
|
end
|
208
214
|
@data = nodes.get_diff node, @info[:group], @info[:oid], oid2
|
209
215
|
else
|
210
216
|
@data = nodes.get_diff node, @info[:group], @info[:oid], nil
|
211
217
|
end
|
212
|
-
@stat = [
|
213
|
-
if @data != 'no diffs' &&
|
218
|
+
@stat = %w[null null]
|
219
|
+
if @data != 'no diffs' && !@data.nil?
|
214
220
|
@stat = @data[:stat]
|
215
221
|
@data = @data[:patch]
|
216
222
|
else
|
@@ -227,14 +233,14 @@ module Oxidized
|
|
227
233
|
|
228
234
|
private
|
229
235
|
|
230
|
-
def out
|
231
|
-
if @json
|
236
|
+
def out(template = :text)
|
237
|
+
if @json || (params[:format] == 'json')
|
232
238
|
if @data.is_a?(String)
|
233
239
|
json @data.lines
|
234
240
|
else
|
235
241
|
json @data
|
236
242
|
end
|
237
|
-
elsif template == :text
|
243
|
+
elsif (template == :text) || (params[:format] == 'text')
|
238
244
|
content_type :text
|
239
245
|
@data
|
240
246
|
else
|
@@ -246,13 +252,16 @@ module Oxidized
|
|
246
252
|
settings.nodes
|
247
253
|
end
|
248
254
|
|
249
|
-
|
255
|
+
# checks if param ends with .json
|
256
|
+
# if so, returns param without ".json" and true
|
257
|
+
# if not, returns param and false
|
258
|
+
def route_parse(param)
|
250
259
|
json = false
|
251
|
-
if param.respond_to?(:to_str)
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
260
|
+
e = if param.respond_to?(:to_str)
|
261
|
+
param.split '.'
|
262
|
+
else
|
263
|
+
params[param].split '.'
|
264
|
+
end
|
256
265
|
if e.last == 'json'
|
257
266
|
e.pop
|
258
267
|
json = true
|
@@ -261,40 +270,37 @@ module Oxidized
|
|
261
270
|
end
|
262
271
|
|
263
272
|
# give the time enlapsed between now and a date
|
264
|
-
def time_from_now
|
273
|
+
def time_from_now(date)
|
265
274
|
if date
|
266
|
-
# if the + is missing
|
267
|
-
|
268
|
-
date.insert(21, '+')
|
269
|
-
end
|
275
|
+
# if the + or - is missing, insert +
|
276
|
+
date.insert(21, '+') unless date =~ /[-+]/
|
270
277
|
date = DateTime.parse date
|
271
278
|
now = DateTime.now.new_offset(0)
|
272
279
|
t = ((now - date) * 24 * 60 * 60).to_i
|
273
280
|
mm, ss = t.divmod(60)
|
274
281
|
hh, mm = mm.divmod(60)
|
275
282
|
dd, hh = hh.divmod(24)
|
276
|
-
if dd.positive?
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
+
date = if dd.positive?
|
284
|
+
"#{dd} days #{hh} hours ago"
|
285
|
+
elsif hh.positive?
|
286
|
+
"#{hh} hours #{mm} min ago"
|
287
|
+
else
|
288
|
+
"#{mm} min #{ss} sec ago"
|
289
|
+
end
|
283
290
|
end
|
284
291
|
date
|
285
292
|
end
|
286
293
|
|
287
294
|
# method the give diffs in separate view (the old and the new) as in github
|
288
|
-
def diff_view
|
295
|
+
def diff_view(diff)
|
289
296
|
old_diff = []
|
290
297
|
new_diff = []
|
291
298
|
|
292
|
-
|
293
|
-
utf8_encoded_content = ::CharlockHolmes::Converter.convert diff, detection[:encoding], 'UTF-8'
|
299
|
+
utf8_encoded_content = convert_to_utf8(diff)
|
294
300
|
HTMLEntities.new.encode(utf8_encoded_content).each_line do |line|
|
295
301
|
if /^\+/.match(line)
|
296
302
|
new_diff.push(line)
|
297
|
-
elsif
|
303
|
+
elsif /^-/.match(line)
|
298
304
|
old_diff.push(line)
|
299
305
|
else
|
300
306
|
new_diff.push(line)
|
@@ -304,20 +310,16 @@ module Oxidized
|
|
304
310
|
|
305
311
|
length_o = old_diff.count
|
306
312
|
length_n = new_diff.count
|
307
|
-
|
308
|
-
if i > [length_o, length_n].min
|
309
|
-
break
|
310
|
-
end
|
313
|
+
(0..[length_o, length_n].max).each do |i|
|
314
|
+
break if i > [length_o, length_n].min
|
311
315
|
|
312
|
-
if
|
316
|
+
if /^-.*/.match(old_diff[i]) && !/^\+.*/.match(new_diff[i])
|
313
317
|
# tag removed latter to add color syntax
|
314
|
-
insert = 'empty_line'
|
315
318
|
# ugly way to avoid asymmetry if at display the line takes 2 line on the screen
|
316
319
|
insert = " \n"
|
317
320
|
new_diff.insert(i, insert)
|
318
321
|
length_n += 1
|
319
|
-
elsif
|
320
|
-
insert = 'empty_line'
|
322
|
+
elsif !/^-.*/.match(old_diff[i]) && /^\+.*/.match(new_diff[i])
|
321
323
|
insert = " \n"
|
322
324
|
old_diff.insert(i, insert)
|
323
325
|
length_o += 1
|
@@ -325,6 +327,23 @@ module Oxidized
|
|
325
327
|
end
|
326
328
|
{ old_diff: old_diff, new_diff: new_diff }
|
327
329
|
end
|
330
|
+
|
331
|
+
# Taken von Haml 5.0, so it still works in 6.0
|
332
|
+
HTML_ESCAPE = { '&' => '&', '<' => '<', '>' => '>', '"' => '"', "'" => ''' }.freeze
|
333
|
+
HTML_ESCAPE_ONCE_REGEX = /['"><]|&(?!(?:[a-zA-Z]+|#(?:\d+|[xX][0-9a-fA-F]+));)/
|
334
|
+
def escape_once(text)
|
335
|
+
text = text.to_s
|
336
|
+
text.gsub(HTML_ESCAPE_ONCE_REGEX, HTML_ESCAPE)
|
337
|
+
end
|
338
|
+
|
339
|
+
def convert_to_utf8(text)
|
340
|
+
detection = ::CharlockHolmes::EncodingDetector.detect(text)
|
341
|
+
if detection[:type] == :text
|
342
|
+
::CharlockHolmes::Converter.convert text, detection[:encoding], 'UTF-8'
|
343
|
+
else
|
344
|
+
'The text contains binary values - cannot display'
|
345
|
+
end
|
346
|
+
end
|
328
347
|
end
|
329
348
|
end
|
330
349
|
end
|
data/lib/oxidized/web.rb
CHANGED
@@ -3,18 +3,21 @@ require 'json'
|
|
3
3
|
module Oxidized
|
4
4
|
module API
|
5
5
|
class Web
|
6
|
-
require 'rack/handler'
|
6
|
+
require 'rack/handler/puma'
|
7
7
|
attr_reader :thread
|
8
|
-
|
9
|
-
def initialize
|
8
|
+
|
9
|
+
def initialize(nodes, listen)
|
10
10
|
require 'oxidized/web/webapp'
|
11
11
|
listen, uri = listen.split '/'
|
12
12
|
addr, _, port = listen.rpartition ':'
|
13
|
-
|
14
|
-
|
13
|
+
unless port
|
14
|
+
port = addr
|
15
|
+
addr = nil
|
16
|
+
end
|
17
|
+
uri = "/#{uri}"
|
15
18
|
@opts = {
|
16
19
|
Host: addr,
|
17
|
-
Port: port
|
20
|
+
Port: port
|
18
21
|
}
|
19
22
|
WebApp.set :nodes, nodes
|
20
23
|
@app = Rack::Builder.new do
|
@@ -26,7 +29,7 @@ module Oxidized
|
|
26
29
|
|
27
30
|
def run
|
28
31
|
@thread = Thread.new do
|
29
|
-
Rack::Handler::Puma.run @app,
|
32
|
+
Rack::Handler::Puma.run @app, **@opts
|
30
33
|
exit!
|
31
34
|
end
|
32
35
|
end
|
data/oxidized-web.gemspec
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'oxidized/web/version'
|
4
|
+
|
1
5
|
Gem::Specification.new do |s|
|
2
6
|
s.name = 'oxidized-web'
|
3
|
-
s.version =
|
7
|
+
s.version = Oxidized::API::WEB_VERSION
|
4
8
|
s.licenses = %w[Apache-2.0]
|
5
9
|
s.platform = Gem::Platform::RUBY
|
6
10
|
s.authors = ['Saku Ytti', 'Samer Abdel-Hafez']
|
@@ -8,26 +12,35 @@ Gem::Specification.new do |s|
|
|
8
12
|
s.homepage = 'http://github.com/ytti/oxidized-web'
|
9
13
|
s.summary = 'sinatra API + webUI for oxidized'
|
10
14
|
s.description = 'puma+sinatra+haml webUI + REST API for oxidized'
|
11
|
-
s.
|
12
|
-
s.files = %x(git ls-files).split("\n")
|
15
|
+
s.files = %x(git ls-files -z).split("\x0")
|
13
16
|
s.executables = %w[]
|
14
17
|
s.require_path = 'lib'
|
15
18
|
|
16
|
-
s.
|
19
|
+
s.metadata['rubygems_mfa_required'] = 'true'
|
20
|
+
|
21
|
+
s.required_ruby_version = '>= 3.1'
|
22
|
+
|
17
23
|
s.add_runtime_dependency 'charlock_holmes', '~> 0.7.5'
|
18
24
|
s.add_runtime_dependency 'emk-sinatra-url-for', '~> 0.2'
|
19
|
-
s.add_runtime_dependency 'haml', '~>
|
25
|
+
s.add_runtime_dependency 'haml', '~> 6.0'
|
20
26
|
s.add_runtime_dependency 'htmlentities', '~> 4.3'
|
21
|
-
s.add_runtime_dependency '
|
22
|
-
s.add_runtime_dependency '
|
23
|
-
s.add_runtime_dependency '
|
24
|
-
s.add_runtime_dependency 'sinatra', '
|
25
|
-
s.add_runtime_dependency 'sinatra-contrib', '
|
26
|
-
s.add_runtime_dependency 'json', '>= 1.7.0'
|
27
|
-
s.add_runtime_dependency 'rack-test', '~> 0.7.0'
|
27
|
+
s.add_runtime_dependency 'json', '~> 2.3'
|
28
|
+
s.add_runtime_dependency 'oxidized', '~> 0.26'
|
29
|
+
s.add_runtime_dependency 'puma', '>= 3.11.4', '< 6.5.0'
|
30
|
+
s.add_runtime_dependency 'sinatra', '>= 1.4.6', '< 5.0'
|
31
|
+
s.add_runtime_dependency 'sinatra-contrib', '>= 1.4.6', '< 5.0'
|
28
32
|
|
29
|
-
s.add_development_dependency 'bundler', '~> 2.
|
33
|
+
s.add_development_dependency 'bundler', '~> 2.2'
|
34
|
+
s.add_development_dependency 'minitest', '~> 5.18'
|
35
|
+
s.add_development_dependency 'mocha', '~> 2.1'
|
36
|
+
s.add_development_dependency 'rack-test', '~> 2.1'
|
30
37
|
s.add_development_dependency 'rails_best_practices', '~> 1.19'
|
31
|
-
s.add_development_dependency 'rake', '~>
|
32
|
-
s.add_development_dependency 'rubocop', '~>
|
38
|
+
s.add_development_dependency 'rake', '~> 13.0'
|
39
|
+
s.add_development_dependency 'rubocop', '~> 1.64.1'
|
40
|
+
s.add_development_dependency 'rubocop-minitest', '~> 0.35.0'
|
41
|
+
s.add_development_dependency 'rubocop-rails', '~> 2.25.0'
|
42
|
+
s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
43
|
+
s.add_development_dependency 'simplecov', '~> 0.22.0'
|
44
|
+
s.add_development_dependency 'simplecov-cobertura', '~> 2.1.0'
|
45
|
+
s.add_development_dependency 'simplecov-html', '~> 0.12.3'
|
33
46
|
end
|
data/package-lock.json
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
{
|
2
|
+
"name": "oxidized-web",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"lockfileVersion": 3,
|
5
|
+
"requires": true,
|
6
|
+
"packages": {
|
7
|
+
"": {
|
8
|
+
"name": "oxidized-web",
|
9
|
+
"version": "1.0.0",
|
10
|
+
"license": "Apache 2.0",
|
11
|
+
"dependencies": {
|
12
|
+
"bootstrap": "^5.3.3",
|
13
|
+
"bootstrap-icons": "^1.11.3",
|
14
|
+
"datatables.net-bs5": "^2.0.7",
|
15
|
+
"datatables.net-buttons-bs5": "^3.0.2",
|
16
|
+
"jquery": "^3.7.1"
|
17
|
+
}
|
18
|
+
},
|
19
|
+
"node_modules/@popperjs/core": {
|
20
|
+
"version": "2.11.8",
|
21
|
+
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
22
|
+
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
|
23
|
+
"peer": true,
|
24
|
+
"funding": {
|
25
|
+
"type": "opencollective",
|
26
|
+
"url": "https://opencollective.com/popperjs"
|
27
|
+
}
|
28
|
+
},
|
29
|
+
"node_modules/bootstrap": {
|
30
|
+
"version": "5.3.3",
|
31
|
+
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
|
32
|
+
"integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
|
33
|
+
"funding": [
|
34
|
+
{
|
35
|
+
"type": "github",
|
36
|
+
"url": "https://github.com/sponsors/twbs"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"type": "opencollective",
|
40
|
+
"url": "https://opencollective.com/bootstrap"
|
41
|
+
}
|
42
|
+
],
|
43
|
+
"peerDependencies": {
|
44
|
+
"@popperjs/core": "^2.11.8"
|
45
|
+
}
|
46
|
+
},
|
47
|
+
"node_modules/bootstrap-icons": {
|
48
|
+
"version": "1.11.3",
|
49
|
+
"resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz",
|
50
|
+
"integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==",
|
51
|
+
"funding": [
|
52
|
+
{
|
53
|
+
"type": "github",
|
54
|
+
"url": "https://github.com/sponsors/twbs"
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"type": "opencollective",
|
58
|
+
"url": "https://opencollective.com/bootstrap"
|
59
|
+
}
|
60
|
+
]
|
61
|
+
},
|
62
|
+
"node_modules/datatables.net": {
|
63
|
+
"version": "2.0.8",
|
64
|
+
"resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-2.0.8.tgz",
|
65
|
+
"integrity": "sha512-4/2dYx4vl975zQqZbyoVEm0huPe61qffjBRby7K7V+y9E+ORq4R8KavkgrNMmIgO6cl85Pg4AvCbVjvPCIT1Yg==",
|
66
|
+
"dependencies": {
|
67
|
+
"jquery": ">=1.7"
|
68
|
+
}
|
69
|
+
},
|
70
|
+
"node_modules/datatables.net-bs5": {
|
71
|
+
"version": "2.0.8",
|
72
|
+
"resolved": "https://registry.npmjs.org/datatables.net-bs5/-/datatables.net-bs5-2.0.8.tgz",
|
73
|
+
"integrity": "sha512-rpz/yO2NZMP1Uso/sSsaFAKwdCjYPa1/KLxAVr0JNJJV9ygFLHcuKTcNmoc1cekcsjYcGyybWKaNu4NfpZ74vg==",
|
74
|
+
"dependencies": {
|
75
|
+
"datatables.net": "2.0.8",
|
76
|
+
"jquery": ">=1.7"
|
77
|
+
}
|
78
|
+
},
|
79
|
+
"node_modules/datatables.net-buttons": {
|
80
|
+
"version": "3.0.2",
|
81
|
+
"resolved": "https://registry.npmjs.org/datatables.net-buttons/-/datatables.net-buttons-3.0.2.tgz",
|
82
|
+
"integrity": "sha512-J+vk4hLtTivnl+RxzpKPE7CG4ggdgHPQcHnpqViy9w6ia18Uh69dQktX6NJ87QrqNPCTMUyHDzUzsRFURG4/Fw==",
|
83
|
+
"dependencies": {
|
84
|
+
"datatables.net": "^2",
|
85
|
+
"jquery": ">=1.7"
|
86
|
+
}
|
87
|
+
},
|
88
|
+
"node_modules/datatables.net-buttons-bs5": {
|
89
|
+
"version": "3.0.2",
|
90
|
+
"resolved": "https://registry.npmjs.org/datatables.net-buttons-bs5/-/datatables.net-buttons-bs5-3.0.2.tgz",
|
91
|
+
"integrity": "sha512-whufHsfKgzzdmTqM7JnFUph5hveHTCAvs9N0CP+5t7k7sIr7b94rIxv22/2Wt4veLcd3v73NdhPWl4j/GfzyhA==",
|
92
|
+
"dependencies": {
|
93
|
+
"datatables.net-bs5": "^2",
|
94
|
+
"datatables.net-buttons": "3.0.2",
|
95
|
+
"jquery": ">=1.7"
|
96
|
+
}
|
97
|
+
},
|
98
|
+
"node_modules/jquery": {
|
99
|
+
"version": "3.7.1",
|
100
|
+
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
|
101
|
+
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
data/package.json
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"name": "oxidized-web",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "NPM Projekt to get dependent js and css libs",
|
5
|
+
"main": "index.js",
|
6
|
+
"directories": {
|
7
|
+
"lib": "lib"
|
8
|
+
},
|
9
|
+
"scripts": {
|
10
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
11
|
+
},
|
12
|
+
"author": "The oxidized project",
|
13
|
+
"license": "Apache 2.0",
|
14
|
+
"dependencies": {
|
15
|
+
"bootstrap": "^5.3.3",
|
16
|
+
"bootstrap-icons": "^1.11.3",
|
17
|
+
"datatables.net-bs5": "^2.0.7",
|
18
|
+
"datatables.net-buttons-bs5": "^3.0.2",
|
19
|
+
"jquery": "^3.7.1"
|
20
|
+
}
|
21
|
+
}
|