my_api_client 1.3.1 → 2.1.0

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.
Files changed (248) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +8 -0
  3. data/.envrc.skeleton +0 -1
  4. data/.github/dependabot.yml +130 -7
  5. data/.github/workflows/ci.yml +348 -0
  6. data/.github/workflows/dependabot-auto-merge.yml +148 -0
  7. data/.github/workflows/release.yml +35 -0
  8. data/.github/workflows/rubocop_challenge.yml +35 -0
  9. data/.gitignore +1 -0
  10. data/.rubocop.yml +1 -1
  11. data/.ruby-version +1 -1
  12. data/AGENTS.md +149 -0
  13. data/CHANGELOG.md +81 -2
  14. data/CLAUDE.md +6 -0
  15. data/Dockerfile +22 -0
  16. data/Gemfile +4 -2
  17. data/Gemfile.lock +68 -66
  18. data/README.md +398 -62
  19. data/docker-compose.yml +29 -0
  20. data/docs/runbooks/dependabot_pr_auto_merge.md +122 -0
  21. data/gemfiles/rails_7.2.gemfile +1 -1
  22. data/gemfiles/{rails_7.1.gemfile → rails_8.0.gemfile} +2 -2
  23. data/gemfiles/{rails_6.1.gemfile → rails_8.1.gemfile} +2 -2
  24. data/lib/my_api_client/default_error_handlers.rb +1 -1
  25. data/lib/my_api_client/errors/client_error.rb +5 -1
  26. data/lib/my_api_client/integrations/bugsnag.rb +1 -1
  27. data/lib/my_api_client/version.rb +1 -1
  28. data/lib/my_api_client.rb +1 -1
  29. data/my_api/.ruby-version +1 -1
  30. data/my_api/AGENTS.md +35 -0
  31. data/my_api/Dockerfile +25 -0
  32. data/my_api/Gemfile +5 -16
  33. data/my_api/Gemfile.lock +257 -229
  34. data/my_api/README.md +36 -25
  35. data/my_api/Rakefile +3 -2
  36. data/my_api/app/controllers/application_controller.rb +1 -2
  37. data/my_api/app/controllers/error_controller.rb +2 -2
  38. data/my_api/app/controllers/header_controller.rb +6 -3
  39. data/my_api/app/controllers/pagination_controller.rb +5 -15
  40. data/my_api/app/controllers/rest_controller.rb +12 -16
  41. data/my_api/app/controllers/status_controller.rb +3 -4
  42. data/my_api/config/application.rb +12 -67
  43. data/{rails_app/rails_6.1 → my_api}/config/boot.rb +1 -1
  44. data/{rails_app/rails_7.1 → my_api}/config/environment.rb +0 -2
  45. data/my_api/config/environments/development.rb +6 -6
  46. data/my_api/config/environments/production.rb +5 -8
  47. data/my_api/config/environments/test.rb +5 -6
  48. data/my_api/config/routes.rb +2 -10
  49. data/my_api/config.ru +2 -4
  50. data/my_api/public/index.html +10 -90
  51. data/{rails_app/rails_7.0 → my_api}/spec/rails_helper.rb +3 -4
  52. data/my_api/spec/requests/error_controller_spec.rb +18 -0
  53. data/my_api/spec/requests/pagination_controller_spec.rb +22 -0
  54. data/my_api/spec/requests/rest_controller_spec.rb +22 -0
  55. data/my_api/spec/requests/status_controller_spec.rb +20 -0
  56. data/my_api/spec/spec_helper.rb +15 -23
  57. data/my_api_client.gemspec +3 -3
  58. data/rails_app/AGENTS.md +13 -0
  59. data/rails_app/rails_7.2/Dockerfile +1 -1
  60. data/rails_app/rails_7.2/Gemfile +3 -1
  61. data/rails_app/rails_7.2/Gemfile.lock +155 -131
  62. data/rails_app/{rails_7.1 → rails_8.0}/.dockerignore +16 -2
  63. data/rails_app/{rails_6.1 → rails_8.0}/.gitattributes +2 -1
  64. data/rails_app/rails_8.0/.github/workflows/ci.yml +39 -0
  65. data/rails_app/{rails_6.1 → rails_8.0}/.gitignore +11 -7
  66. data/rails_app/rails_8.0/.rubocop.yml +8 -0
  67. data/rails_app/rails_8.0/.ruby-version +1 -0
  68. data/rails_app/{rails_7.1 → rails_8.0}/Dockerfile +28 -18
  69. data/rails_app/rails_8.0/Gemfile +15 -0
  70. data/rails_app/rails_8.0/Gemfile.lock +287 -0
  71. data/rails_app/{rails_6.1 → rails_8.0}/Rakefile +1 -3
  72. data/rails_app/{rails_7.1 → rails_8.0}/app/controllers/application_controller.rb +0 -2
  73. data/rails_app/rails_8.0/app/jobs/application_job.rb +7 -0
  74. data/rails_app/rails_8.0/app/mailers/application_mailer.rb +4 -0
  75. data/rails_app/{rails_7.0 → rails_8.0}/app/models/application_record.rb +0 -2
  76. data/rails_app/rails_8.0/app/views/layouts/mailer.html.erb +13 -0
  77. data/rails_app/rails_8.0/app/views/layouts/mailer.text.erb +1 -0
  78. data/rails_app/rails_8.0/bin/brakeman +7 -0
  79. data/rails_app/rails_8.0/bin/dev +2 -0
  80. data/rails_app/rails_8.0/bin/docker-entrypoint +14 -0
  81. data/rails_app/rails_8.0/bin/rails +4 -0
  82. data/rails_app/rails_8.0/bin/rake +4 -0
  83. data/rails_app/rails_8.0/bin/rubocop +8 -0
  84. data/rails_app/{rails_7.1 → rails_8.0}/bin/setup +11 -12
  85. data/rails_app/rails_8.0/bin/thrust +5 -0
  86. data/rails_app/{rails_7.1 → rails_8.0}/config/application.rb +14 -16
  87. data/rails_app/rails_8.0/config/boot.rb +3 -0
  88. data/rails_app/rails_8.0/config/cable.yml +10 -0
  89. data/rails_app/rails_8.0/config/credentials.yml.enc +1 -0
  90. data/rails_app/{rails_7.1 → rails_8.0}/config/database.yml +18 -2
  91. data/rails_app/{rails_6.1 → rails_8.0}/config/environment.rb +1 -3
  92. data/rails_app/rails_8.0/config/environments/development.rb +70 -0
  93. data/rails_app/rails_8.0/config/environments/production.rb +86 -0
  94. data/rails_app/{rails_7.1 → rails_8.0}/config/environments/test.rb +16 -19
  95. data/rails_app/{rails_7.1 → rails_8.0}/config/initializers/cors.rb +0 -1
  96. data/rails_app/{rails_7.1 → rails_8.0}/config/initializers/filter_parameter_logging.rb +2 -4
  97. data/rails_app/{rails_7.0 → rails_8.0}/config/initializers/inflections.rb +0 -1
  98. data/rails_app/rails_8.0/config/puma.rb +41 -0
  99. data/rails_app/{rails_7.1 → rails_8.0}/config/routes.rb +1 -3
  100. data/rails_app/rails_8.0/config/storage.yml +34 -0
  101. data/rails_app/{rails_7.1 → rails_8.0}/config.ru +1 -3
  102. data/rails_app/{rails_7.1 → rails_8.0}/db/seeds.rb +0 -1
  103. data/rails_app/{rails_7.1 → rails_8.0}/spec/rails_helper.rb +1 -1
  104. data/rails_app/rails_8.1/.dockerignore +45 -0
  105. data/rails_app/rails_8.1/.gitattributes +9 -0
  106. data/rails_app/rails_8.1/.github/workflows/ci.yml +52 -0
  107. data/rails_app/rails_8.1/.gitignore +33 -0
  108. data/rails_app/rails_8.1/.rspec +1 -0
  109. data/rails_app/rails_8.1/.rubocop.yml +8 -0
  110. data/rails_app/rails_8.1/.ruby-version +1 -0
  111. data/rails_app/rails_8.1/Dockerfile +68 -0
  112. data/rails_app/rails_8.1/Gemfile +15 -0
  113. data/rails_app/rails_8.1/Gemfile.lock +290 -0
  114. data/rails_app/{rails_7.0 → rails_8.1}/Rakefile +1 -3
  115. data/rails_app/{rails_6.1 → rails_8.1}/app/controllers/application_controller.rb +0 -2
  116. data/rails_app/rails_8.1/app/jobs/application_job.rb +7 -0
  117. data/rails_app/rails_8.1/app/mailers/application_mailer.rb +4 -0
  118. data/rails_app/{rails_7.1 → rails_8.1}/app/models/application_record.rb +0 -2
  119. data/rails_app/rails_8.1/app/views/layouts/mailer.html.erb +13 -0
  120. data/rails_app/rails_8.1/app/views/layouts/mailer.text.erb +1 -0
  121. data/rails_app/rails_8.1/bin/brakeman +7 -0
  122. data/rails_app/rails_8.1/bin/bundler-audit +6 -0
  123. data/rails_app/rails_8.1/bin/ci +6 -0
  124. data/rails_app/rails_8.1/bin/dev +2 -0
  125. data/rails_app/{rails_7.1 → rails_8.1}/bin/docker-entrypoint +1 -1
  126. data/rails_app/rails_8.1/bin/rails +4 -0
  127. data/rails_app/rails_8.1/bin/rake +4 -0
  128. data/rails_app/rails_8.1/bin/rubocop +8 -0
  129. data/rails_app/{rails_7.0 → rails_8.1}/bin/setup +13 -13
  130. data/rails_app/rails_8.1/bin/thrust +5 -0
  131. data/rails_app/{rails_6.1 → rails_8.1}/config/application.rb +19 -17
  132. data/rails_app/rails_8.1/config/boot.rb +3 -0
  133. data/rails_app/rails_8.1/config/bundler-audit.yml +5 -0
  134. data/rails_app/rails_8.1/config/cable.yml +10 -0
  135. data/rails_app/rails_8.1/config/ci.rb +19 -0
  136. data/rails_app/rails_8.1/config/credentials.yml.enc +1 -0
  137. data/rails_app/rails_8.1/config/database.yml +40 -0
  138. data/rails_app/{rails_7.0 → rails_8.1}/config/environment.rb +1 -3
  139. data/rails_app/rails_8.1/config/environments/development.rb +73 -0
  140. data/rails_app/rails_8.1/config/environments/production.rb +86 -0
  141. data/rails_app/rails_8.1/config/environments/test.rb +53 -0
  142. data/rails_app/{rails_7.0 → rails_8.1}/config/initializers/cors.rb +1 -2
  143. data/rails_app/rails_8.1/config/initializers/filter_parameter_logging.rb +8 -0
  144. data/rails_app/{rails_7.1 → rails_8.1}/config/initializers/inflections.rb +0 -1
  145. data/rails_app/rails_8.1/config/locales/en.yml +31 -0
  146. data/rails_app/rails_8.1/config/puma.rb +42 -0
  147. data/rails_app/rails_8.1/config/routes.rb +10 -0
  148. data/rails_app/rails_8.1/config/storage.yml +27 -0
  149. data/rails_app/{rails_7.0 → rails_8.1}/config.ru +1 -3
  150. data/rails_app/rails_8.1/db/seeds.rb +9 -0
  151. data/rails_app/{rails_6.1 → rails_8.1}/spec/rails_helper.rb +1 -2
  152. metadata +141 -138
  153. data/.circleci/config.yml +0 -344
  154. data/README.jp.md +0 -785
  155. data/gemfiles/rails_7.0.gemfile +0 -15
  156. data/my_api/.envrc.skeleton +0 -3
  157. data/my_api/.jetskeep +0 -1
  158. data/my_api/Procfile +0 -7
  159. data/my_api/app/helpers/application_helper.rb +0 -5
  160. data/my_api/app/jobs/application_job.rb +0 -7
  161. data/my_api/app/models/application_item.rb +0 -5
  162. data/my_api/config/dynamodb.yml +0 -22
  163. data/my_api/spec/controllers/error_controller_spec.rb +0 -43
  164. data/my_api/spec/controllers/header_controller_spec.rb +0 -33
  165. data/my_api/spec/controllers/pagination_controller_spec.rb +0 -73
  166. data/my_api/spec/controllers/rest_controller_spec.rb +0 -99
  167. data/my_api/spec/controllers/status_controller_spec.rb +0 -47
  168. data/my_api/spec/fixtures/payloads/posts-index.json +0 -51
  169. data/my_api/spec/fixtures/payloads/posts-show.json +0 -53
  170. data/rails_app/rails_6.1/.rspec +0 -3
  171. data/rails_app/rails_6.1/Gemfile +0 -17
  172. data/rails_app/rails_6.1/Gemfile.lock +0 -195
  173. data/rails_app/rails_6.1/app/models/application_record.rb +0 -5
  174. data/rails_app/rails_6.1/bin/bundle +0 -122
  175. data/rails_app/rails_6.1/bin/rails +0 -6
  176. data/rails_app/rails_6.1/bin/rake +0 -6
  177. data/rails_app/rails_6.1/bin/setup +0 -35
  178. data/rails_app/rails_6.1/config/credentials.yml.enc +0 -1
  179. data/rails_app/rails_6.1/config/database.yml +0 -25
  180. data/rails_app/rails_6.1/config/environments/development.rb +0 -59
  181. data/rails_app/rails_6.1/config/environments/production.rb +0 -97
  182. data/rails_app/rails_6.1/config/environments/test.rb +0 -51
  183. data/rails_app/rails_6.1/config/initializers/application_controller_renderer.rb +0 -9
  184. data/rails_app/rails_6.1/config/initializers/backtrace_silencers.rb +0 -10
  185. data/rails_app/rails_6.1/config/initializers/cors.rb +0 -17
  186. data/rails_app/rails_6.1/config/initializers/filter_parameter_logging.rb +0 -8
  187. data/rails_app/rails_6.1/config/initializers/inflections.rb +0 -17
  188. data/rails_app/rails_6.1/config/initializers/mime_types.rb +0 -5
  189. data/rails_app/rails_6.1/config/initializers/wrap_parameters.rb +0 -16
  190. data/rails_app/rails_6.1/config/locales/en.yml +0 -33
  191. data/rails_app/rails_6.1/config/routes.rb +0 -5
  192. data/rails_app/rails_6.1/config.ru +0 -8
  193. data/rails_app/rails_6.1/db/seeds.rb +0 -8
  194. data/rails_app/rails_7.0/Gemfile +0 -13
  195. data/rails_app/rails_7.0/Gemfile.lock +0 -212
  196. data/rails_app/rails_7.0/app/controllers/application_controller.rb +0 -4
  197. data/rails_app/rails_7.0/bin/bundle +0 -122
  198. data/rails_app/rails_7.0/bin/rails +0 -6
  199. data/rails_app/rails_7.0/bin/rake +0 -6
  200. data/rails_app/rails_7.0/config/application.rb +0 -41
  201. data/rails_app/rails_7.0/config/boot.rb +0 -5
  202. data/rails_app/rails_7.0/config/credentials.yml.enc +0 -1
  203. data/rails_app/rails_7.0/config/database.yml +0 -25
  204. data/rails_app/rails_7.0/config/environments/development.rb +0 -58
  205. data/rails_app/rails_7.0/config/environments/production.rb +0 -70
  206. data/rails_app/rails_7.0/config/environments/test.rb +0 -52
  207. data/rails_app/rails_7.0/config/initializers/filter_parameter_logging.rb +0 -8
  208. data/rails_app/rails_7.0/config/locales/en.yml +0 -33
  209. data/rails_app/rails_7.0/config/routes.rb +0 -8
  210. data/rails_app/rails_7.0/db/seeds.rb +0 -8
  211. data/rails_app/rails_7.1/Gemfile +0 -16
  212. data/rails_app/rails_7.1/Gemfile.lock +0 -241
  213. data/rails_app/rails_7.1/README.md +0 -24
  214. data/rails_app/rails_7.1/Rakefile +0 -8
  215. data/rails_app/rails_7.1/bin/bundle +0 -122
  216. data/rails_app/rails_7.1/bin/rails +0 -6
  217. data/rails_app/rails_7.1/bin/rake +0 -6
  218. data/rails_app/rails_7.1/config/boot.rb +0 -5
  219. data/rails_app/rails_7.1/config/credentials.yml.enc +0 -1
  220. data/rails_app/rails_7.1/config/environments/development.rb +0 -58
  221. data/rails_app/rails_7.1/config/environments/production.rb +0 -74
  222. data/rails_app/rails_7.1/config/puma.rb +0 -46
  223. data/rails_app/rails_7.1/public/robots.txt +0 -2
  224. data/rails_app/rails_7.1/spec/spec_helper.rb +0 -13
  225. data/rails_app/rails_7.1/vendor/.keep +0 -0
  226. data/rails_app/rails_7.2/.github/dependabot.yml +0 -12
  227. /data/rails_app/{rails_7.1 → rails_8.0}/.rspec +0 -0
  228. /data/rails_app/{rails_6.1 → rails_8.0}/README.md +0 -0
  229. /data/rails_app/{rails_6.1 → rails_8.0}/app/controllers/concerns/.keep +0 -0
  230. /data/rails_app/{rails_6.1/app/javascript → rails_8.0/app/models/concerns}/.keep +0 -0
  231. /data/rails_app/{rails_7.1 → rails_8.0}/config/locales/en.yml +0 -0
  232. /data/rails_app/{rails_6.1/app/models/concerns → rails_8.0/lib/tasks}/.keep +0 -0
  233. /data/rails_app/{rails_6.1/lib/tasks → rails_8.0/log}/.keep +0 -0
  234. /data/rails_app/{rails_6.1 → rails_8.0}/public/robots.txt +0 -0
  235. /data/rails_app/{rails_6.1/tmp → rails_8.0/script}/.keep +0 -0
  236. /data/rails_app/{rails_6.1 → rails_8.0}/spec/spec_helper.rb +0 -0
  237. /data/rails_app/{rails_6.1/tmp/pids → rails_8.0/storage}/.keep +0 -0
  238. /data/rails_app/{rails_6.1 → rails_8.0}/vendor/.keep +0 -0
  239. /data/rails_app/{rails_7.0 → rails_8.1}/README.md +0 -0
  240. /data/rails_app/{rails_7.1 → rails_8.1}/app/controllers/concerns/.keep +0 -0
  241. /data/rails_app/{rails_7.1 → rails_8.1}/app/models/concerns/.keep +0 -0
  242. /data/rails_app/{rails_7.1 → rails_8.1}/lib/tasks/.keep +0 -0
  243. /data/rails_app/{rails_7.1/storage → rails_8.1/log}/.keep +0 -0
  244. /data/rails_app/{rails_7.0 → rails_8.1}/public/robots.txt +0 -0
  245. /data/rails_app/{rails_7.1/tmp → rails_8.1/script}/.keep +0 -0
  246. /data/rails_app/{rails_7.0 → rails_8.1}/spec/spec_helper.rb +0 -0
  247. /data/rails_app/{rails_7.1/tmp/pids → rails_8.1/storage}/.keep +0 -0
  248. /data/rails_app/{rails_7.1/tmp/storage → rails_8.1/vendor}/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7d3471ad8b1b1fe955f65dee427f4456055a1608abbd1a6a66159a9971db727
4
- data.tar.gz: 9f3d5aa9a5f84b7b3185b3948e2608f104775fd1a9833e534fea1970dcc99d25
3
+ metadata.gz: 8c810e4644f4b3276f9be5b136b196040081204ffd2c1a4590d35f75f7267f37
4
+ data.tar.gz: a20a2ad006d18a8211ab056d760d9454f6883dcd6e4f88fcdcda38f6f9bb524b
5
5
  SHA512:
6
- metadata.gz: 4b7240277aab4f9299fa362a5a7d60a33c8d0dc7a26f674164fea7ebd914655f18ad553a16d0a1516da9d02261d58248ec71c4596ce37ada569cd60ef7272ea5
7
- data.tar.gz: d0460fffc5ca8d8c30db1b57be78c8e6ad28d4278d4c6cf5e79ef30f3681e9b63fbd2953abebdb80c100adacfcf0bc156643ef4bc03ca5d73f33203fc37a2d66
6
+ metadata.gz: 3c6a1873fb33961931afccaee071ad8c2f734c1bcf3d29937274eae92cac18727a881edb00cd02890a6e7d566d1e8168b12a5cf8c5b124ef61aff27a960e9a50
7
+ data.tar.gz: c78a1a59b9f50c89b4489a23fd6fb501727f4e412b184acf5ae9f8be6fe7d1a93a621f1620bc67a25b20193c7a9f766b9d0fdc9642b0e488d45c3a1eeca6b81a
data/.dockerignore ADDED
@@ -0,0 +1,8 @@
1
+ .github
2
+ .yardoc
3
+ coverage
4
+ tmp
5
+ log
6
+ vendor/bundle
7
+ .bundle
8
+ .rspec_status
data/.envrc.skeleton CHANGED
@@ -1,2 +1 @@
1
1
  export GITHUB_ACCESS_TOKEN={GITHUB_ACCESS_TOKEN}
2
- export MY_API_ENDPOINT={API gateway endtpoint of "my_api" for integration testing}
@@ -1,14 +1,20 @@
1
1
  version: 2
2
+ # cooldown: defer version bumps until a release has aged, reducing the risk of
3
+ # adopting a compromised or broken version right after publication. Longer for
4
+ # higher-impact bumps (major > minor > patch).
2
5
  updates:
3
6
  - package-ecosystem: bundler
4
7
  directory: "/"
5
8
  schedule:
6
- interval: daily
9
+ interval: weekly
7
10
  time: "08:00"
8
- timezone: Japan
11
+ timezone: Asia/Tokyo
12
+ cooldown:
13
+ default-days: 7
14
+ semver-major-days: 14
15
+ semver-minor-days: 7
16
+ semver-patch-days: 3
9
17
  open-pull-requests-limit: 10
10
- reviewers:
11
- - ryz310
12
18
  assignees:
13
19
  - ryz310
14
20
  labels:
@@ -17,15 +23,132 @@ updates:
17
23
  - dependency-name: rubocop
18
24
  versions:
19
25
  - 1.9.0
26
+ - package-ecosystem: github-actions
27
+ directory: "/"
28
+ schedule:
29
+ interval: weekly
30
+ time: "08:00"
31
+ timezone: Asia/Tokyo
32
+ cooldown:
33
+ default-days: 7
34
+ semver-major-days: 14
35
+ semver-minor-days: 7
36
+ semver-patch-days: 3
37
+ open-pull-requests-limit: 10
38
+ assignees:
39
+ - ryz310
40
+ labels:
41
+ - dependabot
20
42
  - package-ecosystem: bundler
21
43
  directory: "/my_api"
22
44
  schedule:
23
- interval: daily
45
+ interval: weekly
24
46
  time: "08:00"
25
- timezone: Japan
47
+ timezone: Asia/Tokyo
48
+ cooldown:
49
+ default-days: 7
50
+ semver-major-days: 14
51
+ semver-minor-days: 7
52
+ semver-patch-days: 3
26
53
  open-pull-requests-limit: 10
27
- reviewers:
54
+ assignees:
28
55
  - ryz310
56
+ labels:
57
+ - dependabot
58
+ - package-ecosystem: bundler
59
+ directory: "/rails_app/rails_7.2"
60
+ schedule:
61
+ interval: weekly
62
+ time: "08:00"
63
+ timezone: Asia/Tokyo
64
+ cooldown:
65
+ default-days: 7
66
+ semver-major-days: 14
67
+ semver-minor-days: 7
68
+ semver-patch-days: 3
69
+ open-pull-requests-limit: 10
70
+ assignees:
71
+ - ryz310
72
+ labels:
73
+ - dependabot
74
+ - package-ecosystem: github-actions
75
+ directory: "/rails_app/rails_7.2"
76
+ schedule:
77
+ interval: weekly
78
+ time: "08:00"
79
+ timezone: Asia/Tokyo
80
+ cooldown:
81
+ default-days: 7
82
+ semver-major-days: 14
83
+ semver-minor-days: 7
84
+ semver-patch-days: 3
85
+ open-pull-requests-limit: 10
86
+ assignees:
87
+ - ryz310
88
+ labels:
89
+ - dependabot
90
+ - package-ecosystem: bundler
91
+ directory: "/rails_app/rails_8.0"
92
+ schedule:
93
+ interval: weekly
94
+ time: "08:00"
95
+ timezone: Asia/Tokyo
96
+ cooldown:
97
+ default-days: 7
98
+ semver-major-days: 14
99
+ semver-minor-days: 7
100
+ semver-patch-days: 3
101
+ open-pull-requests-limit: 10
102
+ assignees:
103
+ - ryz310
104
+ labels:
105
+ - dependabot
106
+ - package-ecosystem: github-actions
107
+ directory: "/rails_app/rails_8.0"
108
+ schedule:
109
+ interval: weekly
110
+ time: "08:00"
111
+ timezone: Asia/Tokyo
112
+ cooldown:
113
+ default-days: 7
114
+ semver-major-days: 14
115
+ semver-minor-days: 7
116
+ semver-patch-days: 3
117
+ open-pull-requests-limit: 10
118
+ assignees:
119
+ - ryz310
120
+ labels:
121
+ - dependabot
122
+ - package-ecosystem: bundler
123
+ directory: "/rails_app/rails_8.1"
124
+ schedule:
125
+ interval: weekly
126
+ day: monday
127
+ time: "08:00"
128
+ timezone: Asia/Tokyo
129
+ cooldown:
130
+ default-days: 7
131
+ semver-major-days: 14
132
+ semver-minor-days: 7
133
+ semver-patch-days: 3
134
+ open-pull-requests-limit: 10
135
+ assignees:
136
+ - ryz310
137
+ labels:
138
+ - dependabot
139
+ - package-ecosystem: github-actions
140
+ directory: "/rails_app/rails_8.1"
141
+ schedule:
142
+ interval: weekly
143
+ day: monday
144
+ time: "08:00"
145
+ timezone: Asia/Tokyo
146
+ cooldown:
147
+ default-days: 7
148
+ semver-major-days: 14
149
+ semver-minor-days: 7
150
+ semver-patch-days: 3
151
+ open-pull-requests-limit: 10
29
152
  assignees:
30
153
  - ryz310
31
154
  labels:
@@ -0,0 +1,348 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ workflow_dispatch:
6
+
7
+ concurrency:
8
+ group: ci-${{ github.workflow }}-${{ github.ref }}
9
+ cancel-in-progress: true
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ build_gem:
16
+ name: build_on_ruby_${{ matrix.ruby_version }}_and_rails_${{ matrix.rails_version }}_${{ matrix.bundler_option.name }}
17
+ runs-on: ubuntu-latest
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ ruby_version: ['3.3', '3.4', '4.0']
22
+ rails_version: ['7.2', '8.0', '8.1']
23
+ bundler_option:
24
+ - name: with_integrations
25
+ with: integrations
26
+ without: ""
27
+ - name: without_integrations
28
+ with: ""
29
+ without: integrations
30
+ steps:
31
+ - uses: actions/checkout@v7
32
+ with:
33
+ persist-credentials: false
34
+
35
+ - name: Set up Ruby ${{ matrix.ruby_version }}
36
+ uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
37
+ with:
38
+ ruby-version: ${{ matrix.ruby_version }}
39
+ bundler-cache: false
40
+
41
+ - name: Install Bundler 2.x
42
+ run: gem install bundler -v "~> 2.0"
43
+
44
+ - name: Configure Bundler options
45
+ env:
46
+ BUNDLE_WITH: ${{ matrix.bundler_option.with }}
47
+ BUNDLE_WITHOUT: ${{ matrix.bundler_option.without }}
48
+ run: |
49
+ if [ -n "${BUNDLE_WITH}" ]; then
50
+ bundle config set --local with "${BUNDLE_WITH}"
51
+ else
52
+ bundle config unset --local with || true
53
+ fi
54
+
55
+ if [ -n "${BUNDLE_WITHOUT}" ]; then
56
+ bundle config set --local without "${BUNDLE_WITHOUT}"
57
+ else
58
+ bundle config unset --local without || true
59
+ fi
60
+
61
+ - name: Use Rails ${{ matrix.rails_version }} appraisal
62
+ run: cp gemfiles/rails_${{ matrix.rails_version }}.gemfile Gemfile
63
+
64
+ - name: Update ActiveSupport
65
+ run: bundle update activesupport
66
+
67
+ - name: Execute RSpec
68
+ env:
69
+ SIMPLECOV_COMMAND_NAME: build_gem_ruby_${{ matrix.ruby_version }}_rails_${{ matrix.rails_version }}_${{ matrix.bundler_option.name }}
70
+ run: |
71
+ bundle exec rspec --format documentation \
72
+ --color \
73
+ --format RspecJunitFormatter
74
+
75
+ - name: Rake build
76
+ run: bundle exec rake build
77
+
78
+ - name: Prepare coverage artifact
79
+ if: ${{ always() && hashFiles('coverage/.resultset.json') != '' }}
80
+ run: cp coverage/.resultset.json coverage/resultset.json
81
+
82
+ - name: Upload coverage artifact
83
+ if: ${{ always() && hashFiles('coverage/resultset.json') != '' }}
84
+ uses: actions/upload-artifact@v7
85
+ with:
86
+ name: simplecov-resultset-ruby_${{ matrix.ruby_version }}-rails_${{ matrix.rails_version }}-${{ matrix.bundler_option.name }}
87
+ path: coverage/resultset.json
88
+
89
+ verify_generator:
90
+ name: verify_generator_on_ruby_${{ matrix.ruby_version }}_and_rails_${{ matrix.rails_version }}
91
+ runs-on: ubuntu-latest
92
+ env:
93
+ BUNDLE_PATH: vendor/bundle
94
+ strategy:
95
+ fail-fast: false
96
+ matrix:
97
+ ruby_version: ['3.3', '3.4', '4.0']
98
+ rails_version: ['7.2', '8.0', '8.1']
99
+ defaults:
100
+ run:
101
+ working-directory: rails_app/rails_${{ matrix.rails_version }}
102
+ steps:
103
+ - uses: actions/checkout@v7
104
+ with:
105
+ persist-credentials: false
106
+
107
+ - name: Set up Ruby ${{ matrix.ruby_version }}
108
+ uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
109
+ with:
110
+ ruby-version: ${{ matrix.ruby_version }}
111
+ bundler-cache: false
112
+
113
+ - name: Install Bundler 2.x
114
+ run: gem install bundler -v "~> 2.0"
115
+
116
+ - name: Bundle install
117
+ run: bundle install
118
+
119
+ - name: Add compatibility symlink for libffi
120
+ run: |
121
+ if [ ! -e /usr/lib/x86_64-linux-gnu/libffi.so.6 ]; then
122
+ latest_libffi="$(find /usr/lib/x86_64-linux-gnu -maxdepth 1 -type f -name 'libffi.so.*.*.*' | sort -V | tail -n 1)"
123
+ if [ -n "${latest_libffi}" ]; then
124
+ sudo ln -s "${latest_libffi}" /usr/lib/x86_64-linux-gnu/libffi.so.6
125
+ fi
126
+ fi
127
+
128
+ - name: Generate new API client files
129
+ run: |
130
+ bin/rails g api_client path/to/resource \
131
+ get:path/to/resource \
132
+ post:path/to/resource \
133
+ --endpoint https://example.com/myapi
134
+
135
+ - name: Check generated API client files
136
+ run: |
137
+ test -e "app/api_clients/application_api_client.rb" && \
138
+ test -e "app/api_clients/path/to/resource_api_client.rb" && \
139
+ test -e "spec/api_clients/path/to/resource_api_client_spec.rb"
140
+
141
+ - name: Run rspec with the generated spec file
142
+ run: bundle exec rspec -f d spec/api_clients/path/to
143
+
144
+ integration_api:
145
+ name: integration_api_via_docker_compose
146
+ runs-on: ubuntu-latest
147
+ steps:
148
+ - uses: actions/checkout@v7
149
+ with:
150
+ persist-credentials: false
151
+
152
+ - name: Build and start my_api
153
+ run: docker compose up -d --build my_api
154
+
155
+ - name: Run integration specs against my_api
156
+ env:
157
+ MY_API_ENDPOINT: http://my_api:3000
158
+ SIMPLECOV_COMMAND_NAME: integration_api
159
+ run: |
160
+ docker compose run --rm test bash -lc "
161
+ bundle config set --local with integrations &&
162
+ bundle install &&
163
+ bundle exec rspec spec/integrations/api_clients
164
+ "
165
+
166
+ - name: Fix coverage directory ownership
167
+ if: ${{ always() && hashFiles('coverage/.resultset.json') != '' }}
168
+ run: sudo chown -R "$(id -u):$(id -g)" coverage
169
+
170
+ - name: Prepare coverage artifact
171
+ if: ${{ always() && hashFiles('coverage/.resultset.json') != '' }}
172
+ run: cp coverage/.resultset.json coverage/resultset.json
173
+
174
+ - name: Upload coverage artifact
175
+ if: ${{ always() && hashFiles('coverage/resultset.json') != '' }}
176
+ uses: actions/upload-artifact@v7
177
+ with:
178
+ name: simplecov-resultset-integration_api
179
+ path: coverage/resultset.json
180
+
181
+ - name: Show my_api logs when failed
182
+ if: ${{ failure() }}
183
+ run: docker compose logs my_api
184
+
185
+ - name: Shutdown compose services
186
+ if: ${{ always() }}
187
+ run: docker compose down --volumes --remove-orphans
188
+
189
+ my_api_request_specs:
190
+ name: my_api_request_specs_via_docker_compose
191
+ runs-on: ubuntu-latest
192
+ steps:
193
+ - uses: actions/checkout@v7
194
+ with:
195
+ persist-credentials: false
196
+
197
+ - name: Build and start my_api
198
+ run: docker compose up -d --build my_api
199
+
200
+ - name: Run my_api request specs
201
+ env:
202
+ SIMPLECOV_COMMAND_NAME: my_api_request_specs
203
+ run: docker compose run --rm my_api bundle exec rspec spec/requests
204
+
205
+ - name: Fix my_api coverage directory ownership
206
+ if: ${{ always() && hashFiles('my_api/coverage/.resultset.json') != '' }}
207
+ run: sudo chown -R "$(id -u):$(id -g)" my_api/coverage
208
+
209
+ - name: Prepare coverage artifact
210
+ if: ${{ always() && hashFiles('my_api/coverage/.resultset.json') != '' }}
211
+ run: cp my_api/coverage/.resultset.json my_api/coverage/resultset.json
212
+
213
+ - name: Upload coverage artifact
214
+ if: ${{ always() && hashFiles('my_api/coverage/resultset.json') != '' }}
215
+ uses: actions/upload-artifact@v7
216
+ with:
217
+ name: simplecov-resultset-my_api_request_specs
218
+ path: my_api/coverage/resultset.json
219
+
220
+ - name: Show my_api logs when failed
221
+ if: ${{ failure() }}
222
+ run: docker compose logs my_api
223
+
224
+ - name: Shutdown compose services
225
+ if: ${{ always() }}
226
+ run: docker compose down --volumes --remove-orphans
227
+
228
+ rubocop:
229
+ runs-on: ubuntu-latest
230
+ steps:
231
+ - uses: actions/checkout@v7
232
+ with:
233
+ persist-credentials: false
234
+
235
+ - name: Set up Ruby
236
+ uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
237
+ with:
238
+ ruby-version: '4.0'
239
+ bundler-cache: false
240
+
241
+ - name: Install Bundler 2.x
242
+ run: gem install bundler -v "~> 2.0"
243
+
244
+ - name: Bundle install
245
+ run: bundle install
246
+
247
+ - name: Run RuboCop
248
+ run: bundle exec rubocop
249
+
250
+ yardoc:
251
+ runs-on: ubuntu-latest
252
+ steps:
253
+ - uses: actions/checkout@v7
254
+ with:
255
+ persist-credentials: false
256
+
257
+ - name: Set up Ruby
258
+ uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
259
+ with:
260
+ ruby-version: '4.0'
261
+ bundler-cache: false
262
+
263
+ - name: Install Bundler 2.x
264
+ run: gem install bundler -v "~> 2.0"
265
+
266
+ - name: Bundle install
267
+ run: bundle install
268
+
269
+ - name: Generate YARDoc
270
+ run: bundle exec yardoc -o ./yardoc
271
+
272
+ - name: Store YARDoc artifact
273
+ uses: actions/upload-artifact@v7
274
+ with:
275
+ name: yardoc
276
+ path: ./yardoc
277
+
278
+ upload_coverage:
279
+ name: upload-coverage
280
+ environment: coverage
281
+ # This job runs on pull_request as well.
282
+ # On fork-based pull requests, secrets are unavailable, so the Qlty upload
283
+ # step is skipped by its token guard. On same-repository pull requests,
284
+ # QLTY_COVERAGE_TOKEN is available and upload can run.
285
+ needs:
286
+ - build_gem
287
+ - verify_generator
288
+ - integration_api
289
+ - my_api_request_specs
290
+ runs-on: ubuntu-latest
291
+ env:
292
+ QLTY_COVERAGE_TOKEN: ${{ secrets.QLTY_COVERAGE_TOKEN }}
293
+ steps:
294
+ - uses: actions/checkout@v7
295
+ with:
296
+ persist-credentials: false
297
+
298
+ - name: Set up Ruby
299
+ uses: ruby/setup-ruby@95ef2b042f9d7a56d8268cba8559e2842e2ad01b # v1.321.0
300
+ with:
301
+ ruby-version: '4.0'
302
+ bundler-cache: false
303
+
304
+ - name: Install Bundler 2.x
305
+ run: gem install bundler -v "~> 2.0"
306
+
307
+ - name: Bundle install
308
+ run: bundle install
309
+
310
+ - name: Download coverage artifacts
311
+ uses: actions/download-artifact@v8
312
+ with:
313
+ pattern: simplecov-resultset-*
314
+ path: tmp/simplecov-results
315
+
316
+ - name: Collate SimpleCov coverage
317
+ run: |
318
+ bundle exec ruby -e "
319
+ require 'simplecov'
320
+ require 'simplecov_json_formatter'
321
+
322
+ resultset_files = Dir['tmp/simplecov-results/**/resultset.json'].sort
323
+ abort('No SimpleCov resultset files found') if resultset_files.empty?
324
+
325
+ SimpleCov.collate(resultset_files) do
326
+ formatter SimpleCov::Formatter::JSONFormatter
327
+ coverage_dir('coverage')
328
+ end
329
+ "
330
+
331
+ - name: Upload merged coverage artifact
332
+ if: ${{ hashFiles('coverage/coverage.json') != '' }}
333
+ uses: actions/upload-artifact@v7
334
+ with:
335
+ name: merged-simplecov-coverage
336
+ path: coverage/coverage.json
337
+
338
+ - name: Upload coverage to Qlty
339
+ if: ${{ env.QLTY_COVERAGE_TOKEN != '' && hashFiles('coverage/coverage.json') != '' }}
340
+ uses: qltysh/qlty-action/coverage@08a0a862c159eae9b9003081da6663d96efef637 # v2.3.0
341
+ with:
342
+ token: ${{ env.QLTY_COVERAGE_TOKEN }}
343
+ files: coverage/coverage.json
344
+
345
+ - name: Notify when Qlty token is missing
346
+ if: ${{ env.QLTY_COVERAGE_TOKEN == '' }}
347
+ run: |
348
+ echo "QLTY_COVERAGE_TOKEN is not set. Skipping coverage upload."
@@ -0,0 +1,148 @@
1
+ name: Dependabot Auto Merge
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - reopened
8
+ - synchronize
9
+
10
+ permissions: {}
11
+
12
+ jobs:
13
+ enable-automerge-bundler:
14
+ if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: write
18
+ pull-requests: write
19
+
20
+ steps:
21
+ - name: Fetch Dependabot metadata
22
+ id: metadata
23
+ uses: dependabot/fetch-metadata@v3
24
+ with:
25
+ github-token: ${{ secrets.GITHUB_TOKEN }}
26
+
27
+ - name: Validate bundler update safety
28
+ id: guard
29
+ if: ${{ steps.metadata.outputs.package-ecosystem == 'bundler' }}
30
+ env:
31
+ HEAD_REF: ${{ github.event.pull_request.head.ref }}
32
+ UPDATE_TYPE: ${{ steps.metadata.outputs.update-type }}
33
+ DEPENDENCY_TYPE: ${{ steps.metadata.outputs.dependency-type }}
34
+ DEPENDENCY_NAME: ${{ steps.metadata.outputs.dependency-name }}
35
+ DEPENDENCY_NAMES: ${{ steps.metadata.outputs.dependency-names }}
36
+ run: |
37
+ set -euo pipefail
38
+
39
+ safe=false
40
+
41
+ deps="$DEPENDENCY_NAMES"
42
+ if [[ -z "$deps" ]]; then
43
+ deps="$DEPENDENCY_NAME"
44
+ fi
45
+
46
+ rails_involved=false
47
+ while IFS= read -r dep; do
48
+ dep="$(echo "$dep" | xargs)"
49
+ [[ -z "$dep" ]] && continue
50
+ if [[ "$dep" == "rails" ]]; then
51
+ rails_involved=true
52
+ fi
53
+ done < <(echo "$deps" | tr ',' '\n')
54
+
55
+ if [[ "$HEAD_REF" == *"/rails_app/"* ]]; then
56
+ # Verification Rails apps: always auto-merge, except a major bump of the rails gem itself.
57
+ if [[ "$UPDATE_TYPE" == "version-update:semver-major" && "$rails_involved" == "true" ]]; then
58
+ echo "Skip auto-merge: major update of the rails gem in a rails_app verification app."
59
+ safe=false
60
+ else
61
+ safe=true
62
+ fi
63
+ elif [[ "$HEAD_REF" == *"/my_api/"* ]]; then
64
+ # Verification API app: always auto-merge regardless of update type.
65
+ safe=true
66
+ elif [[ ("$UPDATE_TYPE" == "version-update:semver-patch" || "$UPDATE_TYPE" == "version-update:semver-minor") && "$DEPENDENCY_TYPE" == "direct:development" ]]; then
67
+ # The gem itself (root Gemfile): only direct development patch/minor updates.
68
+ safe=true
69
+ else
70
+ echo "Skip auto-merge: gem update does not match auto-merge policy ($UPDATE_TYPE, $DEPENDENCY_TYPE)."
71
+ fi
72
+
73
+ echo "safe=$safe" >> "$GITHUB_OUTPUT"
74
+
75
+ - name: Enable auto-merge for safe bundler updates
76
+ if: ${{ steps.metadata.outputs.package-ecosystem == 'bundler' && steps.guard.outputs.safe == 'true' }}
77
+ env:
78
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
79
+ PR_NUMBER: ${{ github.event.pull_request.number }}
80
+ run: gh pr merge --repo "$GITHUB_REPOSITORY" --auto --merge "$PR_NUMBER"
81
+
82
+ enable-automerge-github-actions:
83
+ if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
84
+ runs-on: ubuntu-latest
85
+ permissions:
86
+ contents: write
87
+ pull-requests: write
88
+
89
+ steps:
90
+ - name: Fetch Dependabot metadata
91
+ id: metadata
92
+ uses: dependabot/fetch-metadata@v3
93
+ with:
94
+ github-token: ${{ secrets.GITHUB_TOKEN }}
95
+
96
+ - name: Validate GitHub Actions update safety
97
+ id: guard
98
+ if: ${{ steps.metadata.outputs.package-ecosystem == 'github-actions' }}
99
+ env:
100
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
101
+ PR_NUMBER: ${{ github.event.pull_request.number }}
102
+ UPDATE_TYPE: ${{ steps.metadata.outputs.update-type }}
103
+ DEPENDENCY_NAME: ${{ steps.metadata.outputs.dependency-name }}
104
+ DEPENDENCY_NAMES: ${{ steps.metadata.outputs.dependency-names }}
105
+ run: |
106
+ set -euo pipefail
107
+
108
+ safe=true
109
+
110
+ if [[ "$UPDATE_TYPE" != "version-update:semver-patch" && "$UPDATE_TYPE" != "version-update:semver-minor" ]]; then
111
+ echo "Skip auto-merge: update type is not patch/minor ($UPDATE_TYPE)."
112
+ safe=false
113
+ fi
114
+
115
+ deps="$DEPENDENCY_NAMES"
116
+ if [[ -z "$deps" ]]; then
117
+ deps="$DEPENDENCY_NAME"
118
+ fi
119
+
120
+ if [[ -z "$deps" ]]; then
121
+ echo "Skip auto-merge: dependency name is missing."
122
+ safe=false
123
+ else
124
+ while IFS= read -r dep; do
125
+ dep="$(echo "$dep" | xargs)"
126
+ [[ -z "$dep" ]] && continue
127
+
128
+ if [[ ! "$dep" =~ ^actions/ && ! "$dep" =~ ^github/ ]]; then
129
+ echo "Skip auto-merge: non-GitHub official action detected ($dep)."
130
+ safe=false
131
+ fi
132
+ done < <(echo "$deps" | tr ',' '\n')
133
+ fi
134
+
135
+ files_json="$(gh api -H "Accept: application/vnd.github+json" "/repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/files?per_page=100")"
136
+ if echo "$files_json" | jq -r '.[] | select((.patch // "") | test("(?m)^[+-]\\s*(permissions|pull_request_target)\\s*:")) | .filename' | grep -q .; then
137
+ echo "Skip auto-merge: permissions or pull_request_target changes were detected."
138
+ safe=false
139
+ fi
140
+
141
+ echo "safe=$safe" >> "$GITHUB_OUTPUT"
142
+
143
+ - name: Enable auto-merge for safe GitHub Actions patch/minor updates
144
+ if: ${{ steps.metadata.outputs.package-ecosystem == 'github-actions' && steps.guard.outputs.safe == 'true' }}
145
+ env:
146
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
147
+ PR_NUMBER: ${{ github.event.pull_request.number }}
148
+ run: gh pr merge --repo "$GITHUB_REPOSITORY" --auto --merge "$PR_NUMBER"