squared 0.0.6 → 0.0.7

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.
@@ -4,11 +4,11 @@ module Squared
4
4
  module Workspace
5
5
  module Project
6
6
  class Ruby < Git
7
- REF = :ruby
8
7
  GEMFILE = %w[Gemfile Gemfile.lock gem.deps.rb Isolate].freeze
9
- OPT_INSTALL = %w[no-cache force quiet verbose].freeze
10
- OPT_UPDATE = %w[redownload local strict conservative group=s quiet verbose].freeze
11
- private_constant :REF, :GEMFILE, :OPT_INSTALL, :OPT_UPDATE
8
+ OPT_INSTALL = %w[no-cache force].freeze
9
+ OPT_UPDATE = %w[redownload local strict conservative group=s].freeze
10
+ OPT_OUTDATED = %w[local strict pre only-explicit group=s].freeze
11
+ private_constant :GEMFILE, :OPT_INSTALL, :OPT_UPDATE, :OPT_OUTDATED
12
12
 
13
13
  class << self
14
14
  def populate(*); end
@@ -26,32 +26,34 @@ module Squared
26
26
  end
27
27
  end
28
28
 
29
- @@tasks[REF] = {
30
- install: %i[redownload local prefer-local with-g without-g],
29
+ @@tasks[ref] = {
30
+ install: %i[redownload local prefer-local gem with without],
31
31
  update: %i[all patch minor major],
32
- pristine: %i[version extensions],
32
+ outdated: %i[patch minor major],
33
+ pristine: %i[gem all version],
34
+ exec: nil,
35
+ config: nil,
33
36
  rake: nil
34
37
  }.freeze
35
38
 
36
39
  attr_reader :gemfile
37
40
 
38
- def initialize(name, path, workspace, *, version: nil, autodetect: false, **kwargs)
41
+ def initialize(*, version: nil, autodetect: false, **kwargs)
39
42
  super
40
- initialize_build(REF, **kwargs)
41
- @version = env('BUILD', suffix: 'VERSION', strict: true) || version
43
+ initialize_build(Ruby.ref, **kwargs)
44
+ @version = env('BUILD', version, suffix: 'VERSION', strict: true)
42
45
  @autodetect = autodetect
43
46
  index = GEMFILE.index { |file| base_path(file).exist? } || 0
44
47
  @gemfile = base_path(GEMFILE[index])
45
48
  return if !@output[0].nil? || !@copy.nil? || @version || @autodetect || (file = rakefile).nil?
46
49
 
47
50
  begin
48
- pat = %r{\brequire\s+(["'])bundler/gem_tasks\1}
49
51
  File.foreach(file) do |line|
50
- next unless line =~ pat
52
+ next unless line =~ %r{\brequire\s+(["'])bundler/gem_tasks\1}
51
53
 
52
54
  @output[0] = 'bundle exec rake build'
53
55
  @copy = 'bundle exec rake install'
54
- @clean ||= 'bundle exec rake clean'
56
+ @clean = 'bundle exec rake clean' if @clean.nil?
55
57
  break
56
58
  end
57
59
  rescue StandardError => e
@@ -61,18 +63,23 @@ module Squared
61
63
 
62
64
  def populate(*)
63
65
  super
64
- return unless outdated?
66
+ return unless outdated? && !@exclude.include?(Ruby.ref)
65
67
 
66
68
  namespace name do
67
- @@tasks[REF].each do |action, flags|
69
+ @@tasks[Ruby.ref].each do |action, flags|
68
70
  if flags.nil?
69
71
  case action
72
+ when :exec, :config
73
+ desc format_desc(action, nil, 'command+')
74
+ task action, [:command] do |_, args|
75
+ bundle(action, args.to_a)
76
+ end
70
77
  when :rake
71
78
  next unless rakefile
72
79
 
73
80
  desc format_desc(action, nil, 'command*')
74
81
  task action, [:command] do |_, args|
75
- rake collect_args(args, :command)
82
+ rake args.to_a
76
83
  end
77
84
  end
78
85
  else
@@ -81,26 +88,51 @@ module Squared
81
88
  case action
82
89
  when :install
83
90
  case flag
84
- when :'with-g', :'without-g'
91
+ when :gem
92
+ desc format_desc(action, flag, 'name+')
93
+ task flag, [:name] do |_, args|
94
+ name = args.to_a
95
+ guard_params(action, flag, args: name)
96
+ depend(flag, opts: name, override: true)
97
+ end
98
+ when :with, :without
85
99
  desc format_desc(action, flag, 'group+')
86
100
  task flag, [:group] do |_, args|
87
- depend(flag, group: collect_args(args, :group), override: true)
101
+ group = args.to_a
102
+ guard_params(action, flag, args: group)
103
+ depend(flag, opts: group, override: true)
88
104
  end
89
105
  else
90
106
  desc format_desc(action, flag, OPT_INSTALL)
91
107
  task flag, [:opts] do |_, args|
92
- depend(flag, opts: collect_args(args, :opts), override: true)
108
+ depend(flag, opts: args.to_a, override: true)
93
109
  end
94
110
  end
95
- when :update
96
- desc format_desc(action, flag, OPT_UPDATE)
111
+ when :update, :outdated
112
+ desc format_desc(action, flag, action == :update ? OPT_UPDATE : OPT_OUTDATED)
97
113
  task flag, [:opts] do |_, args|
98
- update(flag, opts: collect_args(args, :opts))
114
+ __send__(action, flag, opts: args.to_a)
99
115
  end
100
116
  when :pristine
101
- desc format_desc(action, flag, 'version?')
102
- task flag, [:version] do |_, args|
103
- pristine(flag, version: args.version)
117
+ case flag
118
+ when :gem
119
+ desc format_desc(action, flag, 'name+')
120
+ task flag, [:name] do |_, args|
121
+ name = args.to_a
122
+ guard_params(action, flag, args: name)
123
+ pristine(flag, opts: name)
124
+ end
125
+ when :all
126
+ desc format_desc(action, flag, 'skip*')
127
+ task flag, [:skip] do |_, args|
128
+ pristine(flag, opts: args.to_a)
129
+ end
130
+ when :version
131
+ desc format_desc(action, flag, 'version?')
132
+ task flag, [:version] do |_, args|
133
+ guard_params(action, flag, args: args, key: :version)
134
+ pristine(flag, version: args.version)
135
+ end
104
136
  end
105
137
  end
106
138
  end
@@ -110,7 +142,7 @@ module Squared
110
142
  end
111
143
  end
112
144
 
113
- def depend(flag = nil, opts: [], group: [], override: false)
145
+ def depend(flag = nil, opts: [], override: false)
114
146
  if @depend && !override
115
147
  super
116
148
  elsif outdated?
@@ -134,16 +166,17 @@ module Squared
134
166
  end}"
135
167
  end
136
168
  append_bundle opts, OPT_INSTALL
137
- when :'with-g', :'without-g'
138
- guard_params('install', flag, args: group)
139
- cmd = gem_session 'install', '-g'
140
- opt = flag.to_s.sub('-g', '')
141
- group.each { |s| cmd << "--#{opt}=#{shell_escape(s, quote: true)}" }
169
+ when :gem
170
+ gem_session 'install'
171
+ append_value opts
172
+ when :with, :without
173
+ gem_session 'install'
174
+ append_repeat flag, opts
142
175
  else
143
- cmd = bundle_session 'install'
176
+ bundle_session 'install'
144
177
  append_bundle
145
178
  end
146
- run(banner: banner?, exception: workspace.exception)
179
+ run_rb
147
180
  end
148
181
  end
149
182
 
@@ -169,28 +202,136 @@ module Squared
169
202
  end
170
203
  end
171
204
 
172
- def outdated(*); end
205
+ def outdated(rev = nil, opts: [])
206
+ cmd = bundle_session 'outdated', rev && "--#{rev}"
207
+ append_bundle opts, OPT_OUTDATED
208
+ cmd = cmd.done
209
+ log.info cmd
210
+ print_item format_banner(cmd) if store_pwd || invoked_sync?("outdated#{rev ? ":#{rev}" : ''}")
211
+ start = 0
212
+ found = 0
213
+ major = 0
214
+ IO.popen("#{cmd} --no-color").each do |line|
215
+ if start > 0
216
+ unless pipe?
217
+ data = line.scan(SEM_VER)
218
+ cur = data.shift
219
+ lat = data.shift
220
+ if cur && lat
221
+ semver(cur)
222
+ semver(lat)
223
+ c = cur.join
224
+ l = lat.join
225
+ styles = []
226
+ data.each do |val|
227
+ break unless styles && (req = /(>?=|~>|!=|<=?) (#{Regexp.escape(val.join)})/.match(line))
228
+
229
+ v = semver(val).join
230
+ case req[1]
231
+ when '>', '>='
232
+ if c == l
233
+ styles = nil
234
+ elsif l < v
235
+ styles = %i[red underline]
236
+ break
237
+ elsif semmajor(cur, lat)
238
+ styles = %i[green underline]
239
+ major += 1
240
+ elsif cur[3] != lat[3]
241
+ styles = %i[green bold]
242
+ else
243
+ styles[0] = :green
244
+ end
245
+ when '<', '<='
246
+ if c <= v
247
+ if semmajor(cur, lat)
248
+ styles = %i[green underline]
249
+ major += 1
250
+ else
251
+ styles[0] = :yellow
252
+ end
253
+ elsif l >= v
254
+ styles = nil
255
+ end
256
+ when '!='
257
+ if c == v
258
+ styles = %i[red underline]
259
+ break
260
+ elsif l == v
261
+ styles = nil
262
+ else
263
+ styles[1] = :bold
264
+ end
265
+ when '~>'
266
+ if c < v && cur[0] == val[0] && !semmajor(cur, val)
267
+ styles[0] = :yellow
268
+ elsif semmajor(lat, val)
269
+ styles = nil
270
+ else
271
+ styles[1] = :bold
272
+ end
273
+ when '='
274
+ if c == v
275
+ styles[1] = :underline
276
+ else
277
+ styles[0] = :red
278
+ end
279
+ end
280
+ end
281
+ next unless styles && !styles.empty?
173
282
 
174
- def update(flag, opts: [])
175
- cmd = bundle_session 'update'
176
- case flag
177
- when :all, :major, :patch, :minor
178
- cmd << "--#{flag}"
283
+ case styles[0]
284
+ when :yellow, :green
285
+ line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[:active])
286
+ found += 1
287
+ end
288
+ line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.+)$/,
289
+ styles: styles.compact, index: 2)
290
+ end
291
+ end
292
+ puts "#{start.to_s.rjust(2)}. #{line}"
293
+ start += 1
294
+ elsif line =~ /^Gem /
295
+ unless pipe?
296
+ puts print_footer(" # #{line.chomp}", reverse: true, sub: [
297
+ { pat: /^(.+)(Gem)(.+)$/, styles: theme[:header], index: 2 },
298
+ { pat: /^(.+)(Latest)(.+)$/, styles: theme[:header], index: 2 }
299
+ ])
300
+ end
301
+ start += 1
302
+ end
303
+ end
304
+ if found > 0
305
+ puts print_footer(empty_status('Updates are available', 'major', major, always: true))
306
+ elsif start == 0
307
+ puts 'No updates were found'
179
308
  end
309
+ store_pwd true
310
+ end
311
+
312
+ def update(flag, opts: [])
313
+ bundle_session 'update', "--#{flag}"
180
314
  append_bundle opts, OPT_UPDATE
181
- run(banner: banner?, exception: workspace.exception)
315
+ run_rb
182
316
  end
183
317
 
184
- def pristine(flag, version: nil)
185
- cmd = gem_session 'pristine', project
318
+ def pristine(flag, version: nil, opts: [])
319
+ cmd = gem_session 'pristine'
186
320
  case flag
187
- when :extensions
188
- cmd << '--extensions'
321
+ when :gem
322
+ append_value opts
323
+ when :all
324
+ cmd << '--all'
325
+ append_repeat 'skip', opts
189
326
  when :version
190
- guard_params version, 'version'
327
+ cmd << project << "--version=#{shell_escape(version)}"
191
328
  end
192
- cmd << "--version=#{version}" if version
193
- run(banner: banner?, exception: workspace.exception)
329
+ run_rb
330
+ end
331
+
332
+ def bundle(flag, cmd)
333
+ guard_params('bundle', flag, args: cmd)
334
+ run_s "bundle #{flag} #{cmd.join(' ')}"
194
335
  end
195
336
 
196
337
  def rake(cmd)
@@ -210,9 +351,8 @@ module Squared
210
351
  return true if @copy.is_a?(::String) || @copy&.fetch(:gemdir, nil)
211
352
  return gemdir? if @gemdir
212
353
 
213
- gempath = -> { "gems#{::File::SEPARATOR}#{project}-#{@version}" }
214
354
  if @version && (val = ENV['GEM_HOME'])
215
- @gemdir = Pathname.new(val).join(gempath.())
355
+ @gemdir = Pathname.new(val).join(gempath)
216
356
  return true if gemdir?
217
357
  end
218
358
  return false unless @autodetect
@@ -236,7 +376,7 @@ module Squared
236
376
  break
237
377
  end
238
378
  unsafe.('path') unless data
239
- @gemdir = Pathname.new(data[1].strip).join(gempath.())
379
+ @gemdir = Pathname.new(data[1].strip).join(gempath)
240
380
  rescue StandardError => e
241
381
  log.error e
242
382
  @version = nil
@@ -247,38 +387,46 @@ module Squared
247
387
  end
248
388
  end
249
389
 
250
- def depend?
251
- outdated? || !!@depend
252
- end
253
-
254
390
  def outdated?
255
391
  gemfile.exist?
256
392
  end
257
393
 
258
- def dev?
259
- @dev
260
- end
261
-
262
394
  private
263
395
 
396
+ def run_rb
397
+ run(banner: !@session.include?('--quiet'))
398
+ end
399
+
264
400
  def append_bundle(opts = nil, list = nil)
265
401
  if (val = env('BUNDLE_JOBS')).to_i > 0
266
402
  @session << "-j#{val}"
267
403
  end
268
- @session << '--norc' if env('BUNDLE_NORC')
269
404
  return unless opts && list
270
405
 
271
406
  opts.each do |opt|
272
407
  if list.include?(opt)
273
408
  @session << "--#{opt}"
274
409
  elsif opt.match(/^g(?:roup)?=(.+)$/)
275
- @session << "--group=#{shell_escape($1, quote: true)}"
410
+ @session << "--group=#{shell_escape($1)}"
276
411
  end
277
412
  end
278
413
  end
279
414
 
415
+ def append_repeat(flag, opts)
416
+ opts.each { |val| @session << "--#{flag}=#{shell_escape(val)}" }
417
+ end
418
+
419
+ def append_value(opts)
420
+ opts.each { |val| @session << val }
421
+ end
422
+
280
423
  def gem_session(*cmd)
281
- session('gem', *cmd)
424
+ ret = session('gem', *cmd)
425
+ if (val = env('GEM_CONFIG_FILE'))
426
+ ret << "--config-file=#{shell_escape(base_path(val).to_s, quote: true)}"
427
+ end
428
+ ret << '--norc' if env('GEM_NORC')
429
+ ret
282
430
  end
283
431
 
284
432
  def bundle_session(*cmd)
@@ -286,8 +434,8 @@ module Squared
286
434
  append_nocolor
287
435
  end
288
436
 
289
- def banner?
290
- !@session.include?('--quiet')
437
+ def gempath
438
+ File.join('gems', "#{project}-#{@version}")
291
439
  end
292
440
 
293
441
  def gemdir?
@@ -5,6 +5,10 @@ module Squared
5
5
  module Project
6
6
  class << self
7
7
  attr_accessor :line_width
8
+
9
+ def max_width(lines)
10
+ [lines.max_by(&:size).size, line_width].max
11
+ end
8
12
  end
9
13
 
10
14
  @line_width = ENV.fetch('LOG_COLUMNS', 80).to_i
@@ -6,14 +6,13 @@ module Squared
6
6
  include Common
7
7
  include Format
8
8
  include System
9
- include Task
10
9
 
11
10
  attr_accessor :warning
12
11
 
13
- def repo(url, manifest = 'latest', run: nil, dev: nil, prod: nil)
12
+ def repo(url, manifest = 'latest', run: nil, dev: nil, prod: nil, ref: @ref, group: @group)
14
13
  @home = if (val = env('REPO_HOME'))
15
14
  home = Pathname.new(val)
16
- if @main == home.basename.to_s
15
+ if main == home.basename.to_s
17
16
  @root = home.parent
18
17
  if home.exist?
19
18
  @root = nil unless home.directory?
@@ -33,9 +32,9 @@ module Squared
33
32
  elsif !install?
34
33
  raise_error('REPO_ROOT', val, hint: 'exist') unless confirm_install
35
34
  end
36
- @root.join(@main).realdirpath
35
+ @root.join(main).realdirpath
37
36
  else
38
- install?(pwd = Pathname.pwd) ? pwd.join(@main) : pwd
37
+ install?(pwd = Pathname.pwd) ? pwd.join(main) : pwd
39
38
  end
40
39
  @root = @home.parent
41
40
  @manifest_url = url
@@ -44,7 +43,7 @@ module Squared
44
43
  @script[:build] = case (val = env('REPO_BUILD'))
45
44
  when 'verbose'
46
45
  @verbose = true
47
- "#{run}:verbose" if run
46
+ run.is_a?(String) ? "#{run}:verbose" : run
48
47
  when 'silent'
49
48
  @verbose = false
50
49
  @warning = false
@@ -54,19 +53,23 @@ module Squared
54
53
  end
55
54
  @script[:dev] = bool_match(env('REPO_DEV'), dev)
56
55
  @script[:prod] = bool_match(env('REPO_PROD'), prod)
56
+ @script[:ref][:_] = env('REPO_REF', ref)
57
+ @script[:group][:_] = env('REPO_GROUP', group)
57
58
  @warning = case env('REPO_WARN')
58
59
  when '0'
59
60
  false
60
61
  when '1'
61
62
  true
62
63
  else
63
- !empty?(@root)
64
+ @warning && !empty?(@root)
64
65
  end
65
66
  @extensions << :__repo__
66
67
  else
67
68
  @script[:build] = run
68
69
  @script[:dev] = dev
69
70
  @script[:prod] = prod
71
+ @script[:ref][:_] = ref
72
+ @script[:group][:_] = group
70
73
  end
71
74
  self
72
75
  end
@@ -93,7 +96,7 @@ module Squared
93
96
  cmd = []
94
97
  newline = ARGV.index { |val| val.start_with?('repo:') }.to_i > 0
95
98
  parse_opts = lambda do |args|
96
- collect_args(args, :opts).each do |val|
99
+ args.to_a.each do |val|
97
100
  case val
98
101
  when 'no-fail'
99
102
  failfast = false
@@ -122,10 +125,10 @@ module Squared
122
125
  stage ||= 'all'
123
126
  repo['sync'].invoke
124
127
  @project.select do |_, proj|
125
- if proj.enabled?
126
- proj.depend
127
- proj.build?
128
- end
128
+ next unless proj.enabled?
129
+
130
+ proj.depend if proj.depend?
131
+ proj.build?
129
132
  end
130
133
  .each_value { |proj| proj.has?(:dev) ? proj.refresh : proj.build }
131
134
  end
@@ -166,12 +169,13 @@ module Squared
166
169
  end
167
170
 
168
171
  def confirm_install
169
- return false unless @root.directory?
172
+ return false unless root.directory?
170
173
 
174
+ path = sub_style(root, styles: theme[:inline])
171
175
  @override = confirm(
172
- "#{log_title(:warn)} \"#{sub_style(@root, :bold)}\" is not empty. Continue with installation? [y/N] ",
176
+ "#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation? [y/N] ",
173
177
  default: 'N',
174
- timeout: env('REPO_TIMEOUT', ignore: '0', default: 15)
178
+ timeout: env('REPO_TIMEOUT', 15, ignore: '0')
175
179
  )
176
180
  end
177
181
 
@@ -188,7 +192,7 @@ module Squared
188
192
  end
189
193
  end
190
194
 
191
- def install?(dir = @root)
195
+ def install?(dir = root)
192
196
  return true if empty?(dir) || dir.join('.repo').directory?
193
197
  return false unless dir == root && env('REPO_HOME').nil? && !env('REPO_ROOT').nil?
194
198
 
@@ -8,18 +8,17 @@ module Squared
8
8
  include ::Rake::DSL
9
9
  extend Forwardable
10
10
 
11
- attr_reader :workspace, :sync, :multiple, :parallel
11
+ attr_reader :sync, :multiple, :parallel
12
12
 
13
- def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?, :has_key?
13
+ def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?
14
14
 
15
- def initialize(tasks, workspace, keys: Workspace::Application::WORKSPACE_KEYS)
15
+ def initialize(tasks, keys: Workspace::Application::WORKSPACE_KEYS)
16
16
  if tasks.is_a?(Array)
17
17
  @data = {}
18
18
  tasks.each { |key| __set__ key }
19
19
  else
20
20
  @data = tasks.dup
21
21
  end
22
- @workspace = workspace
23
22
  @keys = keys
24
23
  @sync = []
25
24
  @multiple = []
@@ -39,6 +38,7 @@ module Squared
39
38
  return unless @session
40
39
 
41
40
  group, parent, id = @session.values
41
+ workspace = proj.workspace
42
42
  each do |key, items|
43
43
  target = "#{proj.name}:#{key}"
44
44
  if @keys.include?(key)
@@ -46,25 +46,23 @@ module Squared
46
46
  else
47
47
  next unless workspace.task_include?(proj, key)
48
48
  end
49
+ next unless workspace.task_defined?(target)
50
+
49
51
  if (g = proj.group)
50
52
  id << g
51
53
  (group[:"#{key}:#{g}"] ||= []).push(target)
52
54
  else
53
55
  items << target
54
56
  end
55
- next unless (b = find_base(proj)) && (name = b.to_sym.to_s) != g
57
+ next unless (b = find_base(proj)) && (name = b.ref.to_s) != g
56
58
 
57
59
  id << name
58
60
  (parent[:"#{key}:#{name}"] ||= []).push(target)
59
61
  end
60
62
  end
61
63
 
62
- def method_missing(key, *)
63
- self[key]
64
- end
65
-
66
- def finalize!(thread = [])
67
- thread.map!(&:to_s)
64
+ def build(**kwargs)
65
+ thread = kwargs.fetch(:parallel, []).map(&:to_s)
68
66
  group, parent, id = @session.values
69
67
  merge!(parent) if id.uniq.size > 1
70
68
  merge!(group)
@@ -93,6 +91,10 @@ module Squared
93
91
  @session = nil
94
92
  end
95
93
 
94
+ def method_missing(key, *)
95
+ self[key]
96
+ end
97
+
96
98
  def has?(key)
97
99
  !key.nil? && key?(key = key.to_sym) && !self[key].empty?
98
100
  end
@@ -116,7 +118,7 @@ module Squared
116
118
  private
117
119
 
118
120
  def already_invoked?(list, val)
119
- return list.include?(val) && invoked?(val) if val
121
+ return list.include?(val) && Common::Task.invoked?(val) if val
120
122
 
121
123
  ::Rake::Task.tasks.any? { |item| item.already_invoked && list.include?(item.name) }
122
124
  end
@@ -5,6 +5,8 @@ require_relative 'common'
5
5
  module Squared
6
6
  module Workspace
7
7
  class << self
8
+ include Common
9
+
8
10
  def resolve(*args)
9
11
  ret = args.map do |id|
10
12
  if id.is_a?(::Symbol)
@@ -21,7 +23,7 @@ module Squared
21
23
  ret = project(name)
22
24
  return ret if ret&.path&.directory?
23
25
 
24
- raise NoMethodError, "project is not initialized (#{name})"
26
+ raise NoMethodError, message('project is not initialized', hint: name)
25
27
  end
26
28
 
27
29
  def project?(name)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squared
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-10 00:00:00.000000000 Z
11
+ date: 2024-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake