ree_lib 1.0.87 → 1.0.89

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +22 -22
  3. data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +0 -12
  4. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +0 -90
  5. data/lib/ree_lib/packages/ree_dao/Package.schema.json +0 -28
  6. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb +29 -21
  7. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_pg_connection_spec.rb +10 -3
  8. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb +0 -37
  9. data/lib/ree_lib/packages/ree_http/package/ree_http/functions/execute_request.rb +27 -20
  10. data/lib/ree_lib/packages/ree_http/schemas/ree_http/functions/execute_request.schema.json +8 -0
  11. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_delete_spec.rb +10 -8
  12. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_get_spec.rb +79 -18
  13. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_options_spec.rb +6 -5
  14. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_patch_spec.rb +8 -4
  15. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_post_spec.rb +5 -10
  16. data/lib/ree_lib/packages/ree_http/spec/ree_http/functions/http_put_spec.rb +5 -3
  17. data/lib/ree_lib/packages/ree_i18n/spec/ree_i18n/functions/t_spec.rb +4 -4
  18. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb +22 -6
  19. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/benchmarks/mapper_benchmark_spec.rb +31 -0
  20. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/bool_spec.rb +8 -8
  21. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_spec.rb +10 -10
  22. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/date_time_spec.rb +16 -16
  23. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/float_spec.rb +13 -13
  24. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb +2 -2
  25. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/integer_spec.rb +14 -14
  26. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/rational_spec.rb +12 -12
  27. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/string_spec.rb +12 -12
  28. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/time_spec.rb +16 -16
  29. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/type_options_spec.rb +4 -4
  30. data/lib/ree_lib/packages/ree_mapper/spec/ree_mapper/wrappers/array_spec.rb +6 -6
  31. data/lib/ree_lib/version.rb +1 -1
  32. metadata +17 -24
  33. data/lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb +0 -81
  34. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb +0 -15
  35. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/extract_changes.rb +0 -26
  36. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb +0 -15
  37. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/beans/dao_cache.schema.json +0 -22
  38. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json +0 -31
  39. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json +0 -45
  40. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5c70eda05d58f496b0eca7cbc95f853dd51c8b9e33b23c1fa1b51a74eb58104
4
- data.tar.gz: bf15e2be0aa79c7696ec9bfb074c3748c7061a5aec1079c5fa208aa1cbc16f1c
3
+ metadata.gz: 42bfcdb43c2ebd44badd128321d5b277951829cd63f0ec4d28157ae6526b04f4
4
+ data.tar.gz: 0c42d2aa910eff7c1fc4da08aab37f21236b1e656b69399deb5f71cf10db127b
5
5
  SHA512:
6
- metadata.gz: c068ce8ba9567eab38bd06c0bdc01731f223f1f4126ac70f5d49c9fc40a9e5034cb7e3cfb2fd84ef578018a31dd5934b6c9283b9a72b3d58e69bdf265af481ca
7
- data.tar.gz: e2f1b8a4428e46d27e40f98d9134d47139c5de080eef52eeee63cf5cf9eb86fb76fdc54b6d437c810f8a8d5b71889e180903ee8dce4463e82ec2f2769c3bffdf
6
+ metadata.gz: d8b868775ba1f7f0e3b692c646389b591d7615289cdd717220568bef46641972d0e281cf4dc8bcdd535b977420503070a5ae7cd06256c2c3a6bdd2366018e62a
7
+ data.tar.gz: 1eef6d917be75f9169788f327bb36833378186ba453af0dd99a791f1a4c5e555e6f2d4976f5b1468a8604ea3f3584847c0dd201bed7317940c2171c6546c1b2e
data/Gemfile.lock CHANGED
@@ -1,53 +1,52 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.87)
4
+ ree_lib (1.0.89)
5
5
  bigdecimal (~> 3.1.6)
6
6
  binding_of_caller (~> 1.0.0)
7
- i18n (~> 1.12.0)
8
- loofah (~> 2.18.0)
9
- oj (~> 3.13.17)
7
+ i18n (~> 1.14.1)
8
+ loofah (~> 2.22.0)
9
+ oj (~> 3.16.3)
10
10
  rainbow (~> 3.1.1)
11
11
  ree (~> 1.0.0)
12
- sequel (~> 5.58.0)
12
+ sequel (~> 5.76.0)
13
13
  tzinfo (~> 2.0.5)
14
14
 
15
15
  GEM
16
16
  remote: https://rubygems.org/
17
17
  specs:
18
- abbrev (0.1.2)
19
18
  addressable (2.8.6)
20
19
  public_suffix (>= 2.0.2, < 6.0)
21
20
  bigdecimal (3.1.6)
22
21
  binding_of_caller (1.0.0)
23
22
  debug_inspector (>= 0.0.1)
24
- bootsnap (1.17.0)
23
+ bootsnap (1.17.1)
25
24
  msgpack (~> 1.2)
26
25
  commander (5.0.0)
27
26
  highline (~> 3.0.0)
28
- concurrent-ruby (1.2.2)
27
+ concurrent-ruby (1.2.3)
29
28
  crack (0.4.5)
30
29
  rexml
31
30
  crass (1.0.6)
32
31
  debug_inspector (1.2.0)
33
32
  diff-lcs (1.5.0)
34
- faker (3.2.2)
33
+ faker (3.2.3)
35
34
  i18n (>= 1.8.11, < 2)
36
35
  hashdiff (1.1.0)
37
- highline (3.0.0)
38
- abbrev
39
- i18n (1.12.0)
36
+ highline (3.0.1)
37
+ i18n (1.14.1)
40
38
  concurrent-ruby (~> 1.0)
41
- loofah (2.18.0)
39
+ loofah (2.22.0)
42
40
  crass (~> 1.0.2)
43
- nokogiri (>= 1.5.9)
41
+ nokogiri (>= 1.12.0)
44
42
  msgpack (1.7.2)
45
43
  nokogiri (1.16.0-x86_64-darwin)
46
44
  racc (~> 1.4)
47
45
  nokogiri (1.16.0-x86_64-linux)
48
46
  racc (~> 1.4)
49
- oj (3.13.23)
50
- pg (1.4.6)
47
+ oj (3.16.3)
48
+ bigdecimal (>= 3.0)
49
+ pg (1.5.4)
51
50
  public_suffix (5.0.4)
52
51
  racc (1.7.3)
53
52
  rack (3.0.8)
@@ -58,9 +57,9 @@ GEM
58
57
  ree (1.0.34)
59
58
  commander (~> 5.0.0)
60
59
  rexml (3.2.6)
61
- roda (3.58.0)
60
+ roda (3.76.0)
62
61
  rack
63
- rollbar (3.3.3)
62
+ rollbar (3.5.1)
64
63
  rspec (3.12.0)
65
64
  rspec-core (~> 3.12.0)
66
65
  rspec-expectations (~> 3.12.0)
@@ -74,7 +73,8 @@ GEM
74
73
  diff-lcs (>= 1.2.0, < 2.0)
75
74
  rspec-support (~> 3.12.0)
76
75
  rspec-support (3.12.1)
77
- sequel (5.58.0)
76
+ sequel (5.76.0)
77
+ bigdecimal
78
78
  sqlite3 (1.4.4)
79
79
  timecop (0.9.8)
80
80
  tzinfo (2.0.6)
@@ -95,12 +95,12 @@ PLATFORMS
95
95
  DEPENDENCIES
96
96
  bootsnap
97
97
  faker (~> 3.2)
98
- pg (~> 1.4.1)
98
+ pg (~> 1.5.4)
99
99
  rack-test
100
100
  rake (~> 13.0)
101
101
  ree_lib!
102
- roda (~> 3.58.0)
103
- rollbar (~> 3.3.1)
102
+ roda (~> 3.76.0)
103
+ rollbar (~> 3.5.1)
104
104
  rspec
105
105
  sqlite3 (~> 1.4.4)
106
106
  timecop (~> 0.9.5)
@@ -7,19 +7,11 @@ module ReeActions
7
7
  def self.included(base)
8
8
  base.extend(ClassMethods)
9
9
  base.include(ReeMapper::DSL)
10
- link_dao_cache(base)
11
10
  end
12
11
 
13
12
  def self.extended(base)
14
13
  base.extend(ClassMethods)
15
14
  base.include(ReeMapper::DSL)
16
- link_dao_cache(base)
17
- end
18
-
19
- private_class_method def self.link_dao_cache(base)
20
- base.include(Ree::LinkDSL)
21
- base.link :drop_cache, as: :__ree_dao_drop_cache, from: :ree_dao
22
- base.link :init_cache, as: :__ree_dao_init_cache, from: :ree_dao
23
15
  end
24
16
 
25
17
  module ClassMethods
@@ -52,8 +44,6 @@ module ReeActions
52
44
  alias_method(:__original_call, :call)
53
45
 
54
46
  define_method :call do |user_access, attrs|
55
- __ree_dao_init_cache
56
-
57
47
  if self.class.const_defined?(:ActionCaster)
58
48
  caster = self.class.const_get(:ActionCaster)
59
49
 
@@ -69,8 +59,6 @@ module ReeActions
69
59
  end
70
60
 
71
61
  __original_call(user_access, attrs)
72
- ensure
73
- __ree_dao_drop_cache
74
62
  end
75
63
 
76
64
  nil
@@ -89,94 +89,4 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
89
89
  result = ReeActionsTest::TestAction2.new.call('user_access', {user_id: 1})
90
90
  expect(result).to eq(1)
91
91
  }
92
-
93
- it {
94
- module ReeActionsTest
95
- include Ree::PackageDSL
96
-
97
- package do
98
- depends_on :ree_mapper
99
- depends_on :ree_dao
100
- end
101
-
102
- class Db
103
- include Ree::BeanDSL
104
-
105
- bean :db do
106
- singleton
107
- factory :build
108
-
109
- link :build_sqlite_connection, from: :ree_dao
110
- end
111
-
112
- def build
113
- build_sqlite_connection({database: 'sqlite_db'})
114
- end
115
- end
116
-
117
- class User
118
- include ReeDto::EntityDSL
119
-
120
- properties(
121
- id: Nilor[Integer],
122
- name: String,
123
- age: Integer,
124
- )
125
-
126
- attr_accessor :name
127
- end
128
-
129
- class UsersDao
130
- include ReeDao::DSL
131
-
132
- dao :users_dao do
133
- link :db
134
- end
135
-
136
- table :users
137
-
138
- schema ReeActionsTest::User do
139
- integer :id, null: true
140
- string :name
141
- integer :age
142
- end
143
- end
144
-
145
- class TestAction3
146
- include ReeActions::DSL
147
-
148
- action :test_action3 do
149
- link :users_dao
150
- end
151
-
152
- contract Any, Hash => Integer
153
- def call(user_access, attrs)
154
- $user = ReeActionsTest::User.new(name: 'John', age: 30)
155
- users_dao.put($user)
156
-
157
- Thread.new do
158
- users_dao.put(ReeActionsTest::User.new(name: 'Alex', age: 33))
159
- end.join
160
-
161
- Thread.new do
162
- users_dao.put(ReeActionsTest::User.new(name: 'David', age: 21))
163
-
164
- Thread.new do
165
- users_dao.put(ReeActionsTest::User.new(name: 'Sam', age: 19))
166
- end.join
167
- end.join
168
-
169
- $thread_cache = ReeDao::DaoCache.new.get(:users, $user.id)
170
-
171
- attrs[:user_id]
172
- end
173
- end
174
- end
175
-
176
- Thread.new do
177
- ReeActionsTest::TestAction3.new.call('user_access', {user_id: 1})
178
- end.join
179
-
180
- expect($thread_cache).to eq($user.to_h)
181
- }
182
92
  end
@@ -75,34 +75,6 @@
75
75
  "object"
76
76
  ]
77
77
  },
78
- {
79
- "name": "dao_cache",
80
- "schema": "packages/ree_dao/schemas/ree_dao/beans/dao_cache.schema.json",
81
- "tags": [
82
- "object"
83
- ]
84
- },
85
- {
86
- "name": "drop_cache",
87
- "schema": "packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json",
88
- "tags": [
89
- "fn"
90
- ]
91
- },
92
- {
93
- "name": "extract_changes",
94
- "schema": "packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json",
95
- "tags": [
96
- "fn"
97
- ]
98
- },
99
- {
100
- "name": "init_cache",
101
- "schema": "packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json",
102
- "tags": [
103
- "fn"
104
- ]
105
- },
106
78
  {
107
79
  "name": "one_to_many",
108
80
  "schema": "packages/ree_dao/schemas/ree_dao/functions/one_to_many.schema.json",
@@ -19,10 +19,9 @@ module ReeDao
19
19
  end
20
20
 
21
21
  module InstanceMethods
22
+ PERSISTENCE_STATE_VARIABLE = :@persistence_state
22
23
  IMPORT_BATCH_SIZE = 1000
23
24
 
24
- package_require("ree_dao/functions/extract_changes")
25
-
26
25
  # override methods
27
26
  def find(id, mapper: nil)
28
27
  where(primary_key => id).first(mapper: mapper)
@@ -50,7 +49,7 @@ module ReeDao
50
49
  key = insert(raw)
51
50
 
52
51
  set_entity_primary_key(entity, raw, key)
53
- set_entity_cache(entity, raw)
52
+ set_persistence_state(entity, raw)
54
53
 
55
54
  entity
56
55
  end
@@ -74,7 +73,7 @@ module ReeDao
74
73
  key = insert_conflict(conflict_opts).insert(raw)
75
74
 
76
75
  set_entity_primary_key(entity, raw, key)
77
- set_entity_cache(entity, raw)
76
+ set_persistence_state(entity, raw)
78
77
 
79
78
  where(primary_key => key).first
80
79
  end
@@ -105,7 +104,7 @@ module ReeDao
105
104
  raw_data = raw[entity]
106
105
 
107
106
  set_entity_primary_key(entity, raw_data, id)
108
- set_entity_cache(entity, raw_data)
107
+ set_persistence_state(entity, raw_data)
109
108
  end
110
109
 
111
110
  nil
@@ -120,10 +119,10 @@ module ReeDao
120
119
  return __original_update(hash_or_entity) if hash_or_entity.is_a?(Hash)
121
120
 
122
121
  raw = opts[:schema_mapper].db_dump(hash_or_entity)
123
- raw = ReeDao::ExtractChanges.new.call(table_name, extract_primary_key(hash_or_entity), raw)
122
+ raw = extract_changes(hash_or_entity, raw)
124
123
 
125
124
  unless raw.empty?
126
- update_entity_cache(hash_or_entity, raw)
125
+ update_persistence_state(hash_or_entity, raw)
127
126
  key_condition = prepare_key_condition_from_entity(hash_or_entity)
128
127
  where(key_condition).__original_update(raw)
129
128
  end
@@ -161,7 +160,7 @@ module ReeDao
161
160
  if m
162
161
  entity = m.db_load(hash)
163
162
 
164
- self.set_entity_cache(entity, hash)
163
+ self.set_persistence_state(entity, hash)
165
164
 
166
165
  entity
167
166
  else
@@ -173,10 +172,6 @@ module ReeDao
173
172
 
174
173
  private
175
174
 
176
- def __ree_dao_cache
177
- ReeDao::DaoCache.new
178
- end
179
-
180
175
  def primary_key
181
176
  opts[:primary_key] || :id
182
177
  end
@@ -209,22 +204,35 @@ module ReeDao
209
204
  end
210
205
  end
211
206
 
212
- def set_entity_cache(entity, raw)
207
+ def set_persistence_state(entity, raw)
213
208
  if !entity.is_a?(Integer) && !entity.is_a?(Symbol)
214
- p_key = extract_primary_key(entity)
209
+ entity.instance_variable_set(PERSISTENCE_STATE_VARIABLE, raw)
210
+ end
211
+ end
215
212
 
216
- if p_key
217
- __ree_dao_cache.set(table_name, p_key, raw)
218
- end
213
+ def update_persistence_state(entity, raw)
214
+ persistence_state = entity.instance_variable_get(PERSISTENCE_STATE_VARIABLE)
215
+
216
+ if persistence_state
217
+ persistence_state.merge!(raw)
219
218
  end
220
219
  end
221
220
 
222
- def update_entity_cache(entity, raw)
223
- cache = __ree_dao_cache.get(table_name, extract_primary_key(entity))
221
+ def extract_changes(entity, hash)
222
+ return hash unless entity.instance_variable_defined?(PERSISTENCE_STATE_VARIABLE)
223
+ changes = {}
224
+
225
+ persistence_state = entity.instance_variable_get(PERSISTENCE_STATE_VARIABLE)
226
+
227
+ hash.each do |column, value|
228
+ previous_column_value = persistence_state[column]
224
229
 
225
- if cache
226
- __ree_dao_cache.set(table_name, extract_primary_key(entity), cache.merge(raw))
230
+ if persistence_state.has_key?(column) && previous_column_value != value
231
+ changes[column] = value
232
+ end
227
233
  end
234
+
235
+ changes
228
236
  end
229
237
 
230
238
  def set_entity_primary_key(entity, raw, key)
@@ -134,10 +134,17 @@ RSpec.describe :build_pg_connection do
134
134
  it {
135
135
  products_dao.delete_all
136
136
 
137
- product = ReeDaoTestPg::Product.new(title: "Product", info: { price: 1337, count: 200 }, labels: ["Sale"])
137
+ product = ReeDaoTestPg::Product.new(
138
+ title: "Product",
139
+ info: {
140
+ price: 1337, count: 200
141
+ },
142
+ labels: ["Sale"]
143
+ )
144
+
138
145
  products_dao.put(product)
139
146
 
140
- product.info[:price] = 1440
147
+ product.info = {price: 1440, count: 200}
141
148
  product.labels << "New"
142
149
 
143
150
  products_dao.update(product)
@@ -152,7 +159,7 @@ RSpec.describe :build_pg_connection do
152
159
  products_dao.delete_all
153
160
 
154
161
  products = Array.new(3) { |i| ReeDaoTestPg::Product.new(title: "Product#{i}", info: { price: 1337, count: 200 }, labels: ["Sale"]) }
155
-
162
+
156
163
  products_dao.import_all(products)
157
164
 
158
165
  expect(products_dao.count).to eq 3
@@ -5,7 +5,6 @@ package_require('ree_dto/entity_dsl')
5
5
 
6
6
  RSpec.describe :build_sqlite_connection do
7
7
  link :build_sqlite_connection, from: :ree_dao
8
- link :dao_cache, from: :ree_dao
9
8
 
10
9
  after do
11
10
  Ree.disable_irb_mode
@@ -131,42 +130,6 @@ RSpec.describe :build_sqlite_connection do
131
130
  expect(user.age).to eq(u.age)
132
131
  }
133
132
 
134
- it {
135
- dao.delete_all
136
-
137
- user = ReeDaoTest::User.new(name: 'John', age: 30)
138
- dao.put(user)
139
-
140
- u = dao.find(user.id)
141
-
142
- expect(u).to be_a(ReeDaoTest::User)
143
-
144
- state = dao_cache.get(:users, u.id)
145
-
146
- expect(state).to be_a(Hash)
147
- expect(state[:id]).to eq(user.id)
148
- expect(state[:age]).to eq(user.age)
149
- expect(state[:name]).to eq(user.name)
150
- }
151
-
152
- it {
153
- dao.delete_all
154
-
155
- user = ReeDaoTest::User.new(name: 'John', age: 30)
156
- dao.put(user)
157
-
158
- u = dao.find(user.id)
159
- expect(u).to be_a(ReeDaoTest::User)
160
- expect(dao_cache.get(:users, u.id)).to_not eq(nil)
161
-
162
- all = dao.all
163
- expect(all.size).to eq(1)
164
- u = all.first
165
-
166
- expect(u).to be_a(ReeDaoTest::User)
167
- expect(dao_cache.get(:users, u.id)).to be_a(Hash)
168
- }
169
-
170
133
  it {
171
134
  dao.delete_all
172
135
 
@@ -4,13 +4,13 @@ class ReeHttp::ExecuteRequest
4
4
  include Ree::FnDSL
5
5
 
6
6
  fn :execute_request do
7
+ link :build_request
7
8
  link :build_request_executor
8
9
  link :slice, from: :ree_hash
9
- link 'ree_http/http_exceptions', -> { HttpExceptions }
10
-
11
10
  link 'ree_http/constants', -> {
12
11
  DEFAULT_TIMEOUT & DEFAULT_WRITE_TIMEOUT & DEFAULT_FORCE_SSL
13
12
  }
13
+ link 'ree_http/http_exceptions', -> { HttpExceptions }
14
14
  end
15
15
 
16
16
  include HttpExceptions
@@ -89,7 +89,9 @@ class ReeHttp::ExecuteRequest
89
89
  "Got #{response.code} response on request URI #{request.uri}\n With BODY: #{response.body}\n"
90
90
  )
91
91
 
92
- process_redirect_response(response, request, opts, &block)
92
+ if response.is_a?(Net::HTTPRedirection)
93
+ return process_redirect_response(response, request, opts, &block)
94
+ end
93
95
 
94
96
  response
95
97
  end
@@ -97,27 +99,32 @@ class ReeHttp::ExecuteRequest
97
99
  private
98
100
 
99
101
  def process_redirect_response(response, request, opts, &block)
100
- if response.is_a?(Net::HTTPRedirection)
101
- if opts[:redirects_count] == 0
102
- raise TooManyRedirectsError, "Got too match redirects, if you want more redirects, use redirects_count"
103
- end
102
+ if opts[:redirects_count] == 0
103
+ raise TooManyRedirectsError, "Got too match redirects, if you want more redirects, use redirects_count"
104
+ end
104
105
 
105
- if opts[:strict_redirect_mode] && STRICT_SENSITIVE_CODES.include?(response.code.to_i) && UNSAFE_VERBS.include?(request.method.to_sym)
106
- raise RedirectMethodError, "Got #{response.code.to_i} with strict_mode"
107
- end
106
+ if opts[:strict_redirect_mode] && STRICT_SENSITIVE_CODES.include?(response.code.to_i) && UNSAFE_VERBS.include?(request.method.to_sym)
107
+ raise RedirectMethodError, "Got #{response.code.to_i} with strict_mode"
108
+ end
108
109
 
109
- if (ALWAYS_GET_CODES.include?(response.code.to_i) || STRICT_SENSITIVE_CODES.include?(response.code.to_i)) && UNSAFE_VERBS.include?(request.method.downcase.to_sym)
110
- request.instance_variable_set(:@method, 'GET')
111
- end
110
+ if (ALWAYS_GET_CODES.include?(response.code.to_i) || STRICT_SENSITIVE_CODES.include?(response.code.to_i)) && UNSAFE_VERBS.include?(request.method.downcase.to_sym)
111
+ new_request_method = :get
112
+ end
112
113
 
113
- request.instance_variable_set(:@uri, URI(response['Location']))
114
- request.instance_variable_set(:@path, request.uri.path)
114
+ new_request_method ||= request.method.downcase.to_sym
115
115
 
116
- opts[:redirects_count] -= 1
116
+ new_uri = URI(response['Location'] || response['location'])
117
+ new_request = build_request(
118
+ new_request_method,
119
+ new_uri.to_s,
120
+ **slice(opts, [
121
+ :headers, :body, :form_data, :query_params,
122
+ :force_ssl, :ca_certs, :basic_auth, :bearer_token
123
+ ])
124
+ )
117
125
 
118
- return call(request, **opts, &block)
119
- end
126
+ opts[:redirects_count] -= 1
120
127
 
121
- response
128
+ call(new_request, **opts, &block)
122
129
  end
123
- end
130
+ end
@@ -34,6 +34,14 @@
34
34
  }
35
35
  ],
36
36
  "links": [
37
+ {
38
+ "target": "build_request",
39
+ "package_name": "ree_http",
40
+ "as": "build_request",
41
+ "imports": [
42
+
43
+ ]
44
+ },
37
45
  {
38
46
  "target": "build_request_executor",
39
47
  "package_name": "ree_http",
@@ -129,11 +129,11 @@ RSpec.describe :http_delete do
129
129
  headers: {
130
130
  'Accept'=>'*/*',
131
131
  'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
132
- 'User-Agent'=>'Ruby',
133
- 'Token'=>'123'
132
+ 'Host' => 'www.example.com',
133
+ 'User-Agent'=>'Ruby'
134
134
  }
135
135
  )
136
- .to_return(status: 200, headers: {'Token': '123'})
136
+ .to_return(status: 200)
137
137
  end
138
138
  after :all do
139
139
  WebMock.reset!
@@ -142,7 +142,7 @@ RSpec.describe :http_delete do
142
142
  let(:err_result) {
143
143
  http_delete(
144
144
  host_with_ssl + '/redirect_303_infinity',
145
- force_ssl: true, headers: { token: '123'}
145
+ force_ssl: true
146
146
  )
147
147
  }
148
148
 
@@ -151,15 +151,17 @@ RSpec.describe :http_delete do
151
151
 
152
152
  http_delete(
153
153
  host_with_ssl + '/redirect_307',
154
- force_ssl: true, headers: { token: '123'}
154
+ force_ssl: true, headers: { "Token" => 123 }
155
155
  )
156
- expect(WebMock).to have_requested(:delete, host_with_ssl).with(headers: { 'Token'=>'123' })
156
+ expect(WebMock).to have_requested(:delete, host_with_ssl + "/redirect_307").with(headers: { "Token" => 123}).once
157
+ expect(WebMock).to have_requested(:delete, host_with_ssl).once
157
158
 
158
159
  http_delete(
159
160
  host_with_ssl + '/redirect_303',
160
- force_ssl: true, headers: { token: '123'}
161
+ force_ssl: true, headers: { "Token" => 123 }
161
162
  )
162
- expect(WebMock).to have_requested(:get, host_with_ssl).with(headers: { 'Token'=>'123' })
163
+ expect(WebMock).to have_requested(:delete, host_with_ssl + "/redirect_303").with(headers: { "Token" => 123}).once
164
+ expect(WebMock).to have_requested(:get, host_with_ssl).once
163
165
  end
164
166
  end
165
167
  end