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.

Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  3. data/.github/dependabot.yml +25 -0
  4. data/.github/workflows/codeql.yml +76 -0
  5. data/.github/workflows/ruby.yml +42 -0
  6. data/.github/workflows/stale.yml +18 -0
  7. data/.gitignore +3 -0
  8. data/.rubocop.yml +38 -3
  9. data/.rubocop_todo.yml +28 -207
  10. data/CHANGELOG.md +28 -0
  11. data/README.md +8 -5
  12. data/Rakefile +60 -4
  13. data/docs/development.md +170 -0
  14. data/lib/oxidized/web/mig.rb +37 -47
  15. data/lib/oxidized/web/public/css/oxidized.css +59 -0
  16. data/lib/oxidized/web/public/scripts/oxidized.js +1 -12
  17. data/lib/oxidized/web/public/weblibs/bootstrap-icons.css +2078 -0
  18. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js +6314 -0
  19. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js.map +1 -0
  20. data/lib/oxidized/web/public/weblibs/bootstrap.css +12057 -0
  21. data/lib/oxidized/web/public/weblibs/bootstrap.css.map +1 -0
  22. data/lib/oxidized/web/public/weblibs/bootstrap.js +4494 -0
  23. data/lib/oxidized/web/public/weblibs/bootstrap.js.map +1 -0
  24. data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.css +398 -0
  25. data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.js +117 -0
  26. data/lib/oxidized/web/public/weblibs/buttons.colVis.js +256 -0
  27. data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.css +487 -0
  28. data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.js +147 -0
  29. data/lib/oxidized/web/public/weblibs/dataTables.buttons.js +2820 -0
  30. data/lib/oxidized/web/public/weblibs/dataTables.js +13171 -0
  31. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff +0 -0
  32. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff2 +0 -0
  33. data/lib/oxidized/web/public/weblibs/jquery.js +10716 -0
  34. data/lib/oxidized/web/version.rb +7 -0
  35. data/lib/oxidized/web/views/conf_search.haml +14 -13
  36. data/lib/oxidized/web/views/diffs.haml +5 -5
  37. data/lib/oxidized/web/views/footer.haml +5 -4
  38. data/lib/oxidized/web/views/head.haml +21 -7
  39. data/lib/oxidized/web/views/layout.haml +29 -34
  40. data/lib/oxidized/web/views/migration.haml +7 -0
  41. data/lib/oxidized/web/views/node.haml +10 -8
  42. data/lib/oxidized/web/views/nodes.haml +45 -35
  43. data/lib/oxidized/web/views/stats.haml +32 -24
  44. data/lib/oxidized/web/views/version.haml +8 -6
  45. data/lib/oxidized/web/views/versions.haml +23 -24
  46. data/lib/oxidized/web/webapp.rb +106 -87
  47. data/lib/oxidized/web.rb +10 -7
  48. data/oxidized-web.gemspec +28 -15
  49. data/package-lock.json +104 -0
  50. data/package.json +21 -0
  51. data/spec/node_spec.rb +143 -0
  52. data/spec/root_spec.rb +18 -0
  53. data/spec/spec_helper.rb +8 -0
  54. data/spec/webapp_spec.rb +28 -0
  55. metadata +187 -73
  56. data/lib/oxidized/web/public/css/bootstrap.min.css +0 -5
  57. data/lib/oxidized/web/public/css/buttons.bootstrap.min.css +0 -1
  58. data/lib/oxidized/web/public/css/dataTables.bootstrap.css +0 -299
  59. data/lib/oxidized/web/public/css/dataTables.colVis.css +0 -171
  60. data/lib/oxidized/web/public/css/oxidized_custom.css +0 -19
  61. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.eot +0 -0
  62. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.svg +0 -229
  63. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  64. data/lib/oxidized/web/public/fonts/glyphicons-halflings-regular.woff +0 -0
  65. data/lib/oxidized/web/public/images/diff_15x17.png +0 -0
  66. data/lib/oxidized/web/public/images/sort_asc.png +0 -0
  67. data/lib/oxidized/web/public/images/sort_asc_disabled.png +0 -0
  68. data/lib/oxidized/web/public/images/sort_both.png +0 -0
  69. data/lib/oxidized/web/public/images/sort_desc.png +0 -0
  70. data/lib/oxidized/web/public/images/sort_desc_disabled.png +0 -0
  71. data/lib/oxidized/web/public/images/versioning_18px.png +0 -0
  72. data/lib/oxidized/web/public/scripts/bootstrap.min.js +0 -6
  73. data/lib/oxidized/web/public/scripts/dataTables.bootstrap.js +0 -186
  74. data/lib/oxidized/web/public/scripts/dataTables.colVis.js +0 -1123
  75. data/lib/oxidized/web/public/scripts/jquery-2.1.1.min.js +0 -4
  76. data/lib/oxidized/web/public/scripts/jquery.dataTables.min.js +0 -157
  77. data/lib/oxidized/web/public/scripts/jquery.min.js +0 -6
  78. data/lib/oxidized/web/views/sass/oxidized.sass +0 -113
@@ -2,33 +2,42 @@ require 'sinatra/base'
2
2
  require 'sinatra/json'
3
3
  require 'sinatra/url_for'
4
4
  require 'tilt/haml'
5
- require 'sass'
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, Proc.new { File.join(root, 'public') }
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
- if node[params[:filter].to_sym] == params[:value]
23
- node[:status] = 'never'
24
- node[:time] = 'never'
25
- node[:group] = 'default' unless node[:group]
26
- if node[:last]
27
- node[:status] = node[:last][:status]
28
- node[:time] = node[:last][:end]
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
- nodes.load
75
- @data = 'reloaded list of nodes'
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
- get '/node/fetch/:node' do
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
- node, @json = route_parse :node
82
- @data = nodes.fetch node, nil
83
- rescue NodeNotFound => error
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
- get '/node/fetch/:group/:node' do
90
- node, @json = route_parse :node
91
- @data = nodes.fetch node, params[:group]
92
- out :text
93
- end
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
- begin
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/?:group?/:node' do
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 = Array.new
142
+ router_db_files = []
134
143
 
135
144
  i = 1
136
- while i <= number do
145
+ while i <= number
137
146
  router_db_files.push({ file: params["file#{i}"][:tempfile], group: params["group#{i}"] })
138
- i = i + 1
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
- detection = ::CharlockHolmes::EncodingDetector.detect(the_data)
181
- utf8_encoded_content = ::CharlockHolmes::Converter.convert the_data, detection[:encoding], 'UTF-8'
182
- @data = HTMLEntities.new.encode(utf8_encoded_content)
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
- if x[:oid].to_s == params[:oid2]
203
- oid2 = x[:oid]
204
- @info[:num2] = num
205
- break
206
- end
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 = ['null', 'null']
213
- if @data != 'no diffs' && @data != nil
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 template = :text
231
- if @json or params[:format] == '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 or params[:format] == '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
- def route_parse param
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
- e = param.split '.'
253
- else
254
- e = params[param].split '.'
255
- end
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 date
273
+ def time_from_now(date)
265
274
  if date
266
- # if the + is missing
267
- unless date.include? '+'
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
- date = "#{dd} days #{hh} hours ago"
278
- elsif hh.positive?
279
- date = "#{hh} hours #{mm} min ago"
280
- else
281
- date = "#{mm} min #{ss} sec ago"
282
- end
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 diff
295
+ def diff_view(diff)
289
296
  old_diff = []
290
297
  new_diff = []
291
298
 
292
- detection = ::CharlockHolmes::EncodingDetector.detect(diff)
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 /^\-/.match(line)
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
- for i in 0..[length_o, length_n].max
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 (/^\-.*/.match(old_diff[i])) && !(/^\+.*/.match(new_diff[i]))
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 = "&nbsp;\n"
317
320
  new_diff.insert(i, insert)
318
321
  length_n += 1
319
- elsif !(/^\-.*/.match(old_diff[i])) && (/^\+.*/.match(new_diff[i]))
320
- insert = 'empty_line'
322
+ elsif !/^-.*/.match(old_diff[i]) && /^\+.*/.match(new_diff[i])
321
323
  insert = "&nbsp;\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 = { '&' => '&amp;', '<' => '&lt;', '>' => '&gt;', '"' => '&quot;', "'" => '&#39;' }.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
- Rack::Handler::WEBrick = Rack::Handler.get(:puma)
9
- def initialize nodes, listen
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
- port, addr = addr, nil if not port
14
- uri = '/' + uri.to_s
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, @opts
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 = '0.13.0'
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.rubyforge_project = s.name
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.required_ruby_version = '>= 2.3'
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', '~> 5.0'
25
+ s.add_runtime_dependency 'haml', '~> 6.0'
20
26
  s.add_runtime_dependency 'htmlentities', '~> 4.3'
21
- s.add_runtime_dependency 'oxidized', '~> 0.26.0'
22
- s.add_runtime_dependency 'puma', '~> 3.11.4'
23
- s.add_runtime_dependency 'sass', '~> 3.3'
24
- s.add_runtime_dependency 'sinatra', '~> 1.4', '>= 1.4.6'
25
- s.add_runtime_dependency 'sinatra-contrib', '~> 1.4', '>= 1.4.6'
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.0'
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', '~> 10.0'
32
- s.add_development_dependency 'rubocop', '~> 0.65.0'
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
+ }