coaster 1.4.26 → 1.4.28

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: 35880fd3cb20083666bfc284028e1c8dbc5e2cae46e557eb30a8fea2a4674883
4
- data.tar.gz: e45639dcc455ea1b35ea7f530e293be7bacb15573f17e1b96c05d1bd8ce97ec9
3
+ metadata.gz: e53b6e577599120b7264569f9164e783b61563cd90255c55fc4608554c78d001
4
+ data.tar.gz: f7f410d4712a9ebfc57a44ebd1bd239471ec04222e25e79964b180a35ab14178
5
5
  SHA512:
6
- metadata.gz: 52cb285e0cb2021c59e02b1700737e50acd5110c22c48a3c582bfaf724b114ebbcabca25836861059f24942af1de8823aee04a70cf46c1f72bc86c74dcba849e
7
- data.tar.gz: b98327de788ce0c184f4977b52dc3e9196189a61308f9a17f8562d6d766697f990b6fc51987c3b6cab1eedbbe6d1872a21b197d80f69adcdc9f77812c3d521e7
6
+ metadata.gz: 2a16047f7c323c9baca6b71b13b410d3fb26639951457d6ab71c756e9dc3bac613fb0bc19afb352ce9613924b6283cc9f4d6da206355a76791af7a354b411c1b
7
+ data.tar.gz: 3a5806e48fdc46c314d60cb4e2926561e7ef2e31a642c2e0eb52cf34fbb6507bc012b6b4b0949232d9b7c1fcf72abf60dc6fc29dbfc5befe954c8ba832488c9d
data/bin/bundle ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ ARGV.each_with_index do |a, i|
30
+ if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
+ bundler_version = a
32
+ end
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../Gemfile", __dir__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_requirement
64
+ @bundler_requirement ||=
65
+ env_var_version || cli_arg_version ||
66
+ bundler_requirement_for(lockfile_version)
67
+ end
68
+
69
+ def bundler_requirement_for(version)
70
+ return "#{Gem::Requirement.default}.a" unless version
71
+
72
+ bundler_gem_version = Gem::Version.new(version)
73
+
74
+ requirement = bundler_gem_version.approximate_recommendation
75
+
76
+ return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")
77
+
78
+ requirement += ".a" if bundler_gem_version.prerelease?
79
+
80
+ requirement
81
+ end
82
+
83
+ def load_bundler!
84
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
85
+
86
+ activate_bundler
87
+ end
88
+
89
+ def activate_bundler
90
+ gem_error = activation_error_handling do
91
+ gem "bundler", bundler_requirement
92
+ end
93
+ return if gem_error.nil?
94
+ require_error = activation_error_handling do
95
+ require "bundler/version"
96
+ end
97
+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
98
+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
99
+ exit 42
100
+ end
101
+
102
+ def activation_error_handling
103
+ yield
104
+ nil
105
+ rescue StandardError, LoadError => e
106
+ e
107
+ end
108
+ end
109
+
110
+ m.load_bundler!
111
+
112
+ if m.invoked_as_script?
113
+ load Gem.bin_path("bundler", "bundle")
114
+ end
@@ -8,4 +8,15 @@ class Array
8
8
  true
9
9
  end
10
10
  end
11
+
12
+ def deep_key_count(**options)
13
+ sum do |v|
14
+ case v
15
+ when Hash, Array
16
+ v.deep_key_count
17
+ else
18
+ 1
19
+ end
20
+ end
21
+ end
11
22
  end
@@ -0,0 +1,18 @@
1
+ class Hash
2
+ def deep_key_count(**options)
3
+ keys.size + values.sum do |v|
4
+ case v
5
+ when Hash
6
+ v.deep_key_count(**options)
7
+ when Array
8
+ if options[:array_is_element]
9
+ 0
10
+ else
11
+ v.deep_key_count(**options)
12
+ end
13
+ else
14
+ 0
15
+ end
16
+ end
17
+ end
18
+ end
@@ -14,7 +14,7 @@ def require_more
14
14
  more_load_paths.each do |load_path|
15
15
  path = File.join(load_path, load_name)
16
16
  if File.exist?(path)
17
- return require_dependency path
17
+ return require path
18
18
  end
19
19
  end
20
20
 
@@ -0,0 +1,24 @@
1
+ def require_more
2
+ required_file_path = caller[0].split(':', 2).first
3
+ load_name = nil
4
+ load_path_index = $LOAD_PATH.each_with_index do |load_path, ix|
5
+ scanned = required_file_path.scan(/(#{load_path})#{File::SEPARATOR}(.*)/).first
6
+ next false unless scanned
7
+ load_name = scanned[1]
8
+ break ix
9
+ end
10
+
11
+ return false unless load_path_index
12
+
13
+ more_load_paths = $LOAD_PATH.drop(load_path_index + 1)
14
+ more_load_paths.each do |load_path|
15
+ path = File.join(load_path, load_name)
16
+ if File.exist?(path)
17
+ loaded = require(path)
18
+ loaded = load(path) unless loaded
19
+ return loaded
20
+ end
21
+ end
22
+
23
+ raise LoadError, "cannot require more -- #{load_name}"
24
+ end
@@ -1,5 +1,6 @@
1
1
  require_relative 'core_ext/require_more'
2
2
  require_relative 'core_ext/array'
3
+ require_relative 'core_ext/hash'
3
4
  require_relative 'core_ext/time'
4
5
  require_relative 'core_ext/date'
5
6
  require_relative 'core_ext/month'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionView
4
+ class Template
5
+ class Error < ActionViewError
6
+ # @return [Integer]
7
+ def http_status
8
+ cause.respond_to?(:http_status) ? cause.http_status : super
9
+ end
10
+ end
11
+ end
12
+ end
@@ -2,3 +2,6 @@ require 'coaster/rails_ext/active_support/backtrace_cleaner'
2
2
  ActiveSupport.on_load(:active_record, yield: true) do
3
3
  require 'coaster/rails_ext/active_record/errors'
4
4
  end
5
+ ActiveSupport.on_load(:action_view, yield: true) do
6
+ require "coaster/rails_ext/action_view/template/error"
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.4.26'
2
+ VERSION = '1.4.28'
3
3
  end
@@ -2,7 +2,7 @@ require 'coaster/serialized_properties'
2
2
  require 'coaster/safe_yaml_serializer'
3
3
 
4
4
  class User < ActiveRecord::Base
5
- serialize :data, Coaster::SafeYamlSerializer
5
+ serialize :data, coder: Coaster::SafeYamlSerializer
6
6
  extend Coaster::SerializedProperties
7
7
  serialized_column :data
8
8
  serialized_property :data, :appendix, default: {}
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest/autorun"
4
+ require "test_helper"
5
+ require "action_view"
6
+ require "coaster/rails_ext/action_view/template/error"
7
+
8
+ module Coaster
9
+ class BadRequest < StandardError
10
+ def self.http_status = 400
11
+ end
12
+
13
+ class TestActionView < Minitest::Test
14
+ def test_http_status
15
+ begin
16
+ raise BadRequest
17
+ rescue BadRequest => e
18
+ template = ActionView::Template.new("Hello, World!", "test", ActionView::Template::Handlers::Raw, locals: [])
19
+ err = ActionView::Template::Error.new(template)
20
+
21
+ assert_equal err.cause, e
22
+ assert_equal err.http_status, e.http_status
23
+ assert_equal err.http_status, 400
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_helper'
2
+ require 'minitest/autorun'
3
+
4
+ module Coaster
5
+ class TestDeepKeyCount < Minitest::Test
6
+ def test_deep_key_count
7
+ assert_equal 0, {}.deep_key_count
8
+ assert_equal 1, {a: 1}.deep_key_count
9
+ assert_equal 2, {a: {b: 1}}.deep_key_count
10
+ assert_equal 3, {a: {b: 1, c: 2}}.deep_key_count
11
+ assert_equal 6, {a: {b: 1, c: 2, d: [1, 2]}}.deep_key_count
12
+
13
+ assert_equal 0, [].deep_key_count
14
+ assert_equal 1, [1].deep_key_count
15
+ assert_equal 2, [1, 2].deep_key_count
16
+ assert_equal 2, [1, {b: 2}].deep_key_count
17
+ assert_equal 3, [1, {b: 2}, 3].deep_key_count
18
+ assert_equal 4, [1, {b: 2}, 3, {c: 4}].deep_key_count
19
+ assert_equal 5, [1, {b: 2}, 3, [{c: 4}, 5]].deep_key_count
20
+ end
21
+
22
+ def test_deep_key_count_array_is_element
23
+ assert_equal 1, {a: [1, 2]}.deep_key_count(array_is_element: true)
24
+ assert_equal 1, {a: [1, {b: 2}]}.deep_key_count(array_is_element: true)
25
+
26
+ assert_equal 2, [1, 2].deep_key_count(array_is_element: true)
27
+ assert_equal 2, [1, {b: 2}].deep_key_count(array_is_element: true)
28
+ assert_equal 3, [1, {b: 2, c: [1, 2]}].deep_key_count(array_is_element: true)
29
+
30
+ assert_equal 3, [1, {b: 2}, 3].deep_key_count(array_is_element: true)
31
+ assert_equal 3, [1, {b: 2}, [3, 4]].deep_key_count(array_is_element: true)
32
+ end
33
+ end
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.26
4
+ version: 1.4.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - buzz jung
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-19 00:00:00.000000000 Z
11
+ date: 2025-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -188,15 +188,18 @@ files:
188
188
  - LICENSE
189
189
  - README.md
190
190
  - Rakefile
191
+ - bin/bundle
191
192
  - bin/coaster
192
193
  - lib/coaster.rb
193
194
  - lib/coaster/cmd_options.rb
194
195
  - lib/coaster/core_ext.rb
195
196
  - lib/coaster/core_ext/array.rb
196
197
  - lib/coaster/core_ext/date.rb
198
+ - lib/coaster/core_ext/hash.rb
197
199
  - lib/coaster/core_ext/month.rb
198
200
  - lib/coaster/core_ext/object_translation.rb
199
201
  - lib/coaster/core_ext/require_more.rb
202
+ - lib/coaster/core_ext/require_more_reload.rb
200
203
  - lib/coaster/core_ext/standard_error.rb
201
204
  - lib/coaster/core_ext/standard_error/raven.rb
202
205
  - lib/coaster/core_ext/standard_error/sentry.rb
@@ -206,6 +209,7 @@ files:
206
209
  - lib/coaster/git/options.rb
207
210
  - lib/coaster/git/repository.rb
208
211
  - lib/coaster/rails_ext.rb
212
+ - lib/coaster/rails_ext/action_view/template/error.rb
209
213
  - lib/coaster/rails_ext/active_record/errors.rb
210
214
  - lib/coaster/rails_ext/active_support/backtrace_cleaner.rb
211
215
  - lib/coaster/safe_yaml_serializer.rb
@@ -215,8 +219,10 @@ files:
215
219
  - test/locales/en.yml
216
220
  - test/support/models.rb
217
221
  - test/support/schema.rb
222
+ - test/test_action_view.rb
218
223
  - test/test_backtrace.rb
219
224
  - test/test_date.rb
225
+ - test/test_deep_key_count.rb
220
226
  - test/test_git.rb
221
227
  - test/test_git_options.rb
222
228
  - test/test_git_repository.rb
@@ -256,8 +262,10 @@ test_files:
256
262
  - test/locales/en.yml
257
263
  - test/support/models.rb
258
264
  - test/support/schema.rb
265
+ - test/test_action_view.rb
259
266
  - test/test_backtrace.rb
260
267
  - test/test_date.rb
268
+ - test/test_deep_key_count.rb
261
269
  - test/test_git.rb
262
270
  - test/test_git_options.rb
263
271
  - test/test_git_repository.rb