pindo 5.20.4 → 5.20.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 51a9e1f1176906c3f5cc98d5c8654bd194c2199eca4d056c5d24b84d321a0e7f
4
- data.tar.gz: 983e11201e2b488800fb65a745300fc71184e068e01f94255ae29d2f469c3d02
3
+ metadata.gz: e05f84df2bd17ab7420a8975c8a6811f24080b11a4080391aff016f6f010b18f
4
+ data.tar.gz: 16c2db8376e2ec3e3f38ef5e0bd45eddaffb8434c65df25a95c27cdd265db469
5
5
  SHA512:
6
- metadata.gz: 140c5a77bf8ad4e46547a60caef4587e04811450624a0c19213b978fae267078b8d6370486209531d4116ab202670ce12a707edc93c7299df1e4e244f389668d
7
- data.tar.gz: f646d8f611a70c2ad39bdaa31ef69f55f4a0946ed3e1c90a27d806072ca2484c1bcf7ec8073d9e381031d2ab645aceaf5387cb13b8e90ed6e20070acee5f5a6a
6
+ metadata.gz: 14c3dd4dad433a639f118211ff83a2aed05b9ce63155c45c9f3293c1f52a6b39d1161ca1b1b175f1104fd51af54466e17d36c39c5fbafed8e6bfa0783827d143
7
+ data.tar.gz: d3675cbbfb84617cf00c13284c7450d69b4edf7bea3159c477d45cdb4db4327515bb50fba9c3b2fa4d31a9513f6222661f3652b9193350acfb959ada39bc9e5c
@@ -198,8 +198,6 @@ module Pindo
198
198
 
199
199
  puts "package_type #{package_type} manage_type: #{manage_type}"
200
200
 
201
- Funlog.instance.fancyinfo_success("获取工作流列表成功,共 #{workflows.size} 个工作流")
202
-
203
201
  # 2. 根据 manage_type 或 package_type 过滤工作流
204
202
  if manage_type == "git"
205
203
  # manage_type 为 git 时,只筛选 manage_type == "git" 的工作流,不看 package_type
@@ -249,6 +247,10 @@ module Pindo
249
247
  display_workflows = filtered_workflows
250
248
  end
251
249
 
250
+ # 过滤后再报数:只报总数会让人以为剩下的工作流被漏掉了,
251
+ # 实际是按 manage_type / package_type 筛掉的,两个数字一起给出才不歧义
252
+ Funlog.instance.fancyinfo_success("获取工作流列表成功,共 #{workflows.size} 个工作流,其中 #{type_desc} #{display_workflows.size} 个")
253
+
252
254
  # 2.5 若指定了 workflow_name,按名称精确匹配(忽略大小写与首尾空格)确定性选择。
253
255
  # 只接受完整精确匹配,不做子串模糊匹配,避免 "Production" 误命中 "Legacy Production Upload"。
254
256
  if workflow_name && !workflow_name.to_s.strip.empty? && !display_workflows.empty?
@@ -849,6 +851,16 @@ module Pindo
849
851
 
850
852
  # 计算上传耗时
851
853
  upload_duration = Time.now - upload_start_time
854
+
855
+ # upload_file 失败时返回 nil。不在这里拦住的话,后面会照常打印「上传完成」
856
+ # 和一个拿完整文件大小除以失败耗时算出来的假速度,再去做无谓的附件上传,
857
+ # 直到提交包信息前才失败——日志里先 ❌ 后 ✅ 就是这么来的。
858
+ if upload_res.nil?
859
+ Funlog.instance.fancyinfo_error("文件上传失败! 耗时: #{upload_duration.round(2)} 秒")
860
+ puts " 失败原因见上方日志;加 --verbose 重跑可看到接口返回的 code/msg"
861
+ raise Informative, "上传失败!"
862
+ end
863
+
852
864
  upload_speed = file_size_mb / upload_duration
853
865
  puts "✅ 文件上传完成! 耗时: #{upload_duration.round(2)} 秒, 平均速度: #{upload_speed.round(2)} MB/s"
854
866
 
@@ -865,8 +877,15 @@ module Pindo
865
877
 
866
878
  # 计算附件上传耗时
867
879
  attach_duration = Time.now - attach_start_time
868
- attach_speed = attach_size_mb / attach_duration
869
- puts "✅ 附件上传完成! 耗时: #{attach_duration.round(2)} 秒, 平均速度: #{attach_speed.round(2)} MB/s"
880
+
881
+ # 同主文件:nil 即失败,不能照打「上传完成」。
882
+ # 但附件失败不阻断主包流程(下方 rescue 也是这个取向),只如实报告。
883
+ if attach_key_url.nil?
884
+ Funlog.instance.fancyinfo_warning("附件上传失败! 耗时: #{attach_duration.round(2)} 秒(不影响主包上传)")
885
+ else
886
+ attach_speed = attach_size_mb / attach_duration
887
+ puts "✅ 附件上传完成! 耗时: #{attach_duration.round(2)} 秒, 平均速度: #{attach_speed.round(2)} MB/s"
888
+ end
870
889
  end
871
890
 
872
891
  if !attach_key_url.nil?
@@ -1780,78 +1799,101 @@ module Pindo
1780
1799
 
1781
1800
  # 获取特定 commit 已绑定的包 ID
1782
1801
  #
1783
- # project_package/bind_list(按 projectId 查项目下全部绑定),而不是
1784
- # commit_log/preview(按 workflowId 过滤):写入接口 bind_commit 只认全局 commitId、
1785
- # 且是覆盖式的,查询作用域必须与之一致,否则查漏的平台会在覆盖时被删掉。
1802
+ # 数据源是 commit_log/preview bindVersions。
1803
+ #
1804
+ # 不能用 project_package/bind_list:它按 projectId 查、作用域看似更宽,
1805
+ # 但实测(项目 930 条记录)每条的 commitId、branch、workflowId、commitLogs
1806
+ # 全部为 nil——该接口只返回包本身,不携带 commit 绑定关系,
1807
+ # 按 commitId 过滤会恒得空列表,进而让覆盖式写入误删该 commit 的已有绑定。
1808
+ #
1809
+ # preview 需要传 workflowId,但实测同项目下不同 workflowId(3457 / 2650)
1810
+ # 返回的 bindVersions 完全一致——绑定按 commitId 全局记录,
1811
+ # 不存在"按工作流查漏、覆盖时被删掉"的问题。
1786
1812
  #
1787
1813
  # 绑定接口是覆盖式写入,调用方需要把已绑定的包一起提交,因此必须区分
1788
1814
  # 「确认没有绑定过」和「查不出来」——后者返回空数组会导致已有绑定被静默覆盖丢失。
1789
1815
  #
1790
1816
  # @param commit_id [String] Git commit SHA(必需)
1791
- # @param project_id [String] JPS 项目 ID(必需)
1817
+ # @param workflow_id [Integer, String] 工作流 ID(必需,接口入参)
1792
1818
  # @return [Array<String>, nil] 已绑定的包 ID 数组;查询失败或结构异常时返回 nil
1793
- def get_commit_bound_package_ids(commit_id:, project_id:)
1819
+ def get_commit_bound_package_ids(commit_id:, workflow_id:)
1794
1820
  if commit_id.nil? || commit_id.empty?
1795
1821
  Funlog.instance.fancyinfo_warning("commit_id 为空,无法查询已绑定的包")
1796
1822
  return nil
1797
1823
  end
1798
1824
 
1799
- if project_id.nil? || project_id.to_s.empty?
1800
- Funlog.instance.fancyinfo_warning("project_id 为空,无法查询已绑定的包")
1825
+ if workflow_id.nil? || workflow_id.to_s.empty?
1826
+ Funlog.instance.fancyinfo_warning("workflow_id 为空,无法查询已绑定的包")
1801
1827
  return nil
1802
1828
  end
1803
1829
 
1804
1830
  begin
1805
- result = @pgyer_client.get_project_package_bind_list(projectId: project_id)
1831
+ result = @pgyer_client.get_commit_log_preview(
1832
+ workflowId: workflow_id,
1833
+ commitIds: [commit_id],
1834
+ params: { onlyCliff: false }
1835
+ )
1806
1836
 
1807
1837
  # 兼容两种响应格式
1808
1838
  response_code = result&.dig("code") || result&.dig("meta", "code")
1809
1839
 
1810
1840
  unless result && (response_code == 0 || response_code == 200)
1811
1841
  error_msg = result&.dig("msg") || result&.dig("meta", "message") || "未知错误"
1812
- Funlog.instance.fancyinfo_warning("查询项目 #{project_id} 的包绑定列表失败: #{error_msg}")
1813
- debug_dump_bind_list_response(result)
1842
+ Funlog.instance.fancyinfo_warning("查询 Commit #{commit_id[0..7]} 的绑定信息失败: #{error_msg}")
1814
1843
  return nil
1815
1844
  end
1816
1845
 
1817
1846
  data = result&.dig("data")
1818
1847
 
1819
- # 接口没有返回数据:项目下没有任何绑定,此时也就不存在会被覆盖丢失的绑定
1820
- return [] if data.nil?
1821
-
1822
- # 接口定义返回 map<String, List<ProjectPackagePreviewInfo>>。
1823
- # 必须先校验类型再判空——[] "" respond_to?(:empty?),
1824
- # 先判空会把结构异常的响应误判成「项目下无绑定」,随后覆盖写入清掉已有绑定。
1825
- # 分组键的语义(commitId / 平台类型)不影响结果:每条记录自带 commitId,按它过滤即可。
1826
- unless data.is_a?(Hash)
1827
- Funlog.instance.fancyinfo_warning("包绑定列表结构异常(#{data.class}),无法确认已有绑定")
1828
- debug_dump_bind_list_response(result)
1829
- return nil
1848
+ # code=0 且 data=nil 是接口表达「没有这条 commit」的正常响应(实测确认),
1849
+ # 不是畸形响应。此时该 commit 还没进 commit log,不可能有已记录的绑定。
1850
+ # 若误判为 nil,首次绑定(commit log 尚未生成)会被整体阻断。
1851
+ if data.nil?
1852
+ puts "[PINDO_DEBUG] Commit #{commit_id[0..7]} 不在 commit log 中,视为未绑定" if ENV['PINDO_DEBUG']
1853
+ return []
1830
1854
  end
1831
1855
 
1832
- # map:确认项目下没有绑定
1833
- return [] if data.empty?
1856
+ list = data.is_a?(Array) ? data : [data]
1857
+ matched = list.select { |item| item.is_a?(Hash) && same_commit?(item["commitId"], commit_id) }
1834
1858
 
1859
+ # 接口正常返回但没有这条 commit:该 commit 还没进 commit log,
1860
+ # 也就不可能有已记录的绑定
1861
+ if matched.empty?
1862
+ puts "[PINDO_DEBUG] Commit #{commit_id[0..7]} 不在 commit log 中,视为未绑定" if ENV['PINDO_DEBUG']
1863
+ return []
1864
+ end
1865
+
1866
+ # 同一个 commitId 在 commit log 里可能对应多条记录(push 一条、tag 一条,
1867
+ # 实测 commit_log/list 可见),哪条带 bindVersions 没有契约保证。
1868
+ # 只取第一条匹配会漏读绑定,进而让覆盖式写入删掉已有绑定,
1869
+ # 因此合并所有匹配记录的绑定。
1835
1870
  package_ids = []
1836
- data.each do |group_key, packages|
1837
- unless packages.is_a?(Array)
1838
- Funlog.instance.fancyinfo_warning("包绑定列表分组 #{group_key} 结构异常(#{packages.class}),无法确认已有绑定")
1871
+ matched.each do |commit_info|
1872
+ bind_versions = commit_info["bindVersions"]
1873
+
1874
+ # 该记录没有绑定信息:未绑定的 commit 就是 null,属正常情况
1875
+ next if bind_versions.nil?
1876
+
1877
+ unless bind_versions.is_a?(Hash)
1878
+ Funlog.instance.fancyinfo_warning("bindVersions 结构异常(#{bind_versions.class}),无法确认已有绑定")
1839
1879
  return nil
1840
1880
  end
1841
1881
 
1842
- packages.each do |pkg|
1843
- unless pkg.is_a?(Hash)
1844
- Funlog.instance.fancyinfo_warning("包绑定列表分组 #{group_key} 中存在异常条目,无法确认已有绑定")
1882
+ # bindVersions 形如 { "ipa" => { "projectPackageId" => "..." }, ... },
1883
+ # 每个平台一个包
1884
+ bind_versions.each do |platform, version_info|
1885
+ next if version_info.nil?
1886
+
1887
+ unless version_info.is_a?(Hash)
1888
+ Funlog.instance.fancyinfo_warning("bindVersions[#{platform}] 结构异常(#{version_info.class}),无法确认已有绑定")
1845
1889
  return nil
1846
1890
  end
1847
1891
 
1848
- next unless pkg["commitId"] == commit_id
1849
-
1850
- # 命中目标 commit 却拿不到包 id:静默跳过会得到残缺列表,
1851
- # 覆盖写入时等于把那个包的绑定删掉
1852
- package_id = pkg["id"]
1892
+ # 有平台条目却拿不到包 id:静默跳过会得到残缺列表,
1893
+ # 覆盖写入时等于把那个平台的绑定删掉
1894
+ package_id = version_info["projectPackageId"]
1853
1895
  if package_id.nil? || package_id.to_s.strip.empty?
1854
- Funlog.instance.fancyinfo_warning("Commit #{commit_id[0..7]} 的绑定记录缺少包 id,无法确认已有绑定")
1896
+ Funlog.instance.fancyinfo_warning("Commit #{commit_id[0..7]} #{platform} 绑定缺少 projectPackageId,无法确认已有绑定")
1855
1897
  return nil
1856
1898
  end
1857
1899
 
@@ -1859,7 +1901,7 @@ module Pindo
1859
1901
  end
1860
1902
  end
1861
1903
 
1862
- puts "[PINDO_DEBUG] Commit #{commit_id[0..7]} 已绑定 #{package_ids.size} 个包" if ENV['PINDO_DEBUG']
1904
+ puts "[PINDO_DEBUG] Commit #{commit_id[0..7]} 已绑定 #{package_ids.size} 个包: #{package_ids.inspect}" if ENV['PINDO_DEBUG']
1863
1905
  package_ids.uniq
1864
1906
  rescue => e
1865
1907
  Funlog.instance.fancyinfo_warning("查询 commit 已绑定的包异常: #{e.message}")
@@ -1868,25 +1910,25 @@ module Pindo
1868
1910
  end
1869
1911
  end
1870
1912
 
1871
- # 按白名单输出包绑定列表响应的诊断信息
1913
+ # 判断两个 commit SHA 是否指向同一个提交
1872
1914
  #
1873
- # ProjectPackagePreviewInfo 里含 cdnUrl、plistUrl、attachFiles、qrCodeUrl
1874
- # 可直接下载安装包的链接,整体 inspect 会把它们写进 CI 日志,
1875
- # 因此只输出定位问题所需的字段。
1876
- # @param result [Hash, nil] 接口原始响应
1877
- def debug_dump_bind_list_response(result)
1878
- return unless ENV['PINDO_DEBUG']
1879
-
1880
- code = result&.dig("code") || result&.dig("meta", "code")
1881
- message = result&.dig("msg") || result&.dig("meta", "message")
1882
- data = result&.dig("data")
1883
- summary = if data.is_a?(Hash)
1884
- data.map { |k, v| [k, v.is_a?(Array) ? "#{v.size} 条" : v.class.to_s] }.to_h
1885
- else
1886
- data.class.to_s
1887
- end
1888
-
1889
- puts "[PINDO_DEBUG] bind_list 响应: code=#{code.inspect} msg=#{message.inspect} data=#{summary.inspect}"
1915
+ # 一端是全长 40 SHA、另一端是短 SHA(或大小写不同)时,严格 == 会永不命中。
1916
+ # 对覆盖式写入的 bind_commit 来说这不是「查不到」而是「查成空」,
1917
+ # 会把该 commit 上已有的绑定一起删掉,因此按前缀 + 忽略大小写比对。
1918
+ # 要求较短的一方至少 7 字符,避免过短或异常值产生误匹配。
1919
+ #
1920
+ # @param sha_a [String, nil] 待比较的 SHA
1921
+ # @param sha_b [String, nil] 待比较的 SHA
1922
+ # @return [Boolean] 是否同一个提交
1923
+ def same_commit?(sha_a, sha_b)
1924
+ a = sha_a.to_s.strip.downcase
1925
+ b = sha_b.to_s.strip.downcase
1926
+ return false if a.empty? || b.empty?
1927
+
1928
+ shorter, longer = a.length <= b.length ? [a, b] : [b, a]
1929
+ return false if shorter.length < 7
1930
+
1931
+ longer.start_with?(shorter)
1890
1932
  end
1891
1933
 
1892
1934
  # 获取工作流中已绑定的包 ID(已废弃,请使用 get_commit_bound_package_ids)
@@ -26,6 +26,12 @@ module Pindo
26
26
  '**/src/main/res'
27
27
  ].freeze
28
28
 
29
+ # Unity 工程判定即要求该文件存在(BuildHelper#unity_project?),故用精确路径而非 glob,
30
+ # 避免匹配到 Packages 下嵌入工程里的同名副本。
31
+ UNITY_PATTERNS = [
32
+ 'ProjectSettings/ProjectSettings.asset'
33
+ ].freeze
34
+
29
35
  EXCLUDED_PATH_COMPONENTS = %w[
30
36
  .git
31
37
  .gradle
@@ -56,9 +62,12 @@ module Pindo
56
62
  source_paths(project_path, ANDROID_PATTERNS)
57
63
  end
58
64
 
59
- # Unity 平台工程导出到已忽略的 GoodPlatform,不提交 Unity 源码配置。
60
- def unity(_project_path)
61
- []
65
+ # 导出的平台工程落在已忽略的 GoodPlatform 里,不需要提交。
66
+ # 但 ProjectSettings.asset 是 Unity 源码配置,构建期间会被 Unity 写入
67
+ # (版本号、编译宏等),性质与 iOS 的 project.pbxproj / Info.plist 相同,
68
+ # 不提交就会在构建后残留为未提交改动,且 tag 上拿不到构建实际用的配置。
69
+ def unity(project_path)
70
+ source_paths(project_path, UNITY_PATTERNS)
62
71
  end
63
72
 
64
73
  private
@@ -27,9 +27,9 @@ module Pindo
27
27
  # @option options [String] :git_commit_time Git commit 时间(可选)
28
28
  # @option options [String] :git_commit_desc Git commit 描述(可选)
29
29
  # @option options [String] :project_dir 项目目录(可选,用于自动获取 commit 信息)
30
- # @option options [Hash] :app_info_obj JPS 应用信息对象(必需,用于取 project_id;
31
- # 绑定与查询都以项目为作用域,不再依赖 workflow_info
32
- # @option options [Hash] :workflow_info 工作流信息(可选,继承自基类,本任务不使用)
30
+ # @option options [Hash] :app_info_obj JPS 应用信息对象(可选,继承自基类,本任务不使用)
31
+ # @option options [Hash] :workflow_info 工作流信息(必需,用于取 workflow_id;
32
+ # 回读绑定走 commit_log/preview,该接口以 workflowId 为入参)
33
33
  # @option options [String] :project_name 项目名称(可选,继承自基类)
34
34
  def initialize(app_version_list = nil, options = {})
35
35
  # 兼容性处理:如果传入的是单个 Hash,转为数组
@@ -142,16 +142,18 @@ module Pindo
142
142
  raise "无法登录 JPS,请检查配置"
143
143
  end
144
144
 
145
- # 6. 获取项目 ID(绑定与查询都以项目为作用域)
146
- project_id = @app_info_obj&.dig("id") || @app_info_obj&.dig(:id)
147
- unless project_id
148
- raise "缺少 app_info_obj,无法获取 project_id"
145
+ # 6. 获取工作流 ID(commit_log/preview 的入参;绑定本身按 commitId 全局记录,
146
+ # 同项目下任一 workflowId 查到的 bindVersions 都相同)
147
+ workflow_id = @workflow_info&.dig(:workflow_id) || @workflow_info&.dig('workflow_id') ||
148
+ @workflow_info&.dig(:id) || @workflow_info&.dig('id')
149
+ unless workflow_id
150
+ raise "缺少 workflow_info,无法获取 workflow_id"
149
151
  end
150
152
 
151
153
  # 7. 获取当前 commit 已绑定的包 ID
152
154
  existing_bound_ids = pgyer_helper.get_commit_bound_package_ids(
153
155
  commit_id: @git_commit_id,
154
- project_id: project_id
156
+ workflow_id: workflow_id
155
157
  )
156
158
 
157
159
  # 查询失败(nil)时中止:绑定接口是覆盖式写入,带着不完整的列表提交
@@ -196,7 +198,7 @@ module Pindo
196
198
  # 根治需要服务端支持,二选一即可:
197
199
  # 1) bind_commit 增加 append 语义(只追加不覆盖)
198
200
  # 2) 返回并校验 revision,做乐观并发控制
199
- verify_bound_packages(pgyer_helper, project_id, merged_package_ids)
201
+ verify_bound_packages(pgyer_helper, workflow_id, merged_package_ids)
200
202
 
201
203
  puts ""
202
204
 
@@ -225,12 +227,12 @@ module Pindo
225
227
  # 只有确认「期望的包没在列表里」才判定为被并发覆盖,抛异常交给任务重试。
226
228
  #
227
229
  # @param pgyer_helper [PgyerHelper] 已登录的 helper
228
- # @param project_id [String] 项目 ID
230
+ # @param workflow_id [Integer, String] 工作流 ID
229
231
  # @param expected_ids [Array<String>] 本次写入的包 ID 列表
230
- def verify_bound_packages(pgyer_helper, project_id, expected_ids)
232
+ def verify_bound_packages(pgyer_helper, workflow_id, expected_ids)
231
233
  actual_ids = pgyer_helper.get_commit_bound_package_ids(
232
234
  commit_id: @git_commit_id,
233
- project_id: project_id
235
+ workflow_id: workflow_id
234
236
  )
235
237
 
236
238
  if actual_ids.nil?
@@ -152,13 +152,17 @@ module Pindo
152
152
 
153
153
  # 计算上传耗时
154
154
  upload_duration = Time.now - upload_start_time
155
- upload_speed = file_size_mb / upload_duration
156
- puts "✅ 文件上传完成! 耗时: #{upload_duration.round(2)} 秒, 平均速度: #{upload_speed.round(2)} MB/s"
157
155
 
156
+ # 判空必须放在打印「上传完成」之前:upload_file 失败返回 nil,
157
+ # 先打印会输出一句假的完成提示,外加一个用完整文件大小除以失败耗时算出的假速度
158
158
  if file_url.nil?
159
+ puts "❌ 文件上传失败! 耗时: #{upload_duration.round(2)} 秒"
159
160
  raise Informative, "文件上传失败"
160
161
  end
161
162
 
163
+ upload_speed = file_size_mb / upload_duration
164
+ puts "✅ 文件上传完成! 耗时: #{upload_duration.round(2)} 秒, 平均速度: #{upload_speed.round(2)} MB/s"
165
+
162
166
  puts "✅ 文件上传成功"
163
167
  puts
164
168
 
data/lib/pindo/version.rb CHANGED
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.20.4"
9
+ VERSION = "5.20.5"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.20.4
4
+ version: 5.20.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
@@ -112,7 +112,7 @@ dependencies:
112
112
  version: '2.7'
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
- version: 2.7.1
115
+ version: 2.7.2
116
116
  type: :runtime
117
117
  prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
@@ -122,7 +122,7 @@ dependencies:
122
122
  version: '2.7'
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: 2.7.1
125
+ version: 2.7.2
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rqrcode
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -531,7 +531,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
531
531
  - !ruby/object:Gem::Version
532
532
  version: 3.0.0
533
533
  requirements: []
534
- rubygems_version: 4.0.11
534
+ rubygems_version: 4.0.10
535
535
  specification_version: 4
536
536
  summary: easy work
537
537
  test_files: []