bootstrap-propshaft 5.3.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.
- checksums.yaml +7 -0
- data/.gitattributes +14 -0
- data/.github/workflows/ci.yml +61 -0
- data/.gitignore +19 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +12 -0
- data/LICENSE +21 -0
- data/README.md +138 -0
- data/Rakefile +89 -0
- data/assets/javascripts/bootstrap/alert.js +89 -0
- data/assets/javascripts/bootstrap/base-component.js +83 -0
- data/assets/javascripts/bootstrap/button.js +78 -0
- data/assets/javascripts/bootstrap/carousel.js +387 -0
- data/assets/javascripts/bootstrap/collapse.js +248 -0
- data/assets/javascripts/bootstrap/dom/data.js +62 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
- data/assets/javascripts/bootstrap/dropdown.js +401 -0
- data/assets/javascripts/bootstrap/modal.js +319 -0
- data/assets/javascripts/bootstrap/offcanvas.js +245 -0
- data/assets/javascripts/bootstrap/popover.js +95 -0
- data/assets/javascripts/bootstrap/scrollspy.js +274 -0
- data/assets/javascripts/bootstrap/tab.js +284 -0
- data/assets/javascripts/bootstrap/toast.js +198 -0
- data/assets/javascripts/bootstrap/tooltip.js +545 -0
- data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
- data/assets/javascripts/bootstrap/util/config.js +67 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
- data/assets/javascripts/bootstrap/util/index.js +281 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
- data/assets/javascripts/bootstrap/util/swipe.js +134 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +28 -0
- data/assets/javascripts/bootstrap.js +4493 -0
- data/assets/javascripts/bootstrap.min.js +6 -0
- data/assets/stylesheets/_bootstrap-grid.scss +62 -0
- data/assets/stylesheets/_bootstrap-reboot.scss +10 -0
- data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
- data/assets/stylesheets/_bootstrap.scss +52 -0
- data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
- data/assets/stylesheets/bootstrap/_alert.scss +68 -0
- data/assets/stylesheets/bootstrap/_badge.scss +38 -0
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +40 -0
- data/assets/stylesheets/bootstrap/_button-group.scss +142 -0
- data/assets/stylesheets/bootstrap/_buttons.scss +207 -0
- data/assets/stylesheets/bootstrap/_card.scss +239 -0
- data/assets/stylesheets/bootstrap/_carousel.scss +244 -0
- data/assets/stylesheets/bootstrap/_close.scss +63 -0
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +250 -0
- data/assets/stylesheets/bootstrap/_forms.scss +9 -0
- data/assets/stylesheets/bootstrap/_functions.scss +302 -0
- data/assets/stylesheets/bootstrap/_grid.scss +39 -0
- data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
- data/assets/stylesheets/bootstrap/_images.scss +42 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +197 -0
- data/assets/stylesheets/bootstrap/_maps.scss +174 -0
- data/assets/stylesheets/bootstrap/_mixins.scss +42 -0
- data/assets/stylesheets/bootstrap/_modal.scss +237 -0
- data/assets/stylesheets/bootstrap/_nav.scss +197 -0
- data/assets/stylesheets/bootstrap/_navbar.scss +289 -0
- data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +109 -0
- data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
- data/assets/stylesheets/bootstrap/_popover.scss +196 -0
- data/assets/stylesheets/bootstrap/_progress.scss +68 -0
- data/assets/stylesheets/bootstrap/_reboot.scss +611 -0
- data/assets/stylesheets/bootstrap/_root.scss +187 -0
- data/assets/stylesheets/bootstrap/_spinners.scss +85 -0
- data/assets/stylesheets/bootstrap/_tables.scss +171 -0
- data/assets/stylesheets/bootstrap/_toasts.scss +73 -0
- data/assets/stylesheets/bootstrap/_tooltip.scss +119 -0
- data/assets/stylesheets/bootstrap/_transitions.scss +27 -0
- data/assets/stylesheets/bootstrap/_type.scss +106 -0
- data/assets/stylesheets/bootstrap/_utilities.scss +806 -0
- data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
- data/assets/stylesheets/bootstrap/_variables.scss +1747 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +95 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_clearfix.scss +3 -0
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
- data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +18 -0
- data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +78 -0
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +18 -0
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +127 -0
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +70 -0
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +69 -0
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
- data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +153 -0
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +47 -0
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +151 -0
- data/assets/stylesheets/bootstrap/mixins/_image.scss +16 -0
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +26 -0
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +10 -0
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +17 -0
- data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
- data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +26 -0
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +348 -0
- data/bootstrap.gemspec +39 -0
- data/lib/bootstrap/engine.rb +22 -0
- data/lib/bootstrap/version.rb +6 -0
- data/lib/bootstrap.rb +75 -0
- data/tasks/updater/js.rb +92 -0
- data/tasks/updater/logger.rb +57 -0
- data/tasks/updater/network.rb +109 -0
- data/tasks/updater/scss.rb +26 -0
- data/tasks/updater.rb +67 -0
- data/test/dummy_rails/README.rdoc +3 -0
- data/test/dummy_rails/Rakefile +6 -0
- data/test/dummy_rails/app/assets/config/manifest.js +3 -0
- data/test/dummy_rails/app/assets/images/.keep +0 -0
- data/test/dummy_rails/app/assets/javascripts/application.js +8 -0
- data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
- data/test/dummy_rails/app/assets/stylesheets/application.sass +4 -0
- data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
- data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
- data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
- data/test/dummy_rails/app/views/layouts/application.html.erb +16 -0
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +32 -0
- data/test/dummy_rails/config/boot.rb +5 -0
- data/test/dummy_rails/config/environment.rb +5 -0
- data/test/dummy_rails/config/environments/development.rb +23 -0
- data/test/dummy_rails/config/environments/production.rb +82 -0
- data/test/dummy_rails/config/environments/test.rb +38 -0
- data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy_rails/config/initializers/inflections.rb +16 -0
- data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
- data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
- data/test/dummy_rails/config/initializers/session_store.rb +3 -0
- data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy_rails/config/locales/en.yml +3 -0
- data/test/dummy_rails/config/locales/es.yml +3 -0
- data/test/dummy_rails/config/routes.rb +3 -0
- data/test/dummy_rails/config.ru +4 -0
- data/test/dummy_rails/log/.keep +0 -0
- data/test/gemfiles/rails_4_2.gemfile +7 -0
- data/test/gemfiles/rails_5_0.gemfile +8 -0
- data/test/gemfiles/rails_5_1.gemfile +8 -0
- data/test/gemfiles/rails_5_2.gemfile +8 -0
- data/test/gemfiles/rails_6_0.gemfile +8 -0
- data/test/gemfiles/rails_6_1.gemfile +8 -0
- data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
- data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
- data/test/rails_test.rb +24 -0
- data/test/support/dummy_rails_integration.rb +31 -0
- data/test/support/reporting.rb +27 -0
- data/test/test_helper.rb +42 -0
- data/test/test_helper_rails.rb +6 -0
- metadata +471 -0
data/tasks/updater/js.rb
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require 'tsort'
|
|
3
|
+
|
|
4
|
+
class Updater
|
|
5
|
+
module Js
|
|
6
|
+
INLINED_SRCS = %w[].freeze
|
|
7
|
+
|
|
8
|
+
def update_javascript_assets
|
|
9
|
+
log_status 'Updating javascripts...'
|
|
10
|
+
save_to = @save_to[:js]
|
|
11
|
+
read_files('js/dist', bootstrap_js_files).each do |name, content|
|
|
12
|
+
save_file("#{save_to}/#{name}", remove_source_mapping_url(content))
|
|
13
|
+
end
|
|
14
|
+
log_processed "#{bootstrap_js_files * ' '}"
|
|
15
|
+
|
|
16
|
+
log_status 'Updating javascript manifest'
|
|
17
|
+
manifest = "//= require ./bootstrap-global-this-define\n"
|
|
18
|
+
bootstrap_js_files.each do |name|
|
|
19
|
+
name = name.gsub(/\.js$/, '')
|
|
20
|
+
manifest << "//= require ./bootstrap/#{name}\n"
|
|
21
|
+
end
|
|
22
|
+
manifest << "//= require ./bootstrap-global-this-undefine\n"
|
|
23
|
+
dist_js = read_files('dist/js', %w(bootstrap.js bootstrap.min.js))
|
|
24
|
+
{
|
|
25
|
+
'assets/javascripts/bootstrap-global-this-define.js' => <<~JS,
|
|
26
|
+
// Set a `globalThis` so that bootstrap components are defined on window.bootstrap instead of window.
|
|
27
|
+
window['bootstrap'] = {
|
|
28
|
+
"@popperjs/core": window.Popper,
|
|
29
|
+
_originalGlobalThis: window['globalThis']
|
|
30
|
+
};
|
|
31
|
+
window['globalThis'] = window['bootstrap'];
|
|
32
|
+
JS
|
|
33
|
+
'assets/javascripts/bootstrap-global-this-undefine.js' => <<~JS,
|
|
34
|
+
window['globalThis'] = window['bootstrap']._originalGlobalThis;
|
|
35
|
+
window['bootstrap']._originalGlobalThis = null;
|
|
36
|
+
JS
|
|
37
|
+
'assets/javascripts/bootstrap-sprockets.js' => manifest,
|
|
38
|
+
'assets/javascripts/bootstrap.js' => dist_js['bootstrap.js'],
|
|
39
|
+
'assets/javascripts/bootstrap.min.js' => dist_js['bootstrap.min.js'],
|
|
40
|
+
}.each do |path, content|
|
|
41
|
+
save_file path, remove_source_mapping_url(content)
|
|
42
|
+
log_processed path
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def bootstrap_js_files
|
|
47
|
+
@bootstrap_js_files ||= begin
|
|
48
|
+
src_files = get_paths_by_type('js/src', /\.js$/) - INLINED_SRCS
|
|
49
|
+
puts "src_files: #{src_files.inspect}"
|
|
50
|
+
imports = Deps.new
|
|
51
|
+
# Get the imports from the ES6 files to order requires correctly.
|
|
52
|
+
read_files('js/src', src_files).each do |name, content|
|
|
53
|
+
file_imports = content.scan(%r{import *(?:[a-zA-Z]*|\{[a-zA-Z ,]*\}) *from '([\w/.-]+)}).flatten(1).map do |f|
|
|
54
|
+
Pathname.new(name).dirname.join(f).cleanpath.to_s
|
|
55
|
+
end.uniq
|
|
56
|
+
imports.add name, *(file_imports - INLINED_SRCS)
|
|
57
|
+
end
|
|
58
|
+
imports.tsort
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def remove_source_mapping_url(content)
|
|
63
|
+
content.sub(%r{^//# sourceMappingURL=.*\n?\z}, '')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class Deps
|
|
67
|
+
include TSort
|
|
68
|
+
|
|
69
|
+
def initialize
|
|
70
|
+
@imports = {}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def add(from, *tos)
|
|
74
|
+
imports = (@imports[from] ||= [])
|
|
75
|
+
imports.push(*tos)
|
|
76
|
+
imports.sort!
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def tsort_each_child(node, &block)
|
|
80
|
+
node_imports = @imports[node]
|
|
81
|
+
if node_imports.nil?
|
|
82
|
+
raise "No imports found for #{node.inspect}\nImports:\n#{@imports.inspect}"
|
|
83
|
+
end
|
|
84
|
+
node_imports.each(&block)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def tsort_each_node(&block)
|
|
88
|
+
@imports.each_key(&block)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
class Updater
|
|
2
|
+
class Logger
|
|
3
|
+
include Term::ANSIColor
|
|
4
|
+
|
|
5
|
+
def log_status(status)
|
|
6
|
+
puts bold status
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def log_file_info(s)
|
|
10
|
+
puts " #{magenta s}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def log_transform(*args, from: caller[1][/`.*'/][1..-2].sub(/^block in /, ''))
|
|
14
|
+
puts " #{cyan from}#{cyan ": #{args * ', '}" unless args.empty?}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def log_processing(name)
|
|
18
|
+
puts yellow " #{File.basename(name)}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def log_processed(name)
|
|
22
|
+
puts green " #{name}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def log_http_get_file(url, cached = false)
|
|
26
|
+
s = " #{'CACHED ' if cached}GET #{url}..."
|
|
27
|
+
if cached
|
|
28
|
+
puts dark green s
|
|
29
|
+
else
|
|
30
|
+
puts dark cyan s
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def log_http_get_files(files, from, cached = false)
|
|
35
|
+
return if files.empty?
|
|
36
|
+
s = " #{'CACHED ' if cached}GET #{files.length} files from #{from} #{files * ' '}..."
|
|
37
|
+
if cached
|
|
38
|
+
puts dark green s
|
|
39
|
+
else
|
|
40
|
+
puts dark cyan s
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def puts(*args)
|
|
45
|
+
STDERR.puts *args unless @silence
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
alias log puts
|
|
49
|
+
|
|
50
|
+
def silence_log
|
|
51
|
+
@silence = true
|
|
52
|
+
yield
|
|
53
|
+
ensure
|
|
54
|
+
@silence = false
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
class Updater
|
|
3
|
+
module Network
|
|
4
|
+
protected
|
|
5
|
+
|
|
6
|
+
WRITE_FILES_MUTEX = Mutex.new
|
|
7
|
+
|
|
8
|
+
def get_paths_by_type(dir, file_re, recursive = true)
|
|
9
|
+
get_file_paths(dir, recursive).select { |path| path =~ file_re }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def get_file_paths(dir, recursive = true)
|
|
13
|
+
get_tree(get_tree_sha(dir), recursive)['tree'].select { |f| f['type'] == 'blob' }.map { |f| f['path'] }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def file_url(path)
|
|
17
|
+
"https://raw.githubusercontent.com/#@repo/#@branch_sha/#{path}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def read_files(path, files)
|
|
21
|
+
path_url = file_url path
|
|
22
|
+
contents = read_cached_files(path, files)
|
|
23
|
+
log_http_get_files contents.keys, path_url, true if contents.keys
|
|
24
|
+
files -= contents.keys
|
|
25
|
+
log_http_get_files files, path_url, false
|
|
26
|
+
files.map do |name|
|
|
27
|
+
Thread.start {
|
|
28
|
+
begin
|
|
29
|
+
url = "#{path_url}/#{name}"
|
|
30
|
+
contents[name] = URI.open(url).read
|
|
31
|
+
rescue Exception => e
|
|
32
|
+
log "Error downloading #{url}: #{e}"
|
|
33
|
+
exit 1
|
|
34
|
+
end
|
|
35
|
+
WRITE_FILES_MUTEX.synchronize { write_cached_files path, name => contents[name] }
|
|
36
|
+
}
|
|
37
|
+
end.each(&:join)
|
|
38
|
+
contents
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def read_cached_files(path, files)
|
|
42
|
+
full_path = "#@cache_path/#@branch_sha/#{path}"
|
|
43
|
+
contents = {}
|
|
44
|
+
if File.directory?(full_path)
|
|
45
|
+
files.each do |name|
|
|
46
|
+
path = "#{full_path}/#{name}"
|
|
47
|
+
contents[name] = File.read(path, mode: 'rb') if File.exist?(path)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
contents
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def write_cached_files(path, files)
|
|
54
|
+
full_path = "./#@cache_path/#@branch_sha/#{path}"
|
|
55
|
+
files.each do |name, content|
|
|
56
|
+
FileUtils.mkdir_p File.dirname(File.join(full_path, name))
|
|
57
|
+
File.open("#{full_path}/#{name}", 'wb') { |f| f.write content }
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_file(url)
|
|
63
|
+
uri = URI(url)
|
|
64
|
+
cache_path = "./#@cache_path#{uri.path}#{uri.query.tr('?&=', '-') if uri.query}"
|
|
65
|
+
FileUtils.mkdir_p File.dirname(cache_path)
|
|
66
|
+
if File.exist?(cache_path)
|
|
67
|
+
log_http_get_file url, true
|
|
68
|
+
File.read(cache_path, mode: 'rb')
|
|
69
|
+
else
|
|
70
|
+
log_http_get_file url, false
|
|
71
|
+
content = URI.open(url).read
|
|
72
|
+
File.open(cache_path, 'wb') { |f| f.write content }
|
|
73
|
+
content
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# get sha of the branch (= the latest commit)
|
|
78
|
+
def get_branch_sha
|
|
79
|
+
@branch_sha ||= begin
|
|
80
|
+
if @branch =~ /\A[0-9a-f]{40,}\z/
|
|
81
|
+
@branch
|
|
82
|
+
else
|
|
83
|
+
cmd = "git ls-remote #{Shellwords.escape "https://github.com/#@repo"} #@branch"
|
|
84
|
+
log cmd
|
|
85
|
+
result = %x[#{cmd}]
|
|
86
|
+
raise 'Could not get branch sha!' unless $?.success? && !result.empty?
|
|
87
|
+
result.split(/\s+/).first
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Get the sha of a dir
|
|
93
|
+
def get_tree_sha(dir, tree = get_trees)
|
|
94
|
+
tree['tree'].find { |t| t['path'] == dir }['sha']
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def get_trees
|
|
98
|
+
@trees ||= get_tree(@branch_sha)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def get_tree(sha, recursive = true)
|
|
102
|
+
get_json("https://api.github.com/repos/#@repo/git/trees/#{sha}#{'?recursive=1' if recursive}")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def get_json(url)
|
|
106
|
+
JSON.parse get_file(url)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class Updater
|
|
2
|
+
module Scss
|
|
3
|
+
def update_scss_assets
|
|
4
|
+
log_status 'Updating scss...'
|
|
5
|
+
save_to = @save_to[:scss]
|
|
6
|
+
contents = {}
|
|
7
|
+
bootstrap_scss_files = get_paths_by_type('scss', /\.scss$/).reject { |p| p.start_with?('tests/') }
|
|
8
|
+
read_files('scss', bootstrap_scss_files).each do |name, file|
|
|
9
|
+
contents[name] = file
|
|
10
|
+
save_file("#{save_to}/#{name}", file)
|
|
11
|
+
end
|
|
12
|
+
log_processed "#{bootstrap_scss_files * ' '}"
|
|
13
|
+
|
|
14
|
+
log_status 'Updating scss main files'
|
|
15
|
+
%w(bootstrap bootstrap-grid bootstrap-reboot bootstrap-utilities).each do |name|
|
|
16
|
+
# Compass treats non-partials as targets to copy into the main project, so make them partials.
|
|
17
|
+
# Also move them up a level to clearly indicate entry points.
|
|
18
|
+
from = "#{save_to}/#{name}.scss"
|
|
19
|
+
to = "#{save_to}/../_#{name}.scss"
|
|
20
|
+
FileUtils.mv from, to
|
|
21
|
+
# As we moved the files, adjust imports accordingly.
|
|
22
|
+
File.write to, File.read(to).gsub(/ "/, ' "bootstrap/')
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/tasks/updater.rb
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'json'
|
|
5
|
+
require 'strscan'
|
|
6
|
+
require 'forwardable'
|
|
7
|
+
require 'term/ansicolor'
|
|
8
|
+
require 'fileutils'
|
|
9
|
+
|
|
10
|
+
require_relative 'updater/scss'
|
|
11
|
+
require_relative 'updater/js'
|
|
12
|
+
require_relative 'updater/logger'
|
|
13
|
+
require_relative 'updater/network'
|
|
14
|
+
|
|
15
|
+
class Updater
|
|
16
|
+
extend Forwardable
|
|
17
|
+
include Network
|
|
18
|
+
include Js
|
|
19
|
+
include Scss
|
|
20
|
+
|
|
21
|
+
def initialize(repo: 'twbs/bootstrap', branch: 'main', save_to: {}, cache_path: 'tmp/bootstrap-cache')
|
|
22
|
+
@logger = Logger.new
|
|
23
|
+
@repo = repo
|
|
24
|
+
@branch = branch || 'main'
|
|
25
|
+
@branch_sha = get_branch_sha
|
|
26
|
+
@cache_path = cache_path
|
|
27
|
+
@repo_url = "https://github.com/#@repo"
|
|
28
|
+
@save_to = {
|
|
29
|
+
js: 'assets/javascripts/bootstrap',
|
|
30
|
+
scss: 'assets/stylesheets/bootstrap'}.merge(save_to)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def_delegators :@logger, :log, :log_status, :log_processing, :log_transform, :log_file_info, :log_processed, :log_http_get_file, :log_http_get_files, :silence_log
|
|
34
|
+
|
|
35
|
+
def update_bootstrap
|
|
36
|
+
log_status 'Updating Bootstrap'
|
|
37
|
+
puts " repo : #@repo_url"
|
|
38
|
+
puts " branch : #@branch_sha #@repo_url/tree/#@branch"
|
|
39
|
+
puts " save to: #{@save_to.to_json}"
|
|
40
|
+
puts " twbs cache: #{@cache_path}"
|
|
41
|
+
puts '-' * 60
|
|
42
|
+
|
|
43
|
+
FileUtils.rm_rf('assets')
|
|
44
|
+
@save_to.each { |_, v| FileUtils.mkdir_p(v) }
|
|
45
|
+
|
|
46
|
+
update_scss_assets
|
|
47
|
+
update_javascript_assets
|
|
48
|
+
store_version
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def save_file(path, content, mode='w')
|
|
52
|
+
dir = File.dirname(path)
|
|
53
|
+
FileUtils.mkdir_p(dir) unless File.directory?(dir)
|
|
54
|
+
File.open(path, mode) { |file| file.write(content) }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def upstream_version
|
|
58
|
+
@upstream_version ||= get_json(file_url 'package.json')['version']
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Update version.rb file with BOOTSTRAP_SHA
|
|
62
|
+
def store_version
|
|
63
|
+
path = 'lib/bootstrap/version.rb'
|
|
64
|
+
content = File.read(path).sub(/BOOTSTRAP_SHA\s*=\s*['"][^'"]*['"]/, "BOOTSTRAP_SHA = '#@branch_sha'")
|
|
65
|
+
File.open(path, 'w') { |f| f.write(content) }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Chrome >= 25
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>bootstrap Dummy App</title>
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
7
|
+
<%= stylesheet_link_tag 'application', media: "all", 'data-turbolinks-track' => true %>
|
|
8
|
+
<%= csrf_meta_tags %>
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<%= yield %>
|
|
13
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
|
14
|
+
</body>
|
|
15
|
+
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
|
2
|
+
<div class="container-fluid">
|
|
3
|
+
<a class="navbar-brand" href="#">Navbar</a>
|
|
4
|
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
|
|
5
|
+
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
|
6
|
+
<span class="navbar-toggler-icon"></span>
|
|
7
|
+
</button>
|
|
8
|
+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
|
9
|
+
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
|
10
|
+
<li class="nav-item">
|
|
11
|
+
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
|
12
|
+
</li>
|
|
13
|
+
<li class="nav-item">
|
|
14
|
+
<a class="nav-link" href="#">Link</a>
|
|
15
|
+
</li>
|
|
16
|
+
<li class="nav-item dropdown">
|
|
17
|
+
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown"
|
|
18
|
+
aria-expanded="false">
|
|
19
|
+
Dropdown
|
|
20
|
+
</a>
|
|
21
|
+
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
|
|
22
|
+
<li><a class="dropdown-item" href="#">Action</a></li>
|
|
23
|
+
<li><a class="dropdown-item" href="#">Another action</a></li>
|
|
24
|
+
<li>
|
|
25
|
+
<hr class="dropdown-divider">
|
|
26
|
+
</li>
|
|
27
|
+
<li><a class="dropdown-item" href="#">Something else here</a></li>
|
|
28
|
+
</ul>
|
|
29
|
+
</li>
|
|
30
|
+
<li class="nav-item">
|
|
31
|
+
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
|
|
32
|
+
</li>
|
|
33
|
+
</ul>
|
|
34
|
+
<form class="d-flex">
|
|
35
|
+
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
|
|
36
|
+
<button class="btn btn-outline-success" type="submit">Search</button>
|
|
37
|
+
</form>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</nav>
|
|
41
|
+
|
|
42
|
+
<div class="container">
|
|
43
|
+
<div class="row">
|
|
44
|
+
<div class="card" style="width: 18rem;">
|
|
45
|
+
<div class="card-body">
|
|
46
|
+
<h5 class="card-title">Card title</h5>
|
|
47
|
+
<p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
|
|
48
|
+
content.</p>
|
|
49
|
+
<a href="#" class="btn btn-primary">Go somewhere</a>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="row">
|
|
54
|
+
<div class="col-sm">
|
|
55
|
+
<div class="card" style="width: 18rem;">
|
|
56
|
+
<ul class="list-group list-group-flush">
|
|
57
|
+
<li class="list-group-item">An item</li>
|
|
58
|
+
<li class="list-group-item">A second item</li>
|
|
59
|
+
<li class="list-group-item">A third item</li>
|
|
60
|
+
</ul>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="col-sm">
|
|
64
|
+
<div class="btn-group" role="group" aria-label="Basic mixed styles example">
|
|
65
|
+
<button type="button" class="btn btn-danger">Left</button>
|
|
66
|
+
<button type="button" class="btn btn-warning">Middle</button>
|
|
67
|
+
<button type="button" class="btn btn-success">Right</button>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="col-sm">
|
|
71
|
+
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top"
|
|
72
|
+
title="Tooltip on top">
|
|
73
|
+
Tooltip on top
|
|
74
|
+
</button>
|
|
75
|
+
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="right"
|
|
76
|
+
title="Tooltip on right">
|
|
77
|
+
Tooltip on right
|
|
78
|
+
</button>
|
|
79
|
+
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="bottom"
|
|
80
|
+
title="Tooltip on bottom">
|
|
81
|
+
Tooltip on bottom
|
|
82
|
+
</button>
|
|
83
|
+
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left"
|
|
84
|
+
title="Tooltip on left">
|
|
85
|
+
Tooltip on left
|
|
86
|
+
</button>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
|
2
|
+
|
|
3
|
+
require 'rails'
|
|
4
|
+
|
|
5
|
+
%w(
|
|
6
|
+
action_controller
|
|
7
|
+
action_view
|
|
8
|
+
sprockets
|
|
9
|
+
).each do |framework|
|
|
10
|
+
require "#{framework}/railtie"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require 'autoprefixer-rails'
|
|
14
|
+
require 'uglifier'
|
|
15
|
+
require 'bootstrap'
|
|
16
|
+
|
|
17
|
+
module Dummy
|
|
18
|
+
class Application < Rails::Application
|
|
19
|
+
config.assets.enabled = true if config.assets.respond_to?(:enabled)
|
|
20
|
+
if Rails::VERSION::MAJOR > 4
|
|
21
|
+
# Rails 4 precompiles application.css|js by default, but future version of Rails do not.
|
|
22
|
+
config.assets.precompile += %w( application.css application.js )
|
|
23
|
+
end
|
|
24
|
+
config.to_prepare do
|
|
25
|
+
if ENV['VERBOSE']
|
|
26
|
+
STDERR.puts "Loaded Rails #{Rails::VERSION::STRING}, Sprockets #{Sprockets::VERSION}",
|
|
27
|
+
"Asset paths: #{Rails.application.config.assets.paths}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Dummy::Application.configure do
|
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
|
3
|
+
|
|
4
|
+
# In the development environment your application's code is reloaded on
|
|
5
|
+
# every request. This slows down response time but is perfect for development
|
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
|
7
|
+
config.cache_classes = false
|
|
8
|
+
|
|
9
|
+
# Do not eager load code on boot.
|
|
10
|
+
config.eager_load = false
|
|
11
|
+
|
|
12
|
+
# Show full error reports and disable caching.
|
|
13
|
+
config.consider_all_requests_local = true
|
|
14
|
+
config.action_controller.perform_caching = false
|
|
15
|
+
|
|
16
|
+
# Print deprecation notices to the Rails logger.
|
|
17
|
+
config.active_support.deprecation = :log
|
|
18
|
+
|
|
19
|
+
# Debug mode disables concatenation and preprocessing of assets.
|
|
20
|
+
# This option may cause significant delays in view rendering with a large
|
|
21
|
+
# number of complex assets.
|
|
22
|
+
config.assets.debug = true
|
|
23
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Dummy::Application.configure do
|
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
|
3
|
+
|
|
4
|
+
# Code is not reloaded between requests.
|
|
5
|
+
config.cache_classes = true
|
|
6
|
+
|
|
7
|
+
# Eager load code on boot. This eager loads most of Rails and
|
|
8
|
+
# your application in memory, allowing both thread web servers
|
|
9
|
+
# and those relying on copy on write to perform better.
|
|
10
|
+
# Rake tasks automatically ignore this option for performance.
|
|
11
|
+
config.eager_load = true
|
|
12
|
+
|
|
13
|
+
# Full error reports are disabled and caching is turned on.
|
|
14
|
+
config.consider_all_requests_local = false
|
|
15
|
+
config.action_controller.perform_caching = true
|
|
16
|
+
|
|
17
|
+
# Enable Rack::Cache to put a simple HTTP cache in front of your application
|
|
18
|
+
# Add `rack-cache` to your Gemfile before enabling this.
|
|
19
|
+
# For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
|
|
20
|
+
# config.action_dispatch.rack_cache = true
|
|
21
|
+
|
|
22
|
+
# Disable Rails's static asset server (Apache or nginx will already do this).
|
|
23
|
+
if config.respond_to?(:serve_static_files)
|
|
24
|
+
# rails >= 4.2
|
|
25
|
+
config.serve_static_files = true
|
|
26
|
+
elsif config.respond_to?(:serve_static_assets)
|
|
27
|
+
# rails < 4.2
|
|
28
|
+
config.serve_static_assets = true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Compress JavaScripts and CSS.
|
|
32
|
+
config.assets.js_compressor = :uglifier
|
|
33
|
+
# config.assets.css_compressor = :sass
|
|
34
|
+
|
|
35
|
+
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
|
36
|
+
config.assets.compile = false
|
|
37
|
+
|
|
38
|
+
# Generate digests for assets URLs.
|
|
39
|
+
config.assets.digest = true
|
|
40
|
+
|
|
41
|
+
# Version of your assets, change this if you want to expire all your assets.
|
|
42
|
+
config.assets.version = '1.0'
|
|
43
|
+
|
|
44
|
+
# Specifies the header that your server uses for sending files.
|
|
45
|
+
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
|
46
|
+
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
|
47
|
+
|
|
48
|
+
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
|
49
|
+
# config.force_ssl = true
|
|
50
|
+
|
|
51
|
+
# Set to :debug to see everything in the log.
|
|
52
|
+
config.log_level = :info
|
|
53
|
+
|
|
54
|
+
# Prepend all log lines with the following tags.
|
|
55
|
+
# config.log_tags = [ :subdomain, :uuid ]
|
|
56
|
+
|
|
57
|
+
# Use a different logger for distributed setups.
|
|
58
|
+
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
|
59
|
+
|
|
60
|
+
# Use a different cache store in production.
|
|
61
|
+
# config.cache_store = :mem_cache_store
|
|
62
|
+
|
|
63
|
+
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
|
64
|
+
# config.action_controller.asset_host = "http://assets.example.com"
|
|
65
|
+
|
|
66
|
+
# Precompile additional assets.
|
|
67
|
+
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
|
68
|
+
# config.assets.precompile += %w( search.js )
|
|
69
|
+
|
|
70
|
+
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
|
71
|
+
# the I18n.default_locale when a translation can not be found).
|
|
72
|
+
config.i18n.fallbacks = true
|
|
73
|
+
|
|
74
|
+
# Send deprecation notices to registered listeners.
|
|
75
|
+
config.active_support.deprecation = :notify
|
|
76
|
+
|
|
77
|
+
# Disable automatic flushing of the log to improve performance.
|
|
78
|
+
# config.autoflush_log = false
|
|
79
|
+
|
|
80
|
+
# Use default logging formatter so that PID and timestamp are not suppressed.
|
|
81
|
+
config.log_formatter = ::Logger::Formatter.new
|
|
82
|
+
end
|