bullet_train-themes-light 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd6ffe6483f8505277c3da64474b02edfc71014eea876aef3d87e1822482e0d7
|
4
|
+
data.tar.gz: c90c0d8f175fdf287d1f486d1ee29968e47fe9dafec774d65d6e20d546594486
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc610cb2c3f2d8991db5997fb394ff463468f108892b1955324c774b7ac7d2ef9f2bd92d72d0d497ce086f22e92c63c28ee6e7105069b3cc7cb9bd5817fe53a2
|
7
|
+
data.tar.gz: c081ab721a83cf2ca52d03c6b2cfe357f234ac6a53be73f43f9658ac118b36eecf2837d96dc785ef7f13a4bfcf1a4d17eac32e81826b336f74fe1d356b4b7881
|
@@ -2,75 +2,77 @@ module BulletTrain
|
|
2
2
|
module Themes
|
3
3
|
module Light
|
4
4
|
class CustomThemeFileReplacer
|
5
|
-
mattr_accessor :repo_path
|
6
|
-
|
7
5
|
include BulletTrain::Themes::Light::FileReplacer
|
8
6
|
|
9
|
-
def initialize(custom_theme)
|
10
|
-
@
|
7
|
+
def initialize(original_theme, custom_theme)
|
8
|
+
@original_theme = original_theme
|
9
|
+
@custom_theme = custom_theme
|
10
|
+
@repo_path = "./local/bullet_train-themes-#{@custom_theme}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def replace_theme
|
14
|
+
rename_cloned_files_and_directories_with_custom_theme_name
|
15
|
+
replace_cloned_file_contents_with_custom_theme_contents
|
16
|
+
transform_file_contents_with_custom_theme_name
|
17
|
+
remove_custom_theme_from_main_app
|
18
|
+
set_gem_to_v1
|
19
|
+
update_gem_author_and_email
|
11
20
|
end
|
12
21
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
].map { |file| @repo_path + file }.each do |original_directory|
|
21
|
-
custom_directory = original_directory.gsub(/(.*)(#{original_theme})(\/$)/, '\1' + custom_theme + '\3')
|
22
|
-
FileUtils.mv(original_directory, custom_directory)
|
22
|
+
def rename_cloned_files_and_directories_with_custom_theme_name
|
23
|
+
cloned_contents = Dir.glob("#{@repo_path}/**/*")
|
24
|
+
cloned_directories = cloned_contents.select { |repo_content| File.directory?(repo_content) && repo_content.match?(/\/#{@original_theme}$/) }
|
25
|
+
cloned_files = cloned_contents.select { |repo_content| File.file?(repo_content) && repo_content.split("/").last.match?(@original_theme) }
|
26
|
+
|
27
|
+
(cloned_directories + cloned_files).each do |original_content|
|
28
|
+
File.rename(original_content, original_content.gsub(@original_theme, @custom_theme))
|
23
29
|
end
|
30
|
+
end
|
24
31
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
custom_gem_file[:file_name] = adjust_directory_hierarchy(custom_gem_file[:file_name], original_theme)
|
35
|
-
|
36
|
-
# The content in the main app should replace the cloned gem files.
|
37
|
-
begin
|
38
|
-
if custom_gem_file[:must_compare] && !BulletTrain::Themes::Light::FileReplacer.files_have_same_content?(custom_gem_file[:file_name], main_app_file)
|
39
|
-
BulletTrain::Themes::Light::FileReplacer.replace_content(old: custom_gem_file[:file_name], new: main_app_file)
|
40
|
-
end
|
41
|
-
rescue Errno::ENOENT => _
|
42
|
-
puts "Skipping `#{main_app_file}` because it isn't present."
|
43
|
-
end
|
32
|
+
def replace_cloned_file_contents_with_custom_theme_contents
|
33
|
+
repo_contents = Dir.glob("#{@repo_path}/**/*")
|
34
|
+
cloned_files = repo_contents.select { |repo_content| File.file?(repo_content) && repo_content.match?(@custom_theme) }
|
35
|
+
|
36
|
+
# Most files in the root of the starter repository should not replace what we cloned from the original theme gem.
|
37
|
+
(Dir.glob("#{@repo_path}/*") << "#{@repo_path}/config/routes.rb").each { |file_to_skip| cloned_files.delete(file_to_skip) }
|
38
|
+
|
39
|
+
cloned_files.each do |cloned_file|
|
40
|
+
starter_repository_file = cloned_file.gsub(@repo_path, ".")
|
44
41
|
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
# This file has a different directory structure than what is in the starter repository.
|
43
|
+
starter_repository_file.gsub!("app/", "") if cloned_file.match?("lib/bullet_train/themes/#{@custom_theme}.rb")
|
44
|
+
|
45
|
+
# Some files we have here like the gemspec don't exist in the starter repository, so we skip those.
|
46
|
+
if File.exist?(starter_repository_file)
|
47
|
+
begin
|
48
|
+
BulletTrain::Themes::Light::FileReplacer.replace_content(old: cloned_file, new: starter_repository_file)
|
49
|
+
rescue Errno::ENOENT => _
|
50
|
+
puts "Couldn't replace contents for #{cloned_file}".red
|
51
|
+
end
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
|
-
#
|
54
|
-
#
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
# This is the only file that is copied from and pasted to the starter repository directly with
|
56
|
+
# a new name when running the eject command, so we have to move it manually to the new gem.
|
57
|
+
`mv ./tailwind.#{@custom_theme}.config.js #{@repo_path}/tailwind.#{@custom_theme}.config.js`
|
58
|
+
end
|
59
|
+
|
60
|
+
def transform_file_contents_with_custom_theme_name
|
61
|
+
repo_contents = Dir.glob("#{@repo_path}/**/*")
|
62
|
+
files_to_change = repo_contents.select { |repo_content| File.file?(repo_content) }
|
63
|
+
original_theme_class_name = @original_theme.split(/[_|-]/).map(&:capitalize).join
|
64
|
+
custom_theme_class_name = @custom_theme.split(/[_|-]/).map(&:capitalize).join
|
65
|
+
new_lines = []
|
66
|
+
|
67
|
+
files_to_change.each do |file|
|
59
68
|
File.open(file, "r") do |f|
|
60
69
|
new_lines = f.readlines
|
70
|
+
next unless new_lines.join.match?(/#{@original_theme}|#{original_theme_class_name}/)
|
71
|
+
|
61
72
|
new_lines = new_lines.map do |line|
|
62
|
-
#
|
63
|
-
|
64
|
-
|
65
|
-
line = " mattr_accessor :color, default: :blue\n class Theme < BulletTrain::Themes::#{constantize_from_snake_case(original_theme)}::Theme\n"
|
66
|
-
else
|
67
|
-
# `_account.html.erb` and `_devise.html.erb` have tailwind classes that contain `light`.
|
68
|
-
# We shouldn't be replacing the classes with the custom theme string, so we skip it here.
|
69
|
-
# TODO: We should change this Regexp to check if the original theme is prefixed with `-`.
|
70
|
-
# If it is, we ignore the string if it's not prefixed with `bullet_train-themes-`,
|
71
|
-
line.gsub!(original_theme, custom_theme) unless line.match?("bg-light-gradient")
|
72
|
-
line.gsub!(constantized_original, constantized_custom)
|
73
|
-
end
|
73
|
+
# Avoid replacing Tailwind styles like `font-light` and `font-extralight`.
|
74
|
+
line.gsub!(@original_theme, @custom_theme) unless line.match?(/font-.*light/)
|
75
|
+
line.gsub!(original_theme_class_name, custom_theme_class_name)
|
74
76
|
line
|
75
77
|
end
|
76
78
|
end
|
@@ -79,45 +81,47 @@ module BulletTrain
|
|
79
81
|
f.puts new_lines.join
|
80
82
|
end
|
81
83
|
end
|
84
|
+
end
|
82
85
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
RUBY
|
95
|
-
new_lines.unshift(require_lines)
|
96
|
-
end
|
97
|
-
File.open("#{@repo_path}/lib/bullet_train/themes/#{custom_theme}.rb", "w") do |file|
|
98
|
-
file.puts new_lines.flatten.join
|
86
|
+
def remove_custom_theme_from_main_app
|
87
|
+
files = [
|
88
|
+
"./app/assets/stylesheets/#{@custom_theme}.tailwind.css",
|
89
|
+
Dir.glob("./app/assets/stylesheets/#{@custom_theme}/**/*.css"),
|
90
|
+
"./app/javascript/application.#{@custom_theme}.js",
|
91
|
+
"./app/lib/bullet_train/themes/#{@custom_theme}.rb",
|
92
|
+
Dir.glob("./app/views/themes/#{@custom_theme}/**/*.html.erb"),
|
93
|
+
].flatten
|
94
|
+
files.each do |file|
|
95
|
+
File.delete(file)
|
99
96
|
end
|
100
97
|
|
101
|
-
|
102
|
-
|
98
|
+
directories = [
|
99
|
+
"./app/assets/stylesheets/#{@custom_theme}/",
|
100
|
+
"./app/views/themes/#{@custom_theme}/",
|
101
|
+
"./app/lib/"
|
102
|
+
].map { |directory| directory unless directory == "./app/lib/" && Dir.empty?(directory) }
|
103
|
+
directories.compact.each { |directory| FileUtils.rm_rf(directory) }
|
104
|
+
end
|
105
|
+
|
106
|
+
def set_gem_to_v1
|
107
|
+
new_lines = []
|
108
|
+
File.open("#{@repo_path}/lib/bullet_train/themes/#{@custom_theme}/version.rb", "r") do |file|
|
103
109
|
new_lines = file.readlines
|
104
110
|
new_lines = new_lines.map { |line| line.match?("VERSION") ? " VERSION = \"1.0\"\n" : line }
|
105
111
|
end
|
106
|
-
File.open("#{@repo_path}/lib/bullet_train/themes/#{custom_theme}/version.rb", "w") do |file|
|
107
|
-
file.puts new_lines.join
|
108
|
-
end
|
109
112
|
|
110
|
-
#
|
111
|
-
|
112
|
-
directories_to_remove_from_main_app(custom_theme).each do |directory|
|
113
|
-
FileUtils.rm_rf(directory) unless directory.nil?
|
113
|
+
File.open("#{@repo_path}/lib/bullet_train/themes/#{@custom_theme}/version.rb", "w") do |file|
|
114
|
+
file.puts new_lines.join
|
114
115
|
end
|
116
|
+
end
|
115
117
|
|
116
|
-
|
118
|
+
def update_gem_author_and_email
|
117
119
|
# If the developer hasn't set these yet, this should simply return empty strings.
|
118
120
|
author = `git config --global user.name`.chomp
|
119
121
|
email = `git config --global user.email`.chomp
|
120
|
-
|
122
|
+
new_lines = []
|
123
|
+
|
124
|
+
File.open("#{@repo_path}/bullet_train-themes-#{@custom_theme}.gemspec", "r") do |file|
|
121
125
|
new_lines = file.readlines
|
122
126
|
new_lines = new_lines.map do |line|
|
123
127
|
if line.match?("spec.authors")
|
@@ -129,105 +133,10 @@ module BulletTrain
|
|
129
133
|
end
|
130
134
|
end
|
131
135
|
end
|
132
|
-
File.open("#{@repo_path}/bullet_train-themes-#{custom_theme}.gemspec", "w") do |file|
|
136
|
+
File.open("#{@repo_path}/bullet_train-themes-#{@custom_theme}.gemspec", "w") do |file|
|
133
137
|
file.puts new_lines.join
|
134
138
|
end
|
135
139
|
end
|
136
|
-
|
137
|
-
# By the time we call this method we have already updated the new gem's directories with
|
138
|
-
# the custom theme name, but the FILE names are still the same from when they were cloned,
|
139
|
-
# so we use `original_theme` for specific file names below.
|
140
|
-
def ejected_files_to_replace(original_theme, custom_theme)
|
141
|
-
[
|
142
|
-
Dir.glob("#{@repo_path}/app/assets/stylesheets/#{custom_theme}/**/*.css"),
|
143
|
-
Dir.glob("#{@repo_path}/app/assets/stylesheets/#{custom_theme}/**/*.scss"),
|
144
|
-
Dir.glob("#{@repo_path}/app/views/themes/#{custom_theme}/**/*.html.erb"),
|
145
|
-
"/app/javascript/application.#{original_theme}.js",
|
146
|
-
"/tailwind.#{original_theme}.config.js",
|
147
|
-
"/app/lib/bullet_train/themes/#{original_theme}.rb",
|
148
|
-
# The Glob up top doesn't grab the #{original_theme}.tailwind.css file, so we set that here.
|
149
|
-
"/app/assets/stylesheets/#{original_theme}.tailwind.css",
|
150
|
-
"/tailwind.mailer.#{original_theme}.config.js"
|
151
|
-
].flatten.map { |file| file.match?(/^#{@repo_path}/) ? file : @repo_path + file }
|
152
|
-
end
|
153
|
-
|
154
|
-
# These files represent ones such as "./lib/bullet_train/themes/light.rb" which
|
155
|
-
# aren't ejected to the developer's main app, but still need to be changed.
|
156
|
-
def default_files_to_replace(original_theme)
|
157
|
-
# TODO: Add this file and the FileReplacer module once they're added to the main branch.
|
158
|
-
[
|
159
|
-
"/bullet_train-themes-#{original_theme}.gemspec",
|
160
|
-
"/app/assets/config/bullet_train_themes_#{original_theme}_manifest.js",
|
161
|
-
"/lib/tasks/bullet_train/themes/#{original_theme}_tasks.rake",
|
162
|
-
"/test/bullet_train/themes/#{original_theme}_test.rb"
|
163
|
-
].map { |file| @repo_path + file }
|
164
|
-
end
|
165
|
-
|
166
|
-
def files_to_remove_from_main_app(custom_theme)
|
167
|
-
[
|
168
|
-
Dir.glob("./app/assets/stylesheets/#{custom_theme}/**/*.css"),
|
169
|
-
Dir.glob("./app/assets/stylesheets/#{custom_theme}/**/*.scss"),
|
170
|
-
"./app/assets/stylesheets/#{custom_theme}.tailwind.css",
|
171
|
-
"./app/javascript/application.#{custom_theme}.js",
|
172
|
-
"./app/lib/bullet_train/themes/#{custom_theme}.rb",
|
173
|
-
Dir.glob("./app/views/themes/#{custom_theme}/**/*.html.erb"),
|
174
|
-
"./tailwind.mailer.#{custom_theme}.config.js",
|
175
|
-
"./tailwind.#{custom_theme}.config.js",
|
176
|
-
].flatten
|
177
|
-
end
|
178
|
-
|
179
|
-
def files_whose_contents_need_to_be_replaced(custom_theme)
|
180
|
-
[
|
181
|
-
"/app/assets/stylesheets/#{custom_theme}.tailwind.css",
|
182
|
-
"/app/views/themes/#{custom_theme}/layouts/_account.html.erb",
|
183
|
-
"/app/views/themes/#{custom_theme}/layouts/_devise.html.erb",
|
184
|
-
"/bin/rails",
|
185
|
-
"/lib/bullet_train/themes/#{custom_theme}/engine.rb",
|
186
|
-
"/lib/bullet_train/themes/#{custom_theme}/version.rb",
|
187
|
-
"/lib/bullet_train/themes/#{custom_theme}.rb",
|
188
|
-
"/lib/tasks/bullet_train/themes/#{custom_theme}_tasks.rake",
|
189
|
-
"/test/bullet_train/themes/#{custom_theme}_test.rb",
|
190
|
-
"/test/dummy/app/views/layouts/mailer.html.erb",
|
191
|
-
"/test/dummy/config/application.rb",
|
192
|
-
"/bullet_train-themes-#{custom_theme}.gemspec",
|
193
|
-
"/Gemfile",
|
194
|
-
"/README.md"
|
195
|
-
].map { |file| @repo_path + file }
|
196
|
-
end
|
197
|
-
|
198
|
-
def directories_to_remove_from_main_app(custom_theme)
|
199
|
-
[
|
200
|
-
"./app/assets/stylesheets/#{custom_theme}/",
|
201
|
-
"./app/views/themes/#{custom_theme}/",
|
202
|
-
"./app/lib/"
|
203
|
-
].map { |directory| directory unless directory == "./app/lib/" && Dir.empty?(directory) }
|
204
|
-
end
|
205
|
-
|
206
|
-
# Since we're cloning a fresh gem, file names that contain the original
|
207
|
-
# theme stay the same, i.e. - tailwind.light.config.js. However, the names have
|
208
|
-
# already been changed in the main app when the original theme was ejected.
|
209
|
-
# Here, we build the correct string that is in the main app to compare the
|
210
|
-
# files' contents. Then later on we actually rename the new gem's file names.
|
211
|
-
def build_main_app_file_name(original_theme, custom_theme, custom_gem_file)
|
212
|
-
main_app_file = custom_gem_file
|
213
|
-
custom_gem_file_hierarchy = custom_gem_file.split("/")
|
214
|
-
if custom_gem_file_hierarchy.last.match?(original_theme)
|
215
|
-
custom_gem_file_hierarchy.last.gsub!(original_theme, custom_theme)
|
216
|
-
main_app_file = custom_gem_file_hierarchy.join("/")
|
217
|
-
end
|
218
|
-
main_app_file
|
219
|
-
end
|
220
|
-
|
221
|
-
# This addresses one specific file where the hierarchy is
|
222
|
-
# different after the file is ejected into the main application.
|
223
|
-
def adjust_directory_hierarchy(file_name, theme_name)
|
224
|
-
file_name.match?("lib/bullet_train/themes/#{theme_name}") ? file_name.gsub("/app", "") : file_name
|
225
|
-
end
|
226
|
-
|
227
|
-
# i.e. - foo_bar or foo-bar to FooBar
|
228
|
-
def constantize_from_snake_case(str)
|
229
|
-
str.split(/[_|-]/).map(&:capitalize).join
|
230
|
-
end
|
231
140
|
end
|
232
141
|
end
|
233
142
|
end
|
data/lib/tasks/application.rb
CHANGED
@@ -91,9 +91,14 @@ module BulletTrain
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def self.release_theme(original_theme_name, args)
|
94
|
+
# We only want developers publishing gems off of `bullet_train-themes-light`, so if the task looks
|
95
|
+
# something like `rake bullet_train:themes:foo:release[bar]`, we prevent them from moving any further here.
|
94
96
|
if original_theme_name != "light"
|
95
97
|
puts "You can only release new themes based off of Bullet Train's Light theme. Please eject a new theme from there, and publish your gem once you've finished making changes.".red
|
96
98
|
exit 1
|
99
|
+
elsif original_theme_name.nil?
|
100
|
+
puts "Please run the command with the name of the theme you want to release.".red
|
101
|
+
puts "For example: > rake bullet_train:themes:light:release[foo]"
|
97
102
|
end
|
98
103
|
|
99
104
|
puts "Preparing to release your custom theme: ".blue + args[:theme_name]
|
@@ -118,19 +123,28 @@ module BulletTrain
|
|
118
123
|
raise "You already have a repository named `bullet_train-themes-#{args[:theme_name]}` in `./local`.\n" \
|
119
124
|
"Make sure you delete it first to create an entirely new gem."
|
120
125
|
end
|
121
|
-
`git clone git@github.com:bullet-train-co/bullet_train-themes-light.git ./local/bullet_train-themes-#{args[:theme_name]}`
|
122
126
|
|
123
|
-
|
124
|
-
|
127
|
+
# Pull `bullet_train-themes-light` only from `bullet_train-core` into the new theme directory.
|
128
|
+
# https://www.git-scm.com/docs/git-sparse-checkout
|
129
|
+
`mkdir ./local/bullet_train-themes-#{args[:theme_name]}`
|
130
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && git init && git remote add bullet-train-core git@github.com:bullet-train-co/bullet_train-core.git`
|
131
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && git config core.sparseCheckout true && echo "bullet_train-themes-light/**/*" >> .git/info/sparse-checkout`
|
132
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && git pull bullet-train-core main && git remote rm bullet-train-core`
|
133
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && mv bullet_train-themes-light/* . && mv bullet_train-themes-light/.* .`
|
134
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && rmdir bullet_train-themes-light/`
|
135
|
+
`cd ./local/bullet_train-themes-#{args[:theme_name]} && git config core.sparseCheckout false`
|
136
|
+
|
137
|
+
BulletTrain::Themes::Light::CustomThemeFileReplacer.new(original_theme_name, args[:theme_name]).replace_theme
|
125
138
|
|
126
139
|
work_tree_flag = "--work-tree=local/bullet_train-themes-#{args[:theme_name]}"
|
127
140
|
git_dir_flag = "--git-dir=local/bullet_train-themes-#{args[:theme_name]}/.git"
|
128
141
|
path = "./local/bullet_train-themes-#{args[:theme_name]}"
|
129
142
|
|
130
143
|
# Set up the proper remote.
|
131
|
-
`git #{work_tree_flag} #{git_dir_flag} remote
|
144
|
+
`git #{work_tree_flag} #{git_dir_flag} remote add origin #{ssh_path}`
|
132
145
|
`git #{work_tree_flag} #{git_dir_flag} add .`
|
133
146
|
`git #{work_tree_flag} #{git_dir_flag} commit -m "Add initial files"`
|
147
|
+
`git #{work_tree_flag} #{git_dir_flag} branch -m main`
|
134
148
|
|
135
149
|
# Build the gem.
|
136
150
|
`(cd #{path} && gem build bullet_train-themes-#{args[:theme_name]}.gemspec)`
|
@@ -153,9 +167,14 @@ module BulletTrain
|
|
153
167
|
puts "You may have to wait for some time until the gem can be downloaded via the Gemfile.".blue
|
154
168
|
puts "After a few minutes, run the following command in your main application:".blue
|
155
169
|
puts "bundle add bullet_train-themes-#{args[:theme_name]}"
|
156
|
-
puts "rake bullet_train:themes:#{args[:theme_name]}:install"
|
157
170
|
puts ""
|
158
171
|
puts "Then you'll be ready to use your custom gem in your Bullet Train application.".blue
|
172
|
+
puts ""
|
173
|
+
puts "Please note that we have deleted the new theme from your main application.".blue
|
174
|
+
puts "run `git log -1` for details."
|
175
|
+
puts ""
|
176
|
+
puts "Use `rake bullet_train:themes:light:install` to revert to the original theme,".blue
|
177
|
+
puts "or run `rake bullet_train:themes:#{args[:theme_name]}:install` whenever you want to use your new theme.".blue
|
159
178
|
end
|
160
179
|
|
161
180
|
def self.install_theme(theme_name)
|
@@ -171,6 +190,8 @@ module BulletTrain
|
|
171
190
|
file.write changed
|
172
191
|
end
|
173
192
|
end
|
193
|
+
|
194
|
+
puts "Finished installing `#{theme_name}`.".blue
|
174
195
|
end
|
175
196
|
|
176
197
|
def self.clean_theme(theme_name, args)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bullet_train-themes-light
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Culver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: standard
|