washout_builder 1.7.4 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +15 -14
  3. data/Appraisals +8 -2
  4. data/README.md +22 -1
  5. data/Rakefile +3 -3
  6. data/app/controllers/washout_builder/washout_builder_controller.rb +9 -9
  7. data/app/helpers/washout_builder_complex_type_helper.rb +4 -2
  8. data/app/helpers/washout_builder_method_arguments_helper.rb +4 -2
  9. data/app/helpers/washout_builder_method_list_helper.rb +4 -2
  10. data/app/helpers/washout_builder_method_return_type_helper.rb +6 -4
  11. data/app/helpers/washout_builder_shared_helper.rb +29 -0
  12. data/app/views/wash_with_html/doc.builder +6 -6
  13. data/gemfiles/rails_6.1.3.gemfile +8 -0
  14. data/install-travis-bundler.sh +12 -10
  15. data/lib/washout_builder.rb +0 -1
  16. data/lib/washout_builder/document/complex_type.rb +35 -54
  17. data/lib/washout_builder/document/exception_model.rb +17 -18
  18. data/lib/washout_builder/document/generator.rb +6 -6
  19. data/lib/washout_builder/engine.rb +1 -0
  20. data/lib/washout_builder/env_checker.rb +2 -2
  21. data/lib/washout_builder/soap.rb +2 -2
  22. data/lib/washout_builder/version.rb +2 -2
  23. data/spec/app/controllers/washout_builder_controller_spec.rb +4 -4
  24. data/spec/dummy/app/views/layouts/application.html.erb +1 -1
  25. data/spec/dummy/public/404.html +1 -1
  26. data/spec/dummy/public/422.html +1 -1
  27. data/spec/dummy/public/500.html +1 -1
  28. data/spec/lib/washout_builder/document/complex_type_spec.rb +32 -36
  29. data/spec/lib/washout_builder/document/exception_model_spec.rb +5 -5
  30. data/spec/spec_helper.rb +37 -2
  31. data/spec/support/complex_types/test_type.rb +1 -2
  32. data/washout_builder.gemspec +3 -2
  33. metadata +55 -60
  34. data/lib/washout_builder/param.rb +0 -50
@@ -16,18 +16,18 @@ module WashoutBuilder
16
16
  # @see #find_fault_model_structure
17
17
  # @see #fault_without_inheritable_elements
18
18
  #
19
- # @param [Array<Hash>] defined An array that contains all the information about all the exception classes found so far
19
+ # @param [Array<Hash>] classes_defined An array that contains all the information about all the exception classes found so far
20
20
  # @param [Boolean] _debug = false An optional parameter used for debugging purposes
21
21
  # @return [Array<Class>] Array with all the exception classes from which the current exception class inherits from
22
22
  # @api public
23
- def get_fault_class_ancestors(defined, _debug = false)
23
+ def get_fault_class_ancestors(classes_defined, _debug = false)
24
24
  bool_the_same = false
25
25
  ancestors = fault_ancestors
26
26
  if ancestors.blank?
27
- defined << fault_ancestor_hash(find_fault_model_structure, [])
27
+ classes_defined << fault_ancestor_hash(find_fault_model_structure, [])
28
28
  else
29
- defined << fault_ancestor_hash(fault_without_inheritable_elements(ancestors), ancestors)
30
- ancestors[0].get_fault_class_ancestors(defined)
29
+ classes_defined << fault_ancestor_hash(fault_without_inheritable_elements(ancestors), ancestors)
30
+ ancestors[0].get_fault_class_ancestors(classes_defined)
31
31
  end
32
32
  ancestors unless bool_the_same
33
33
  end
@@ -47,7 +47,7 @@ module WashoutBuilder
47
47
  # @return [Array<Class>] Returns an array with all the classes from which the current exception class inherits from
48
48
  # @api public
49
49
  def fault_ancestors
50
- get_complex_type_ancestors(self, ['ActiveRecord::Base', 'Object', 'BasicObject', 'Exception'])
50
+ get_complex_type_ancestors(self, %w(ActiveRecord::Base Object BasicObject Exception))
51
51
  end
52
52
 
53
53
  # constructs the structure of the current exception class by holding the instance, the structure, and its ancestors
@@ -80,9 +80,9 @@ module WashoutBuilder
80
80
  # @api public
81
81
  def check_valid_fault_method?(method)
82
82
  method != :== && method != :! &&
83
- (instance_methods.include?(:"#{method}=") ||
84
- instance_methods.include?(:"#{method}")
85
- )
83
+ (instance_methods.include?(:"#{method}=") ||
84
+ instance_methods.include?(:"#{method}")
85
+ )
86
86
  end
87
87
 
88
88
  # tries to fins all instance methods that have both a setter and a getter of the curent class
@@ -90,7 +90,6 @@ module WashoutBuilder
90
90
  # @return [Array<String>] An array with all the atrributes and instance methods that have both a setter and a getter
91
91
  # @api public
92
92
  def find_fault_attributes
93
- attrs = []
94
93
  attrs = instance_methods(nil).map do |method|
95
94
  method.to_s if check_valid_fault_method?(method)
96
95
  end
@@ -105,12 +104,12 @@ module WashoutBuilder
105
104
  # @api public
106
105
  def get_fault_type_method(method_name)
107
106
  case method_name.to_s.downcase
108
- when 'code'
109
- 'integer'
110
- when 'message', 'backtrace'
111
- 'string'
112
- else
113
- 'string'
107
+ when 'code'
108
+ 'integer'
109
+ when 'message', 'backtrace'
110
+ 'string'
111
+ else
112
+ 'string'
114
113
  end
115
114
  end
116
115
 
@@ -126,8 +125,8 @@ module WashoutBuilder
126
125
  method_name = method_name.to_s.end_with?('=') ? method_name.to_s.delete('=') : method_name
127
126
  primitive_type = get_fault_type_method(method_name)
128
127
  h["#{method_name}"] = {
129
- primitive: "#{primitive_type}",
130
- member_type: nil
128
+ primitive: "#{primitive_type}",
129
+ member_type: nil
131
130
  }
132
131
  end
133
132
  h
@@ -164,11 +164,11 @@ module WashoutBuilder
164
164
  # @return [Array<WashOut::Param>] Returns an array with all the complex types sorted alphabetically
165
165
  # @api public
166
166
  def complex_types
167
- defined = []
167
+ classes_defined = []
168
168
  (input_types + output_types).each do |p|
169
- defined.concat(p.get_nested_complex_types(config, defined))
169
+ classes_defined.concat(p.get_nested_complex_types(config, classes_defined))
170
170
  end
171
- defined = sort_complex_types(defined, 'class')
171
+ sort_complex_types(classes_defined, 'class')
172
172
  end
173
173
 
174
174
  # Returns an array with all the operations that can raise an exception at least or more
@@ -205,9 +205,9 @@ module WashoutBuilder
205
205
  # @api public
206
206
  def get_complex_fault_types(base_fault_array)
207
207
  fault_types = []
208
- defined = filter_exceptions_raised
209
- defined = defined.blank? ? base_fault_array : defined.concat(base_fault_array)
210
- defined.each { |exception_class| exception_class.get_fault_class_ancestors(fault_types, true) } unless defined.blank?
208
+ classes_defined = filter_exceptions_raised
209
+ classes_defined = classes_defined.blank? ? base_fault_array : classes_defined.concat(base_fault_array)
210
+ classes_defined.each { |exception_class| exception_class.get_fault_class_ancestors(fault_types, true) } unless classes_defined.blank?
211
211
  fault_types
212
212
  end
213
213
 
@@ -4,6 +4,7 @@ module WashoutBuilder
4
4
  class Engine < ::Rails::Engine
5
5
  isolate_namespace WashoutBuilder
6
6
  config.washout_builder = ActiveSupport::OrderedOptions.new
7
+
7
8
  initializer 'washout_builder.configuration' do |app|
8
9
  mounted_path = app.config.washout_builder[:mounted_path]
9
10
  if WashoutBuilder::EnvChecker.new(app).available_for_env?(Rails.env)
@@ -9,7 +9,7 @@ module WashoutBuilder
9
9
  end
10
10
 
11
11
  def available_for_env?(env_name)
12
- if (whitelist.present? || blacklist.present?)
12
+ if whitelist.present? || blacklist.present?
13
13
  if whitelist.find{|a| blacklist.include?(a) }.blank?
14
14
  if whitelist.include?('*') || (!valid_for_env?(blacklist, env_name) && valid_for_env?(whitelist, env_name))
15
15
  return true
@@ -18,7 +18,7 @@ module WashoutBuilder
18
18
  else
19
19
  return true
20
20
  end
21
- return false
21
+ false
22
22
  end
23
23
 
24
24
 
@@ -37,8 +37,8 @@ module WashoutBuilder
37
37
  current_action = soap_actions[action]
38
38
  base_param_class = WashoutBuilder::Type.base_param_class
39
39
  return if base_param_class.blank?
40
- current_action[:builder_in] = base_param_class.parse_builder_def(soap_config, options[:args])
41
- current_action[:builder_out] = base_param_class.parse_builder_def(soap_config, options[:return])
40
+ current_action[:builder_in] = base_param_class.parse_def(soap_config, options[:args])
41
+ current_action[:builder_out] = base_param_class.parse_def(soap_config, options[:return])
42
42
  current_action[:args_description] = options[:args_description].present? && options[:args_description].is_a?(Hash) ? options[:args_description].stringify_keys : {}
43
43
  current_action
44
44
  end
@@ -8,9 +8,9 @@ module WashoutBuilder
8
8
  # the module that is used to generate the gem version
9
9
  module VERSION
10
10
  # the major version of the gem
11
- MAJOR = 1
11
+ MAJOR = 2
12
12
  # the minor version of the gem
13
- MINOR = 7
13
+ MINOR = 0
14
14
  # the tiny version of the gem
15
15
  TINY = 4
16
16
  # if the version should be a prerelease
@@ -11,8 +11,8 @@ describe WashoutBuilder::WashoutBuilderController, type: :controller do
11
11
 
12
12
  let(:soap_config) do
13
13
  OpenStruct.new(
14
- camelize_wsdl: false,
15
- namespace: '/api/wsdl'
14
+ camelize_wsdl: false,
15
+ namespace: '/api/wsdl'
16
16
  )
17
17
  end
18
18
 
@@ -33,7 +33,7 @@ describe WashoutBuilder::WashoutBuilderController, type: :controller do
33
33
  it 'renders the template' do
34
34
  get :all
35
35
  expect(subject.instance_variable_get(:@file_to_serve)).to eq('wash_with_html/all_services')
36
- expect(response.content_type).to eq("text/html")
36
+ expect(response.media_type).to eq("text/html")
37
37
  expect(response).to have_http_status(:ok)
38
38
  end
39
39
 
@@ -52,7 +52,7 @@ describe WashoutBuilder::WashoutBuilderController, type: :controller do
52
52
  get :all, params
53
53
  end
54
54
  expect(subject.instance_variable_get(:@file_to_serve)).to eq('wash_with_html/doc')
55
- expect(response.content_type).to eq("text/html")
55
+ expect(response.media_type).to eq("text/html")
56
56
  expect(response).to have_http_status(:ok)
57
57
  end
58
58
  end
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <title>Dummy</title>
5
5
  <%= stylesheet_link_tag :all %>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <title>The page you were looking for doesn't exist (404)</title>
5
5
  <style type="text/css">
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <title>The change you wanted was rejected (422)</title>
5
5
  <style type="text/css">
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <title>We're sorry, but something went wrong (500)</title>
5
5
  <style type="text/css">
@@ -4,9 +4,9 @@ require 'spec_helper'
4
4
  describe WashoutBuilder::Document::ComplexType do
5
5
  let(:soap_config) do
6
6
  OpenStruct.new(
7
- camelize_wsdl: false,
8
- namespace: '/api/wsdl',
9
- description: 'some description'
7
+ camelize_wsdl: false,
8
+ namespace: '/api/wsdl',
9
+ description: 'some description'
10
10
  )
11
11
  end
12
12
 
@@ -14,33 +14,29 @@ describe WashoutBuilder::Document::ComplexType do
14
14
  let(:namespaced_object) { get_wash_out_param(Api::TestType) }
15
15
 
16
16
  it 'returns the complex class name' do
17
- expect(subject.find_complex_class_name).to eq('ProjectType')
17
+ expect(subject.find_complex_class_name).to eq('Project')
18
18
  end
19
19
 
20
- it 'returns the complex class name' do
21
- expect(subject.find_complex_class_name).to eq('ProjectType')
20
+ it 'returns the complex class with namespace' do
21
+ expect(namespaced_object.find_complex_class_name).to eq('Project')
22
22
  end
23
23
 
24
- it 'returns the complex class with namespace' do
25
- expect(namespaced_object.find_complex_class_name).to eq('Api::TestType')
24
+ it 'does not return error if classname already detected (only used for hashes) and same structure' do
25
+ subject.stubs(:classified?).returns(false)
26
+ subject.stubs(:basic_type).returns('ProjectType')
27
+ classes_defined = [{ class: 'ProjectType', obj: get_wash_out_param(ProjectType), ancestors: [] }]
28
+ expect { subject.find_complex_class_name(classes_defined) }.to_not raise_error(RuntimeError, 'Duplicate use of `ProjectType` type name. Consider using classified types.')
26
29
  end
27
30
 
28
31
  it 'returns error if classname already detected (only used for hashes)' do
29
32
  subject.stubs(:classified?).returns(false)
30
33
  subject.stubs(:basic_type).returns('ProjectType')
31
- defined = [{ class: 'ProjectType' }]
32
- expect { subject.find_complex_class_name(defined) }.to raise_error(RuntimeError, 'Duplicate use of `ProjectType` type name. Consider using classified types.')
34
+ classes_defined = [{ class: 'ProjectType', obj: get_wash_out_param(Api::TestType), ancestors: [] }]
35
+ expect { subject.find_complex_class_name(classes_defined) }.to raise_error(RuntimeError, 'Duplicate use of `ProjectType` type name. Consider using classified types.')
33
36
  end
34
37
 
35
38
  it 'returns the param structure' do
36
- expect(subject.find_param_structure).to eq('project' => 'struct')
37
- end
38
-
39
- it 'fixes the first descendant ' do
40
- descendant = get_wash_out_param(ProjectType.wash_out_param_map)
41
- subject.fix_descendant_wash_out_type(soap_config, ProjectType)
42
- expect(subject.name).to eq(descendant.name)
43
- expect(subject.map[0].find_param_structure).to eq(descendant.map[0].find_param_structure)
39
+ expect(subject.find_param_structure).to eq("description"=>"string", "name"=>"string", "users"=>"struct")
44
40
  end
45
41
 
46
42
  it 'same as ancestor' do
@@ -79,18 +75,18 @@ describe WashoutBuilder::Document::ComplexType do
79
75
 
80
76
  describe '#complex_type_descendants' do
81
77
  it 'returns empty array if not struct?' do
82
- defined = []
78
+ classes_defined = []
83
79
  subject.stubs(:struct?).returns(false)
84
- expect(subject.complex_type_descendants(soap_config, defined)).to eq(defined)
80
+ expect(subject.complex_type_descendants(soap_config, classes_defined)).to eq(classes_defined)
85
81
  end
86
82
 
87
83
  it 'returns the descendants if struct?' do
88
- defined = []
84
+ classes_defined = []
89
85
  subject.map.each do |obj|
90
- obj.expects(:get_nested_complex_types).with(soap_config, defined).returns([obj.name])
86
+ obj.expects(:get_nested_complex_types).with(soap_config, classes_defined).returns([obj.name])
91
87
  end
92
88
  subject.stubs(:struct?).returns(true)
93
- expect(subject.complex_type_descendants(soap_config, defined)).to eq(subject.map.map(&:name))
89
+ expect(subject.complex_type_descendants(soap_config, classes_defined)).to eq(subject.map.map(&:name))
94
90
  end
95
91
  end
96
92
 
@@ -101,21 +97,20 @@ describe WashoutBuilder::Document::ComplexType do
101
97
  let(:expected) { [complex_type_hash] }
102
98
 
103
99
  it 'returns the complex class ancestors' do
104
- defined = []
105
- subject.expects(:find_complex_class_name).with(defined).returns(complex_class)
106
- subject.expects(:fix_descendant_wash_out_type).with(soap_config, complex_class).returns(true)
107
- subject.expects(:complex_type_ancestors).with(soap_config, complex_class, defined).returns(ancestors)
100
+ classes_defined = []
101
+ subject.expects(:find_complex_class_name).with(classes_defined).returns(complex_class)
102
+ subject.expects(:find_class_from_string).with(complex_class).returns(nil)
103
+ subject.expects(:complex_type_ancestors).with(soap_config, complex_class, classes_defined).returns(ancestors)
108
104
  subject.expects(:complex_type_hash).with(complex_class, subject, ancestors).returns(complex_type_hash)
109
105
  subject.expects(:complex_type_descendants).with(soap_config, [complex_type_hash]).returns(expected)
110
- expect(subject.get_nested_complex_types(soap_config, defined)).to eq(expected)
106
+ expect(subject.get_nested_complex_types(soap_config, classes_defined)).to eq(expected)
111
107
  end
112
108
 
113
109
  it 'returns the the descendants' do
114
- defined = nil
110
+ classes_defined = nil
115
111
  subject.expects(:find_complex_class_name).with([]).returns(nil)
116
- subject.expects(:fix_descendant_wash_out_type).with(soap_config, nil).returns(true)
117
112
  subject.expects(:complex_type_descendants).with(soap_config, []).returns(expected)
118
- expect(subject.get_nested_complex_types(soap_config, defined)).to eq(expected)
113
+ expect(subject.get_nested_complex_types(soap_config, classes_defined)).to eq(expected)
119
114
  end
120
115
  end
121
116
 
@@ -139,7 +134,7 @@ describe WashoutBuilder::Document::ComplexType do
139
134
 
140
135
  describe '#get_class_ancestors' do
141
136
  let(:class_name) { 'ProjectType' }
142
- let(:defined) { [] }
137
+ let(:classes_defined) { [] }
143
138
  let(:ancestors) { ['SomeInexistentClass'] }
144
139
  let(:ancestor_structure) { { ancestors[0].to_s.downcase => 'bla' } }
145
140
  let(:top_ancestors) {}
@@ -147,7 +142,7 @@ describe WashoutBuilder::Document::ComplexType do
147
142
 
148
143
  it 'returns nil if no ancestors' do
149
144
  subject.expects(:get_ancestors).with(class_name).returns(nil)
150
- expect(subject.get_class_ancestors(soap_config, class_name, defined)).to eq(nil)
145
+ expect(subject.get_class_ancestors(soap_config, class_name, classes_defined)).to eq(nil)
151
146
  end
152
147
 
153
148
  it 'returns the ancestors and the top ones' do
@@ -157,15 +152,16 @@ describe WashoutBuilder::Document::ComplexType do
157
152
  WashOut::Param.stubs(:parse_def).returns([namespaced_object])
158
153
  subject.expects(:same_structure_as_ancestor?).with(namespaced_object).returns(false)
159
154
  subject.expects(:complex_type_hash).returns(complex_type_hash)
160
- expect(subject.get_class_ancestors(soap_config, class_name, defined)).to eq([complex_type_hash])
155
+ expect(subject.get_class_ancestors(soap_config, class_name, classes_defined)).to eq([complex_type_hash])
161
156
  end
162
157
 
163
158
  it 'returns nil if same structure as ancestor' do
159
+ namespaced_object
164
160
  subject.expects(:get_ancestors).with(class_name).returns(ancestors)
165
161
  subject.expects(:ancestor_structure).with(ancestors).returns(ancestor_structure)
166
- WashOut::Param.stubs(:parse_def).returns([namespaced_object])
162
+ WashOut::Param.stubs(:parse_def).with(soap_config, ancestor_structure).returns([namespaced_object])
167
163
  subject.expects(:same_structure_as_ancestor?).with(namespaced_object).returns(true)
168
- expect(subject.get_class_ancestors(soap_config, class_name, defined)).to eq(nil)
164
+ expect(subject.get_class_ancestors(soap_config, class_name, classes_defined)).to eq(nil)
169
165
  end
170
166
  end
171
167
  end
@@ -20,7 +20,7 @@ describe WashoutBuilder::Document::ExceptionModel do
20
20
 
21
21
  specify { expect(InheritedExceptionModel.included_modules).to include(WashoutBuilder::Document::SharedComplexType) }
22
22
 
23
- def fault_ancestor_hash(subject, structure, ancestors)
23
+ def exception_ancestor_hash(subject, structure, ancestors)
24
24
  { fault: subject, structure: structure, ancestors: ancestors }
25
25
  end
26
26
 
@@ -48,11 +48,11 @@ describe WashoutBuilder::Document::ExceptionModel do
48
48
  end
49
49
 
50
50
  it 'fault_ancestor_hash' do
51
- expect(subject.fault_ancestor_hash(structure, ancestors)).to eq(fault_ancestor_hash(subject, structure, ancestors))
51
+ expect(subject.fault_ancestor_hash(structure, ancestors)).to eq(exception_ancestor_hash(subject, structure, ancestors))
52
52
  end
53
53
 
54
54
  it 'gets the fault_ancestors' do
55
- subject.expects(:get_complex_type_ancestors).with(subject, ['ActiveRecord::Base', 'Object', 'BasicObject', 'Exception']).returns(ancestors)
55
+ subject.expects(:get_complex_type_ancestors).with(subject, %w(ActiveRecord::Base Object BasicObject Exception)).returns(ancestors)
56
56
  expect(subject.fault_ancestors).to eq ancestors
57
57
  end
58
58
 
@@ -69,12 +69,12 @@ describe WashoutBuilder::Document::ExceptionModel do
69
69
  it 'gets the ancestors' do
70
70
  subject.expects(:fault_ancestors).returns(nil)
71
71
  subject.expects(:find_fault_model_structure).returns(structure)
72
- subject.expects(:fault_ancestor_hash).with(structure, []).returns(fault_ancestor_hash(subject, structure, ancestors))
72
+ subject.expects(:fault_ancestor_hash).with(structure, []).returns(exception_ancestor_hash(subject, structure, ancestors))
73
73
  expect(subject.get_fault_class_ancestors([])).to eq(nil)
74
74
  end
75
75
 
76
76
  it 'gets the ancestors' do
77
- expected_defined = fault_ancestor_hash(subject, structure, ancestors)
77
+ expected_defined = exception_ancestor_hash(subject, structure, ancestors)
78
78
  subject.expects(:fault_ancestors).returns(ancestors)
79
79
  subject.expects(:fault_without_inheritable_elements).with(ancestors).returns(structure)
80
80
  subject.expects(:fault_ancestor_hash).returns(expected_defined)
data/spec/spec_helper.rb CHANGED
@@ -98,11 +98,11 @@ end
98
98
  class WashoutBuilderTestError < base_exception
99
99
  end
100
100
 
101
- def get_wash_out_param(class_name_or_structure, soap_config = OpenStruct.new(
101
+ def get_wash_out_param(class_or_struct, soap_config = OpenStruct.new(
102
102
  camelize_wsdl: false,
103
103
  namespace: '/api/wsdl'
104
104
  ))
105
- WashOut::Param.parse_builder_def(soap_config, class_name_or_structure)[0]
105
+ WashOut::Param.parse_def(soap_config, class_or_struct)[0]
106
106
  end
107
107
 
108
108
  class Hash
@@ -133,6 +133,16 @@ class Hash
133
133
  end
134
134
  end
135
135
 
136
+ Builder::XmlBase.class_eval do
137
+
138
+ alias_method :old_method_missing, :method_missing
139
+
140
+ def method_missing(sym, *args, &block)
141
+ return if ['inspect'].include?(sym.to_s)
142
+ old_method_missing(sym, *args, &block)
143
+ end
144
+ end
145
+
136
146
  unless defined?(silence_stream) # Rails 5
137
147
  def silence_stream(stream)
138
148
  old_stream = stream.dup
@@ -144,3 +154,28 @@ unless defined?(silence_stream) # Rails 5
144
154
  old_stream.close
145
155
  end
146
156
  end
157
+
158
+ # TODO: remove this when wasabi will update their code
159
+ require 'uri'
160
+ if !defined?(::URI.unescape)
161
+ ::URI.class_eval do
162
+ # this was removed in this commit
163
+ # https://github.com/ruby/uri/commit/61c6a47ebf1f2726b60a2bbd70964d64e14b1f98
164
+ # so we are adding it back because we need to be compatible with wasabi on ruby 3.0.0
165
+ module UriEscapeBackport
166
+
167
+ def escape(*arg)
168
+ ::URI::DEFAULT_PARSER.escape(*arg)
169
+ end
170
+
171
+ alias encode escape
172
+
173
+ def unescape(*arg)
174
+ ::URI::DEFAULT_PARSER.unescape(*arg)
175
+ end
176
+
177
+ alias decode unescape
178
+ end
179
+ extend UriEscapeBackport
180
+ end
181
+ end