tebako 0.8.4 → 0.8.6

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: b43c94809ed1e1d7ad41d66c9092ae6b7c407c732c86dd1223799b857bd92d27
4
- data.tar.gz: d5c772c813731c424b6e85f157bf9a18354b00201a6691f58032695123b3c74e
3
+ metadata.gz: 17722a182f3df63283d1b99ede4bb8a3bae7a864eb001412165cbf7e43d2c4d5
4
+ data.tar.gz: '029dd9ec847efd8f0002b148e4db1496d6a09c005879b52ae88f088e6333e1ba'
5
5
  SHA512:
6
- metadata.gz: bcd2e75b1a14c3b6abfdea79311adffc6cda1cac33bdcf9d82e9d5ffe49ccbe355fd4672d518f32af2e51d54dbd3b06c5a57052795d075da005cfdb361414e12
7
- data.tar.gz: 2d2034828dcb86ca8eca33dc50e5885fe5b33a0a274ec8c347bbde33c4ac8948964934ccd91fc999edbc1f5425eae3f24c594f67cab4479917ed6373398571b5
6
+ metadata.gz: 4425672dd1e610017539d3c329ab476e6f5080a91b81f9afda7c0aabeb82f6b83fdf29b4e5e1ff9b604c7eb1d20b61b029442ab902736680c33b32ba7c66fb9c
7
+ data.tar.gz: 5144425b8ebe468462352db8da92c2ea6483a365bd88e7dd992d3d09dbac1bb0f4f57865e1e298adcc8e66ff3a90f4e21f85b9ffba6ff624fca42a05a1c5f85f
data/CMakeLists.txt CHANGED
@@ -113,6 +113,7 @@ else(OSTYPE_RES EQUAL 0)
113
113
  message(FATAL_ERROR "Failed to detect OSTYPE: ${OSTYPE_TXT}")
114
114
  endif(OSTYPE_RES EQUAL 0)
115
115
 
116
+ set(IS_GNU OFF)
116
117
  set(IS_MUSL OFF)
117
118
  set(IS_MSYS OFF)
118
119
  set(IS_DARWIN OFF)
@@ -121,8 +122,18 @@ set(RUBY_WITHOUT_EXT "dbm,win32,win32ole,-test-/*")
121
122
  set(RUBY_NAME "ruby")
122
123
  set(EXE_SUFFIX "")
123
124
  set(DWARFS_PRELOAD OFF)
124
-
125
- if("${OSTYPE_TXT}" MATCHES "^linux-musl.*")
125
+ set(WITH_PATCHELF OFF)
126
+
127
+ if("${OSTYPE_TXT}" MATCHES "^linux-gnu.*")
128
+ set(IS_GNU ON)
129
+ if(REMOVE_GLIBC_PRIVATE)
130
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
131
+ set(WITH_PATCHELF ON)
132
+ else()
133
+ message(WARNING "Elf file patching is supported for GNU toolchain only. 'patchelf' setting ignored")
134
+ endif()
135
+ endif(REMOVE_GLIBC_PRIVATE)
136
+ elseif("${OSTYPE_TXT}" MATCHES "^linux-musl.*")
126
137
  set(IS_MUSL ON)
127
138
  elseif("${OSTYPE_TXT}" MATCHES "^msys*")
128
139
  set(IS_MSYS ON)
@@ -180,9 +191,7 @@ set(DATA_RES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/resources)
180
191
  # External projects
181
192
 
182
193
  if ("-${RUBY_VER}" STREQUAL "-" OR "-${RUBY_HASH}" STREQUAL "-")
183
- set(RUBY_VER "3.1.4")
184
- set(RUBY_HASH "a3d55879a0dfab1d7141fdf10d22a07dbf8e5cdc4415da1bde06127d5cc3c7b6")
185
- message(STATUS "Using default Ruby version ${RUBY_VER}")
194
+ message(FATAL_ERROR "Ruby version is not specified")
186
195
  endif()
187
196
 
188
197
  set(RUBY_NAME ruby)
@@ -204,9 +213,11 @@ string(CONCAT RUBY_API_VER ${RUBY_VER_BASE} ".0")
204
213
  # list(GET LIBDWARFS_WR_VER_COMPONENTS 2 LIBDWARFS_WR_VER_PATCH)
205
214
  # set (LIBDWARFS_WR_VER_M ${LIBDWARFS_WR_VER_MAJOR}.${LIBDWARFS_WR_VER_MINOR}.${LIBDWARFS_WR_VER_PATCH})
206
215
  #else(DWARFS_PRELOAD)
207
- def_ext_prj_g(DWARFS_WR "v0.5.8")
216
+ def_ext_prj_g(DWARFS_WR "v0.5.9")
208
217
  #endif(DWARFS_PRELOAD)
209
218
 
219
+ def_ext_prj_g(PATCHELF "master")
220
+
210
221
  set(LIBYAML_RUBY_OPTION "")
211
222
  if(${RUBY_VER} VERSION_LESS "3.2.0")
212
223
  set(LIBYAML_RUBY_OPTION "--enable-bundled-libyaml")
@@ -266,6 +277,7 @@ message(STATUS "Target local directory: ${TLD}")
266
277
  message(STATUS "Target Gem directory:: ${TGD}")
267
278
  message(STATUS "FS_MOUNT_POINT: ${FS_MOUNT_POINT}")
268
279
  message(STATUS "Building for Win32 Ruby (RB_W32): ${RB_W32}")
280
+ message(STATUS "Removing GLIBC_PRIVATE reference: ${WITH_PATCHELF}")
269
281
 
270
282
  # ...................................................................
271
283
  # Other options
@@ -307,7 +319,7 @@ if(DWARFS_PRELOAD)
307
319
  )
308
320
  else(DWARFS_PRELOAD)
309
321
  ExternalProject_Add(${DWARFS_WR_PRJ}
310
- PREFIX ${DEPS}
322
+ PREFIX ${DEPS}
311
323
  GIT_REPOSITORY https://github.com/tamatebako/libdwarfs.git
312
324
  GIT_TAG ${DWARFS_WR_TAG}
313
325
  SOURCE_DIR ${DWARFS_WR_SOURCE_DIR}
@@ -328,11 +340,27 @@ else(DWARFS_PRELOAD)
328
340
  )
329
341
  endif(DWARFS_PRELOAD)
330
342
 
343
+ if(IS_GNU)
344
+ ExternalProject_Add(${PATCHELF_PRJ}
345
+ PREFIX ${DEPS}
346
+ GIT_REPOSITORY https://github.com/chitao1234/patchelf.git
347
+ GIT_TAG ${PATCHELF_WR_TAG}
348
+ SOURCE_DIR ${PATCHELF_SOURCE_DIR}
349
+ BINARY_DIR ${PATCHELF_BINARY_DIR}
350
+ UPDATE_COMMAND ""
351
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir ${PATCHELF_SOURCE_DIR} ./bootstrap.sh
352
+ COMMAND ${PATCHELF_SOURCE_DIR}/configure
353
+ --srcdir=${PATCHELF_SOURCE_DIR}
354
+ --prefix=${DEPS}
355
+ TEST_COMMAND ""
356
+ )
357
+ endif(IS_GNU)
358
+
331
359
  # ...................................................................
332
360
  # Ruby
333
361
 
334
362
  set(RUBY_L_FLAGS "-L${DEPS_LIB_DIR} -L${CMAKE_CURRENT_BINARY_DIR}")
335
- set(RUBY_C_FLAGS "-pthread -I${DEPS_INCLUDE_DIR} -I${CMAKE_CURRENT_SOURCE_DIR}/include")
363
+ set(RUBY_C_FLAGS "-fPIC -I${DEPS_INCLUDE_DIR} -I${CMAKE_CURRENT_SOURCE_DIR}/include")
336
364
 
337
365
  # Shadow
338
366
  # https://github.com/deivid-rodriguez/byebug/issues/825
@@ -341,16 +369,13 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
341
369
  string(CONCAT RUBY_C_FLAGS ${RUBY_C_FLAGS} " -fdeclspec")
342
370
  endif()
343
371
 
344
- set(C_FLAGS_DEST cppflags)
372
+ set(C_FLAGS_DEST cflags)
345
373
 
346
374
  if(IS_DARWIN)
347
375
  string(CONCAT RUBY_C_FLAGS ${RUBY_C_FLAGS} " -I${BREW_PREFIX}/opt/openssl@${OPENSSL_VER}/include -I${BREW_PREFIX}/opt/zlib/include -I${BREW_PREFIX}/include")
348
376
  string(CONCAT RUBY_L_FLAGS ${RUBY_L_FLAGS} " -L${BREW_PREFIX}/opt/openssl@${OPENSSL_VER}/lib -L${BREW_PREFIX}/opt/zlib/lib -L${BREW_PREFIX}/lib")
349
377
  set(OPENSSL_RUBY_OPTION "--with-openssl-dir=${BREW_PREFIX}/opt/openssl@${OPENSSL_VER}")
350
- set(C_FLAGS_DEST cflags)
351
378
  else(IS_DARWIN)
352
- string(CONCAT RUBY_L_FLAGS ${RUBY_L_FLAGS} " -static-libgcc")
353
-
354
379
  if(IS_MUSL)
355
380
  string(CONCAT RUBY_C_FLAGS ${RUBY_C_FLAGS} " -DENABLE_PATH_CHECK=0")
356
381
  endif(IS_MUSL)
@@ -358,7 +383,13 @@ else(IS_DARWIN)
358
383
  if(RB_W32)
359
384
  string(CONCAT RUBY_C_FLAGS ${RUBY_C_FLAGS} " -DRB_W32=1")
360
385
  string(CONCAT RUBY_L_FLAGS ${RUBY_L_FLAGS} " -l:libstdc++.a -L${TLIBD}")
386
+ set(C_FLAGS_DEST cppflags)
361
387
  endif(RB_W32)
388
+
389
+ # Ruby 2.7 configure script error
390
+ if(${RUBY_VER} VERSION_LESS "3.0.0")
391
+ set(C_FLAGS_DEST cppflags)
392
+ endif()
362
393
  endif(IS_DARWIN)
363
394
 
364
395
  message(STATUS "Ruby build ${C_FLAGS_DEST}='${RUBY_C_FLAGS}'")
@@ -393,6 +424,11 @@ ExternalProject_Add(${RUBY_PRJ}
393
424
 
394
425
  add_dependencies(${RUBY_PRJ} ${DWARFS_WR_PRJ} ${LIBDWARFS_WR_PRJ})
395
426
 
427
+ if(IS_GNU)
428
+ add_dependencies(${RUBY_PRJ} ${PATCHELF_PRJ})
429
+ endif(IS_GNU)
430
+
431
+
396
432
  if (${SETUP_MODE})
397
433
  add_custom_target(setup
398
434
  ${CMAKE_COMMAND} -E echo "Tebako setup has completed"
@@ -491,7 +527,7 @@ else (${SETUP_MODE})
491
527
 
492
528
  add_dependencies(tebako-fs packaged_filesystem)
493
529
 
494
- add_custom_target(tebako COMMAND ruby ${EXE}/tebako-packager finalize ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${APP_NAME} ${RUBY_VER})
530
+ add_custom_target(tebako COMMAND ruby ${EXE}/tebako-packager finalize ${OSTYPE_TXT} ${RUBY_SOURCE_DIR} ${APP_NAME} ${RUBY_VER} ${DEPS_BIN_DIR}/patchelf ${WITH_PATCHELF})
495
531
  add_dependencies(tebako setup tebako-fs)
496
532
 
497
533
  endif(${SETUP_MODE})
data/README.adoc CHANGED
@@ -657,6 +657,7 @@ tebako press \
657
657
  [-l|--log-level=<error|warn|debug|trace>] \
658
658
  [-c|--cwd=<package current working directory>]
659
659
  [-D|--devmode] \
660
+ [-P|--patchelf] \
660
661
  [-t|--tebafile=<path-to-tebafile>]
661
662
  ----
662
663
 
@@ -689,12 +690,17 @@ If not provided, the application will start within the current folder of the hos
689
690
  This option is required because it is not possible to change the directory to a memfs folder until the package is started, as opposed to any host folder
690
691
  that can be set as the current directory before Tebako package invocation. Tebako saves original working directory in a global Ruby variable `$tebako_original_pwd`.
691
692
 
693
+ `devmode`:: flag that activates development mode, in which Tebako's cache and
694
+ packaging consistency checks are relaxed.
695
+
696
+ `patchelf`::
697
+ flag that removal a reference to GLIBC_PRIVATE version of libpthread from tebako package. This allows Linux Gnu packages to run against versions of
698
+ libpthread that differ from the version used for packaging. For example, package created at Ubuntu 20 system can be used on Ubuntu 22. This option works on Gnu Linux with
699
+ Gnu toolchain only (not for LLVM/clang). The feature is exeprimental, we may consider other approach in the future.
700
+
692
701
  `tebafile`::
693
702
  the tebako configuration file (optional, defaults to `$PWD/.tebako.yml`).
694
703
  Please refer to the separate section below for tebafile description.
695
-
696
- `devmode`:: flag that activates development mode, in which Tebako's cache and
697
- packaging consistency checks are relaxed.
698
704
  +
699
705
  NOTES:
700
706
  * Development mode is *not intended for production use* and should only be used during development.
data/common.env CHANGED
@@ -1,5 +1,5 @@
1
1
  BUILD_TYPE=Release
2
2
  DEPS=deps
3
3
  INCBIN_TAG=348e36b
4
- DWARFS_WR_TAG=v0.5.8
4
+ DWARFS_WR_TAG=v0.5.9
5
5
  RUBY_VER=3.2.5
data/exe/tebako-packager CHANGED
@@ -105,12 +105,15 @@ begin
105
105
  # ARGV[2] -- RUBY_SOURCE_DIR
106
106
  # ARGV[3] -- APP_NAME
107
107
  # ARGV[4] -- RUBY_VER
108
- unless ARGV.length == 5
108
+ # ARGV[5] -- patchelf executable
109
+ # ARGV[6] -- WITH_PATHELF
110
+ unless ARGV.length == 7
109
111
  raise Tebako::Error,
110
- "tebako-packager finalize command expects 5 arguments, #{ARGV.length} has been provided."
112
+ "tebako-packager finalize command expects 7 arguments, #{ARGV.length} has been provided."
111
113
  end
112
114
  ruby_ver = Tebako::RubyVersion.new(ARGV[4])
113
- Tebako::Packager.finalize(ARGV[1], ARGV[2], ARGV[3], ruby_ver)
115
+ with_patchelf = ARGV[6].casecmp("ON").zero? || ARGV[6].casecmp("YES").zero?
116
+ Tebako::Packager.finalize(ARGV[1], ARGV[2], ARGV[3], ruby_ver, with_patchelf ? ARGV[5] : nil)
114
117
  else
115
118
  raise Tebako::Error, "tebako-packager cannot process #{ARGV[0]} command"
116
119
  end
@@ -39,7 +39,7 @@ module Tebako
39
39
  out, st = Open3.capture2e("nproc", "--all")
40
40
  end
41
41
 
42
- if st.exitstatus.zero?
42
+ if !st.signaled? && st.exitstatus.zero?
43
43
  out.strip.to_i
44
44
  else
45
45
  4
@@ -49,7 +49,7 @@ module Tebako
49
49
  def run_with_capture(args)
50
50
  puts " ... @ #{args.join(" ")}"
51
51
  out, st = Open3.capture2e(*args)
52
- raise Tebako::Error, "Failed to run #{args.join(" ")} (#{st}):\n #{out}" unless st.exitstatus.zero?
52
+ raise Tebako::Error, "Failed to run #{args.join(" ")} (#{st}):\n #{out}" if st.signaled? || !st.exitstatus.zero?
53
53
 
54
54
  out
55
55
  end
data/lib/tebako/cli.rb CHANGED
@@ -46,7 +46,7 @@ module Tebako
46
46
  package_name "Tebako"
47
47
  class_option :prefix, type: :string, aliases: "-p", required: false,
48
48
  desc: "A path to tebako packaging environment, '~/.tebako' ('$HOME/.tebako') by default"
49
- class_option :devmode, type: :boolean, aliases: "-D", required: false,
49
+ class_option :devmode, type: :boolean, aliases: "-D",
50
50
  desc: "Developer mode, please do not use if unsure"
51
51
  class_option :tebafile, type: :string, aliases: "-t", required: false,
52
52
  desc: "tebako configuration file 'tebafile', '$PWD/.tebako.yml' by default"
@@ -75,7 +75,13 @@ module Tebako
75
75
 
76
76
  CWD_DESCRIPTION = <<~DESC
77
77
  Current working directory for packaged application. This directory shall be specified relative to root.
78
- #{" " * 62}# If this parameter is not set, the application will start in the current directory of the host file system.
78
+ #{" " * 65}# If this parameter is not set, the application will start in the current directory of the host file system.
79
+ DESC
80
+
81
+ RGP_DESCRIPTION = <<~DESC
82
+ Activates removal a reference to GLIBC_PRIVATE version of libpthread from tebako package. This allows Linux Gnu packages to run against versions of
83
+ #{" " * 65}# libpthread that differ from the version used for packaging. For example, package created at Ubuntu 20 system can be used on Ubuntu 22. This option works on Gnu Linux with
84
+ #{" " * 65}# Gnu toolchain only (not for LLVM/clang). The feature is exeprimental, we may consider other approach in the future.
79
85
  DESC
80
86
 
81
87
  desc "press", "Press tebako image"
@@ -91,6 +97,8 @@ module Tebako
91
97
  method_option :Ruby, type: :string, aliases: "-R", required: false,
92
98
  enum: Tebako::CliRubies::RUBY_VERSIONS.keys,
93
99
  desc: "Tebako package Ruby version, #{Tebako::CliRubies::DEFAULT_RUBY_VERSION} by default"
100
+ method_option :patchelf, aliases: "-P", type: :boolean,
101
+ desc: RGP_DESCRIPTION
94
102
  def press
95
103
  version_cache_check unless options[:devmode]
96
104
 
@@ -56,7 +56,7 @@ module Tebako
56
56
  @cfg_options ||=
57
57
  "-DCMAKE_BUILD_TYPE=Release -DRUBY_VER:STRING=\"#{ruby_ver}\" -DRUBY_HASH:STRING=\"#{ruby_hash}\" " \
58
58
  "-DDEPS:STRING=\"#{deps}\" -G \"#{m_files}\" -B \"#{output_folder}\" -S \"#{source}\" " \
59
- "-DTEBAKO_VERSION:STRING=\"#{Tebako::VERSION}\""
59
+ "-DREMOVE_GLIBC_PRIVATE=#{remove_glibc_private} -DTEBAKO_VERSION:STRING=\"#{Tebako::VERSION}\""
60
60
  end
61
61
 
62
62
  def clean_cache
@@ -174,6 +174,10 @@ module Tebako
174
174
  end
175
175
  end
176
176
 
177
+ def remove_glibc_private
178
+ @remove_glibc_private ||= options["patchelf"] ? "ON" : "OFF"
179
+ end
180
+
177
181
  def handle_nil_prefix
178
182
  env_prefix = ENV.fetch("TEBAKO_PREFIX", nil)
179
183
  if env_prefix.nil?
@@ -100,7 +100,7 @@ module Tebako
100
100
  end
101
101
 
102
102
  def needs_bundler?
103
- @gf_length.positive?
103
+ @gf_length.positive? && !@ruby_ver.ruby31?
104
104
  end
105
105
 
106
106
  def update_rubygems
@@ -171,14 +171,28 @@ module Tebako
171
171
  end
172
172
 
173
173
  def configure_commands
174
- @cmd_suffix = @os_type =~ /msys/ ? ".cmd" : ""
175
- @bat_suffix = @os_type =~ /msys/ ? ".bat" : ""
174
+ if @os_type =~ /msys/
175
+ configure_commands_msys
176
+ else
177
+ configure_commands_not_msys
178
+ end
176
179
 
177
180
  @gem_command = File.join(@tbd, "gem#{@cmd_suffix}")
178
181
  @bundler_command = File.join(@tbd, "bundle#{@bat_suffix}")
182
+ end
183
+
184
+ def configure_commands_msys
185
+ @cmd_suffix = ".cmd"
186
+ @bat_suffix = ".bat"
187
+ @force_ruby_platform = "true"
188
+ @nokogiri_option = "--use-system-libraries"
189
+ end
179
190
 
180
- @force_ruby_platform = @os_type =~ /msys|linux-musl/ ? "true" : "false"
181
- @nokogiri_option = @os_type =~ /msys/ ? "--use-system-libraries" : "--no-use-system-libraries"
191
+ def configure_commands_not_msys
192
+ @cmd_suffix = ""
193
+ @bat_suffix = ""
194
+ @force_ruby_platform = "false"
195
+ @nokogiri_option = "--no-use-system-libraries"
182
196
  end
183
197
 
184
198
  def configure_scenario
@@ -71,7 +71,6 @@ module Tebako
71
71
 
72
72
  class << self
73
73
  def get_main_c_patch(ruby_ver)
74
- puts get_main_c_main_pattern(ruby_ver)
75
74
  {
76
75
  get_main_c_main_pattern(ruby_ver) => get_main_c_main_subst(ruby_ver),
77
76
  "ruby_init();" => MAIN_C_SUBST_RB_MAIN_INNER,
@@ -71,8 +71,7 @@ module Tebako
71
71
  puts " ... creating Windows import library"
72
72
  params = ["dlltool", "-d", def_fname(src_dir, app_name), "-D", out_fname(app_name),
73
73
  "--output-lib", lib_fname(package_src_dir, ruby_ver)]
74
- out, st = Open3.capture2e(*params)
75
- raise Tebako::Error, "Failed to create import library:\n #{out}" unless st.exitstatus.zero?
74
+ BuildHelpers.run_with_capture(params)
76
75
  end
77
76
 
78
77
  # Deploy
@@ -85,18 +84,16 @@ module Tebako
85
84
  Tebako::Stripper.strip(os_type, target_dir)
86
85
  end
87
86
 
88
- def finalize(os_type, src_dir, app_name, ruby_ver)
87
+ def finalize(os_type, src_dir, app_name, ruby_ver, patchelf)
89
88
  RubyBuilder.new(ruby_ver, src_dir).final_build
90
89
  exe_suffix = Packager::PatchHelpers.exe_suffix(os_type)
91
90
  src_name = File.join(src_dir, "ruby#{exe_suffix}")
92
- package_name = "#{app_name}#{exe_suffix}"
93
- # [TODO] On MSys strip sometimes creates a broken executable
94
- # https://github.com/tamatebako/tebako/issues/172
95
- if Packager::PatchHelpers.msys?(os_type)
96
- FileUtils.cp(src_name, package_name)
97
- else
98
- Tebako::Stripper.strip_file(src_name, package_name)
91
+ unless patchelf.nil?
92
+ params = [patchelf, "--remove-needed-version", "libpthread.so.0", "GLIBC_PRIVATE", src_name]
93
+ BuildHelpers.run_with_capture(params)
99
94
  end
95
+ package_name = "#{app_name}#{exe_suffix}"
96
+ strip_or_copy(os_type, src_name, package_name)
100
97
  puts "Created tebako package at \"#{package_name}\""
101
98
  end
102
99
 
@@ -199,6 +196,16 @@ module Tebako
199
196
  end
200
197
  ruby_version
201
198
  end
199
+
200
+ def strip_or_copy(os_type, src_name, package_name)
201
+ # [TODO] On MSys strip sometimes creates a broken executable
202
+ # https://github.com/tamatebako/tebako/issues/172
203
+ if Packager::PatchHelpers.msys?(os_type)
204
+ FileUtils.cp(src_name, package_name)
205
+ else
206
+ Tebako::Stripper.strip_file(src_name, package_name)
207
+ end
208
+ end
202
209
  end
203
210
  end
204
211
  end
@@ -26,5 +26,5 @@
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
28
  module Tebako
29
- VERSION = "0.8.4"
29
+ VERSION = "0.8.6"
30
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tebako
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-17 00:00:00.000000000 Z
11
+ date: 2024-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor