ree_lib 1.0.41 → 1.0.43

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/lib/ree_lib/packages/ree_actions/Package.schema.json +3 -0
  4. data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +12 -0
  5. data/lib/ree_lib/packages/ree_actions/package/ree_actions.rb +1 -0
  6. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +110 -0
  7. data/lib/ree_lib/packages/ree_dao/Package.schema.json +31 -0
  8. data/lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb +56 -0
  9. data/lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb +39 -39
  10. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_pg_connection.rb +1 -1
  11. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb +15 -0
  12. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/extract_changes.rb +26 -0
  13. data/lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb +15 -0
  14. data/lib/ree_lib/packages/ree_dao/package/ree_dao.rb +9 -0
  15. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/beans/dao_cache.schema.json +22 -0
  16. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_pg_connection.schema.json +1 -1
  17. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json +31 -0
  18. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json +45 -0
  19. data/lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json +31 -0
  20. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_pg_connection_spec.rb +150 -0
  21. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb +6 -5
  22. data/lib/ree_lib/packages/ree_mapper/package/ree_mapper.rb +4 -0
  23. data/lib/ree_lib/packages/ree_roda/package/ree_roda/plugins/ree_routes.rb +10 -6
  24. data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_routing_tree.rb +49 -27
  25. data/lib/ree_lib/packages/ree_roda/spec/ree_roda/app_spec.rb +30 -1
  26. data/lib/ree_lib/packages/ree_roda/spec/ree_roda/services/build_routing_tree_spec.rb +6 -5
  27. data/lib/ree_lib/version.rb +1 -1
  28. metadata +11 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e731403bb94a564798c872a12f5ba831135c63d5d6cd710f1b9293cdb51857cf
4
- data.tar.gz: e9aa624097a9af18f93e8f32753e548515df8107382d7e5654fea6b64db2fadc
3
+ metadata.gz: 1322fe618658e425a1614927faf1ed43252e3b49bc9c953d3ba10de162693217
4
+ data.tar.gz: 8843b92fb6f84cbd83b1966108ea2a541ae798067b6b1a379c1cb7a1baeebbfa
5
5
  SHA512:
6
- metadata.gz: 12f197a479cd7d0ec08a9146737bcf04ff69e84692a08f608661fcf47e984788076d2e8c7daed2a228d3deae55c35d62d8e1824e7161adb3bb5504e8070eeaf0
7
- data.tar.gz: a1d7031eabf50894b5cd52856003745fc1e02477af397fbe7c1be6793b57809088e289a03057a0974c75a9258e6655e6942dd9552136c8f4dd706db8dd2f18b8
6
+ metadata.gz: 41693ec34aff5834b7aba142dd2fb9a9a10146ce178091a8404d7c143bc6a1bce54b106fdbacac896ccc19df3ef5ef87d41a5a88cf2ad27646362839151a04cc
7
+ data.tar.gz: eb691d0b59814c5fab063627c6bea39ab8dcfec2f48643e17249a6175d2738c5867ba342776b7967626008757244848ad4abd95dd290f57de119a772b3167d81
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ree_lib (1.0.41)
4
+ ree_lib (1.0.43)
5
5
  binding_of_caller (~> 1.0.0)
6
6
  i18n (~> 1.12.0)
7
7
  loofah (~> 2.18.0)
@@ -49,7 +49,7 @@ GEM
49
49
  rack (>= 1.3)
50
50
  rainbow (3.1.1)
51
51
  rake (13.0.6)
52
- ree (1.0.27)
52
+ ree (1.0.28)
53
53
  commander (~> 4.6.0)
54
54
  rexml (3.2.5)
55
55
  roda (3.58.0)
@@ -7,6 +7,9 @@
7
7
  "ree_actions"
8
8
  ],
9
9
  "depends_on": [
10
+ {
11
+ "name": "ree_dao"
12
+ },
10
13
  {
11
14
  "name": "ree_mapper"
12
15
  }
@@ -3,11 +3,19 @@ module ReeActions
3
3
  def self.included(base)
4
4
  base.extend(ClassMethods)
5
5
  base.include(ReeMapper::DSL)
6
+ link_dao_cache(base)
6
7
  end
7
8
 
8
9
  def self.extended(base)
9
10
  base.extend(ClassMethods)
10
11
  base.include(ReeMapper::DSL)
12
+ link_dao_cache(base)
13
+ end
14
+
15
+ private_class_method def self.link_dao_cache(base)
16
+ base.include(Ree::LinkDSL)
17
+ base.link :drop_cache, as: :__ree_dao_drop_cache, from: :ree_dao
18
+ base.link :init_cache, as: :__ree_dao_init_cache, from: :ree_dao
11
19
  end
12
20
 
13
21
  module ClassMethods
@@ -40,6 +48,8 @@ module ReeActions
40
48
  alias_method(:__original_call, :call)
41
49
 
42
50
  define_method :call do |user_access, attrs|
51
+ __ree_dao_init_cache
52
+
43
53
  if self.class.const_defined?(:ActionCaster)
44
54
  caster = self.class.const_get(:ActionCaster)
45
55
 
@@ -51,6 +61,8 @@ module ReeActions
51
61
  else
52
62
  __original_call(user_access, attrs)
53
63
  end
64
+ ensure
65
+ __ree_dao_drop_cache
54
66
  end
55
67
 
56
68
  nil
@@ -5,6 +5,7 @@ module ReeActions
5
5
 
6
6
  package do
7
7
  depends_on :ree_mapper
8
+ depends_on :ree_dao
8
9
  end
9
10
  end
10
11
 
@@ -1,6 +1,29 @@
1
1
  package_require("ree_actions/dsl")
2
2
 
3
3
  RSpec.describe ReeActions::DSL, type: [:autoclean] do
4
+ link :build_sqlite_connection, from: :ree_dao
5
+
6
+ before(:all) do
7
+ connection = build_sqlite_connection({database: 'sqlite_db'})
8
+
9
+ if connection.table_exists?(:users)
10
+ connection.drop_table(:users)
11
+ end
12
+
13
+ if connection.table_exists?(:products)
14
+ connection.drop_table(:products)
15
+ end
16
+
17
+ connection.create_table :users do
18
+ primary_key :id
19
+
20
+ column :name, 'varchar(256)'
21
+ column :age, :integer
22
+ end
23
+
24
+ connection.disconnect
25
+ end
26
+
4
27
  before do
5
28
  Ree.enable_irb_mode
6
29
  end
@@ -15,6 +38,7 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
15
38
 
16
39
  package do
17
40
  depends_on :ree_mapper
41
+ depends_on :ree_dao
18
42
  end
19
43
 
20
44
  class TestAction
@@ -42,6 +66,8 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
42
66
  include Ree::PackageDSL
43
67
 
44
68
  package do
69
+ depends_on :ree_mapper
70
+ depends_on :ree_dao
45
71
  end
46
72
 
47
73
  class TestAction2
@@ -59,4 +85,88 @@ RSpec.describe ReeActions::DSL, type: [:autoclean] do
59
85
  result = ReeActionsTest::TestAction2.new.call('user_access', {user_id: 1})
60
86
  expect(result).to eq(1)
61
87
  }
88
+
89
+ it {
90
+ module ReeActionsTest
91
+ include Ree::PackageDSL
92
+
93
+ package do
94
+ depends_on :ree_mapper
95
+ depends_on :ree_dao
96
+ end
97
+
98
+ class Db
99
+ include Ree::BeanDSL
100
+
101
+ bean :db do
102
+ singleton
103
+ factory :build
104
+
105
+ link :build_sqlite_connection, from: :ree_dao
106
+ end
107
+
108
+ def build
109
+ build_sqlite_connection({database: 'sqlite_db'})
110
+ end
111
+ end
112
+
113
+ class User
114
+ include ReeDto::EntityDSL
115
+
116
+ properties(
117
+ id: Nilor[Integer],
118
+ name: String,
119
+ age: Integer,
120
+ )
121
+
122
+ attr_accessor :name
123
+ end
124
+
125
+ class UsersDao
126
+ include ReeDao::DSL
127
+
128
+ dao :users_dao do
129
+ link :db
130
+ end
131
+
132
+ table :users
133
+
134
+ schema ReeActionsTest::User do
135
+ integer :id, null: true
136
+ string :name
137
+ integer :age
138
+ end
139
+ end
140
+
141
+ class TestAction3
142
+ include ReeActions::DSL
143
+
144
+ action :test_action3 do
145
+ link :users_dao
146
+ end
147
+
148
+ contract Any, Hash => Integer
149
+ def call(user_access, attrs)
150
+ user = ReeActionsTest::User.new(name: 'John', age: 30)
151
+ users_dao.put(user)
152
+
153
+ thr = Thread.new {
154
+ user2 = ReeActionsTest::User.new(name: 'Alex', age: 33)
155
+ users_dao.put(user2)
156
+ }
157
+
158
+ thr.join
159
+
160
+ $thread_group_cache = ReeDao::DaoCache.new.instance_variable_get(:@thread_groups)
161
+ .dig(Thread.current.group.object_id, :users)
162
+
163
+ attrs[:user_id]
164
+ end
165
+ end
166
+ end
167
+
168
+ ReeActionsTest::TestAction3.new.call('user_access', {user_id: 1})
169
+ expect($thread_group_cache.keys.count).to_not eq(0)
170
+ expect($thread_group_cache.keys.count).to eq(2)
171
+ }
62
172
  end
@@ -19,6 +19,9 @@
19
19
  {
20
20
  "name": "ree_mapper"
21
21
  },
22
+ {
23
+ "name": "ree_object"
24
+ },
22
25
  {
23
26
  "name": "ree_string"
24
27
  }
@@ -62,6 +65,34 @@
62
65
  "object"
63
66
  ]
64
67
  },
68
+ {
69
+ "name": "dao_cache",
70
+ "schema": "packages/ree_dao/schemas/ree_dao/beans/dao_cache.schema.json",
71
+ "tags": [
72
+ "object"
73
+ ]
74
+ },
75
+ {
76
+ "name": "drop_cache",
77
+ "schema": "packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json",
78
+ "tags": [
79
+ "fn"
80
+ ]
81
+ },
82
+ {
83
+ "name": "extract_changes",
84
+ "schema": "packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json",
85
+ "tags": [
86
+ "fn"
87
+ ]
88
+ },
89
+ {
90
+ "name": "init_cache",
91
+ "schema": "packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json",
92
+ "tags": [
93
+ "fn"
94
+ ]
95
+ },
65
96
  {
66
97
  "name": "one_to_many",
67
98
  "schema": "packages/ree_dao/schemas/ree_dao/functions/one_to_many.schema.json",
@@ -0,0 +1,56 @@
1
+ class ReeDao::DaoCache
2
+ include Ree::BeanDSL
3
+
4
+ bean :dao_cache do
5
+ link :deep_dup, from: :ree_object
6
+
7
+ singleton
8
+ after_init :setup
9
+ end
10
+
11
+ def setup
12
+ @thread_groups = {}
13
+ end
14
+
15
+ def add_thread_group_cache(thread_group)
16
+ @thread_groups[thread_group.object_id] ||= {}
17
+ end
18
+
19
+ def drop_thread_group_cache(thread_group)
20
+ @thread_groups.delete(thread_group.object_id)
21
+ end
22
+
23
+ def get(table_name, primary_key)
24
+ add_thread_group_cache(current_thread_group)
25
+ add_table_name(table_name)
26
+
27
+ @thread_groups[current_thread_group.object_id][table_name][primary_key]
28
+ end
29
+
30
+ def set(table_name, primary_key, data)
31
+ add_thread_group_cache(current_thread_group)
32
+ add_table_name(table_name)
33
+ add_primary_key(table_name, primary_key)
34
+
35
+ @thread_groups[current_thread_group.object_id][table_name][primary_key] = deep_dup(data)
36
+ end
37
+
38
+ def drop_table_cache(table_name)
39
+ add_thread_group_cache(current_thread_group)
40
+ @thread_groups[current_thread_group.object_id].delete(table_name)
41
+ end
42
+
43
+ private
44
+
45
+ def current_thread_group
46
+ Thread.current.group
47
+ end
48
+
49
+ def add_table_name(thread_group = Thread.current.group, table_name)
50
+ @thread_groups[thread_group.object_id][table_name] ||= {}
51
+ end
52
+
53
+ def add_primary_key(thread_group = Thread.current.group, table_name, primary_key)
54
+ @thread_groups[thread_group.object_id][table_name][primary_key] ||= {}
55
+ end
56
+ end
@@ -19,24 +19,25 @@ module ReeDao
19
19
  end
20
20
 
21
21
  module InstanceMethods
22
- PERSISTENCE_STATE_VARIABLE = :@persistence_state
23
22
  IMPORT_BATCH_SIZE = 1000
24
23
 
24
+ package_require("ree_dao/functions/extract_changes")
25
+
25
26
  # override methods
26
- def find(id, mode = :write, mapper: nil)
27
- where(primary_key => id).first(mode, mapper: mapper)
27
+ def find(id, mapper: nil)
28
+ where(primary_key => id).first(mapper: mapper)
28
29
  end
29
30
 
30
- def first(mode = :write, mapper: nil)
31
- with_mapper(mode, mapper).__original_first
31
+ def first(mapper: nil)
32
+ with_mapper(mapper).__original_first
32
33
  end
33
34
 
34
- def last(mode = :write, mapper: nil)
35
- with_mapper(mode, mapper).__original_last
35
+ def last(mapper: nil)
36
+ with_mapper(mapper).__original_last
36
37
  end
37
38
 
38
- def all(mode = :write, mapper: nil)
39
- with_mapper(mode, mapper).__original_all
39
+ def all(mapper: nil)
40
+ with_mapper(mapper).__original_all
40
41
  end
41
42
 
42
43
  def delete_all
@@ -49,7 +50,7 @@ module ReeDao
49
50
  key = insert(raw)
50
51
 
51
52
  set_entity_primary_key(entity, raw, key)
52
- set_persistence_state(entity, raw)
53
+ set_entity_cache(entity, raw)
53
54
 
54
55
  entity
55
56
  end
@@ -73,7 +74,7 @@ module ReeDao
73
74
  key = insert_conflict(conflict_opts).insert(raw)
74
75
 
75
76
  set_entity_primary_key(entity, raw, key)
76
- set_persistence_state(entity, raw)
77
+ set_entity_cache(entity, raw)
77
78
 
78
79
  where(primary_key => key).first
79
80
  end
@@ -104,7 +105,7 @@ module ReeDao
104
105
  raw_data = raw[entity]
105
106
 
106
107
  set_entity_primary_key(entity, raw_data, id)
107
- set_persistence_state(entity, raw_data)
108
+ set_entity_cache(entity, raw_data)
108
109
  end
109
110
 
110
111
  nil
@@ -115,10 +116,10 @@ module ReeDao
115
116
  return __original_update(hash_or_entity) if hash_or_entity.is_a?(Hash)
116
117
 
117
118
  raw = opts[:schema_mapper].db_dump(hash_or_entity)
118
- raw = extract_changes(hash_or_entity, raw)
119
+ raw = ReeDao::ExtractChanges.new.call(table_name, extract_primary_key(hash_or_entity), raw)
119
120
 
120
121
  unless raw.empty?
121
- update_persistence_state(hash_or_entity, raw)
122
+ update_entity_cache(hash_or_entity, raw)
122
123
  key_condition = prepare_key_condition_from_entity(hash_or_entity)
123
124
  where(key_condition).__original_update(raw)
124
125
  end
@@ -148,10 +149,18 @@ module ReeDao
148
149
 
149
150
  private
150
151
 
152
+ def __ree_dao_cache
153
+ ReeDao::DaoCache.new
154
+ end
155
+
151
156
  def primary_key
152
157
  opts[:primary_key] || :id
153
158
  end
154
159
 
160
+ def table_name
161
+ first_source_table
162
+ end
163
+
155
164
  def remove_null_primary_key(raw)
156
165
  return if primary_key.is_a?(Array)
157
166
 
@@ -166,9 +175,9 @@ module ReeDao
166
175
  end
167
176
  end
168
177
 
169
- def with_mapper(mode, mapper)
178
+ def with_mapper(mapper)
170
179
  clone(
171
- mode: mode, schema_mapper: mapper || opts[:schema_mapper],
180
+ schema_mapper: mapper || opts[:schema_mapper],
172
181
  ).with_row_proc(
173
182
  Proc.new { |hash|
174
183
  m = mapper || opts[:schema_mapper]
@@ -176,9 +185,7 @@ module ReeDao
176
185
  if m
177
186
  entity = m.db_load(hash)
178
187
 
179
- if mode == :write
180
- self.set_persistence_state(entity, hash)
181
- end
188
+ self.set_entity_cache(entity, hash)
182
189
 
183
190
  entity
184
191
  else
@@ -188,34 +195,27 @@ module ReeDao
188
195
  )
189
196
  end
190
197
 
191
- def extract_changes(entity, hash)
192
- return hash unless entity.instance_variable_defined?(PERSISTENCE_STATE_VARIABLE)
193
- changes = {}
194
-
195
- persistence_state = entity.instance_variable_get(PERSISTENCE_STATE_VARIABLE)
196
-
197
- hash.each do |column, value|
198
- previous_column_value = persistence_state[column]
199
-
200
- if persistence_state.has_key?(column) && previous_column_value != value
201
- changes[column] = value
202
- end
198
+ def extract_primary_key(entity)
199
+ if primary_key.is_a?(Array)
200
+ primary_key.map do |key|
201
+ entity.send(key)
202
+ end.join("_")
203
+ else
204
+ entity.send(primary_key)
203
205
  end
204
-
205
- changes
206
206
  end
207
207
 
208
- def set_persistence_state(entity, raw)
208
+ def set_entity_cache(entity, raw)
209
209
  if !entity.is_a?(Integer) && !entity.is_a?(Symbol)
210
- entity.instance_variable_set(PERSISTENCE_STATE_VARIABLE, raw)
210
+ __ree_dao_cache.set(table_name, extract_primary_key(entity), raw)
211
211
  end
212
212
  end
213
213
 
214
- def update_persistence_state(entity, raw)
215
- persistence_state = entity.instance_variable_get(PERSISTENCE_STATE_VARIABLE)
214
+ def update_entity_cache(entity, raw)
215
+ cache = __ree_dao_cache.get(table_name, extract_primary_key(entity))
216
216
 
217
- if persistence_state
218
- persistence_state.merge!(raw)
217
+ if cache
218
+ __ree_dao_cache.set(table_name, extract_primary_key(entity), cache.merge(raw))
219
219
  end
220
220
  end
221
221
 
@@ -16,7 +16,7 @@ class ReeDao::BuildPgConnection
16
16
  user?: String,
17
17
  password?: String,
18
18
  host?: String,
19
- port?: String,
19
+ port?: Or[String, Integer],
20
20
  convert_infinite_timestamps?: Or[:string, :nil, :float],
21
21
  connect_timeout?: Integer,
22
22
  driver_options?: Hash,
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeDao::DropCache
4
+ include Ree::FnDSL
5
+
6
+ fn :drop_cache do
7
+ link :dao_cache
8
+ end
9
+
10
+ contract(None => nil)
11
+ def call
12
+ dao_cache.drop_thread_group_cache(Thread.current.group)
13
+ nil
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeDao::ExtractChanges
4
+ include Ree::FnDSL
5
+
6
+ fn :extract_changes do
7
+ link :dao_cache, as: :__ree_dao_cache
8
+ end
9
+
10
+ contract(Symbol, Any, Hash => Hash)
11
+ def call(table_name, primary_key, hash)
12
+ cached = __ree_dao_cache.get(table_name, primary_key)
13
+ return hash unless cached
14
+ changes = {}
15
+
16
+ hash.each do |column, value|
17
+ previous_column_value = cached[column]
18
+
19
+ if cached.has_key?(column) && previous_column_value != value
20
+ changes[column] = value
21
+ end
22
+ end
23
+
24
+ changes
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeDao::InitCache
4
+ include Ree::FnDSL
5
+
6
+ fn :init_cache do
7
+ link :dao_cache
8
+ end
9
+
10
+ contract(None => nil)
11
+ def call
12
+ dao_cache.add_thread_group_cache(Thread.current.group)
13
+ nil
14
+ end
15
+ end
@@ -11,7 +11,16 @@ module ReeDao
11
11
  depends_on :ree_enum
12
12
  depends_on :ree_mapper
13
13
  depends_on :ree_string
14
+ depends_on :ree_object
14
15
  end
15
16
 
16
17
  require_relative "./ree_dao/dsl"
18
+
19
+ def self.init_cache(thread)
20
+ ReeDao::Cache.init_cache(thread)
21
+ end
22
+
23
+ def self.drop_cache(thread)
24
+ ReeDao::Cache.delete_cache(thread)
25
+ end
17
26
  end
@@ -0,0 +1,22 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "dao_cache",
5
+ "path": "packages/ree_dao/package/ree_dao/beans/dao_cache.rb",
6
+ "mount_as": "object",
7
+ "class": "ReeDao::DaoCache",
8
+ "factory": null,
9
+ "methods": [
10
+
11
+ ],
12
+ "links": [
13
+ {
14
+ "target": "deep_dup",
15
+ "package_name": "ree_object",
16
+ "as": "deep_dup",
17
+ "imports": [
18
+
19
+ ]
20
+ }
21
+ ]
22
+ }
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "arg": "conn_opts",
19
19
  "arg_type": "req",
20
- "type": "{:conn_str? => String, :adapter => String, :database? => String, :encoding? => String, :user? => String, :password? => String, :host? => String, :port? => String, :convert_infinite_timestamps? => Or[string, nil, float], :connect_timeout? => Integer, :driver_options? => Hash, :notice_receiver? => Proc, :sslmode? => Or[disable, allow, prefer, require, verify-ca, verify-full...], :sslrootcert? => String, :search_path? => String, :use_iso_date_format? => Bool, :max_connections? => Integer}"
20
+ "type": "{:conn_str? => String, :adapter => String, :database? => String, :encoding? => String, :user? => String, :password? => String, :host? => String, :port? => Or[String, Integer], :convert_infinite_timestamps? => Or[string, nil, float], :connect_timeout? => Integer, :driver_options? => Hash, :notice_receiver? => Proc, :sslmode? => Or[disable, allow, prefer, require, verify-ca, verify-full...], :sslrootcert? => String, :search_path? => String, :use_iso_date_format? => Bool, :max_connections? => Integer}"
21
21
  },
22
22
  {
23
23
  "arg": "opts",
@@ -0,0 +1,31 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "drop_cache",
5
+ "path": "packages/ree_dao/package/ree_dao/functions/drop_cache.rb",
6
+ "mount_as": "fn",
7
+ "class": "ReeDao::DropCache",
8
+ "factory": null,
9
+ "methods": [
10
+ {
11
+ "doc": "",
12
+ "throws": [
13
+
14
+ ],
15
+ "return": "Any",
16
+ "args": [
17
+
18
+ ]
19
+ }
20
+ ],
21
+ "links": [
22
+ {
23
+ "target": "dao_cache",
24
+ "package_name": "ree_dao",
25
+ "as": "dao_cache",
26
+ "imports": [
27
+
28
+ ]
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "extract_changes",
5
+ "path": "packages/ree_dao/package/ree_dao/functions/extract_changes.rb",
6
+ "mount_as": "fn",
7
+ "class": "ReeDao::ExtractChanges",
8
+ "factory": null,
9
+ "methods": [
10
+ {
11
+ "doc": "",
12
+ "throws": [
13
+
14
+ ],
15
+ "return": "Hash",
16
+ "args": [
17
+ {
18
+ "arg": "table_name",
19
+ "arg_type": "req",
20
+ "type": "Symbol"
21
+ },
22
+ {
23
+ "arg": "primary_key",
24
+ "arg_type": "req",
25
+ "type": "Any"
26
+ },
27
+ {
28
+ "arg": "hash",
29
+ "arg_type": "req",
30
+ "type": "Hash"
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "links": [
36
+ {
37
+ "target": "dao_cache",
38
+ "package_name": "ree_dao",
39
+ "as": "__ree_dao_cache",
40
+ "imports": [
41
+
42
+ ]
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schema_type": "object",
3
+ "schema_version": "1.1",
4
+ "name": "init_cache",
5
+ "path": "packages/ree_dao/package/ree_dao/functions/init_cache.rb",
6
+ "mount_as": "fn",
7
+ "class": "ReeDao::InitCache",
8
+ "factory": null,
9
+ "methods": [
10
+ {
11
+ "doc": "",
12
+ "throws": [
13
+
14
+ ],
15
+ "return": "Any",
16
+ "args": [
17
+
18
+ ]
19
+ }
20
+ ],
21
+ "links": [
22
+ {
23
+ "target": "dao_cache",
24
+ "package_name": "ree_dao",
25
+ "as": "dao_cache",
26
+ "imports": [
27
+
28
+ ]
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ package_require("ree_dao/wrappers/pg_jsonb")
4
+ package_require("ree_dao/wrappers/pg_array")
5
+
6
+ RSpec.describe :build_pg_connection do
7
+ link :build_pg_connection, from: :ree_dao
8
+
9
+ DB_CONFIG = {
10
+ host: "localhost",
11
+ user: "postgres",
12
+ database: "postgres",
13
+ password: "password",
14
+ adapter: "postgres"
15
+ }.freeze
16
+
17
+ after do
18
+ Ree.disable_irb_mode
19
+ end
20
+
21
+ before :all do
22
+ connection = build_pg_connection(
23
+ DB_CONFIG,
24
+ **{extensions: [:pg_array, :pg_json]}
25
+ )
26
+
27
+ if connection.table_exists?(:products)
28
+ connection.drop_table(:products)
29
+ end
30
+
31
+ connection.create_table :products do
32
+ primary_key :id
33
+
34
+ column :title, 'varchar(256)'
35
+ column :info, :jsonb
36
+ column :labels, :"varchar(30)[]"
37
+ end
38
+
39
+ connection.disconnect
40
+ end
41
+
42
+ Ree.enable_irb_mode
43
+
44
+ module ReeDaoTestPg
45
+ include Ree::PackageDSL
46
+
47
+ package do
48
+ depends_on :ree_dao
49
+ depends_on :ree_mapper
50
+ end
51
+ end
52
+
53
+ class ReeDaoTestPg::MapperFactory
54
+ include Ree::BeanDSL
55
+
56
+ bean :mapper_factory do
57
+ factory :build
58
+ singleton
59
+
60
+ link :build_mapper_factory, from: :ree_mapper
61
+ link :build_mapper_strategy, from: :ree_mapper
62
+ end
63
+
64
+ def build
65
+ factory = build_mapper_factory(strategies: [
66
+ build_mapper_strategy(method: :cast, dto: Hash),
67
+ build_mapper_strategy(method: :serialize, dto: Hash),
68
+ build_mapper_strategy(method: :db_dump, dto: Hash),
69
+ build_mapper_strategy(method: :db_load, dto: Object, always_optional: true)
70
+ ])
71
+
72
+ factory
73
+ .register_wrapper(:pg_jsonb, ReeDao::PgJsonb)
74
+ .register_wrapper(:pg_array, ReeDao::PgArray)
75
+
76
+ factory
77
+ end
78
+ end
79
+
80
+ require "sequel/extensions/pg_json_ops"
81
+ require "sequel/extensions/pg_array_ops"
82
+
83
+ class ReeDaoTestPg::Db
84
+ include Ree::BeanDSL
85
+
86
+ bean :db do
87
+ singleton
88
+ factory :build
89
+
90
+ link :build_pg_connection, from: :ree_dao
91
+ end
92
+
93
+ def build
94
+ Sequel.extension :pg_json_ops
95
+ Sequel.extension :pg_array_ops
96
+
97
+ build_pg_connection(
98
+ DB_CONFIG,
99
+ **{extensions: [:pg_array, :pg_json]}
100
+ )
101
+ end
102
+ end
103
+
104
+ class ReeDaoTestPg::Product
105
+ include ReeDto::EntityDSL
106
+
107
+ properties(
108
+ id: Nilor[Integer],
109
+ title: String,
110
+ info: Hash,
111
+ labels: ArrayOf[String]
112
+ )
113
+
114
+ attr_accessor :title, :info
115
+ end
116
+
117
+ class ReeDaoTestPg::ProductsDao
118
+ include ReeDao::DSL
119
+
120
+ dao :products_dao do
121
+ link :db
122
+ end
123
+
124
+ schema ReeDaoTestPg::Product do
125
+ integer :id, null: true
126
+ string :title
127
+ pg_jsonb :info, any
128
+ pg_array :labels, string
129
+ end
130
+ end
131
+
132
+ let(:products_dao) { ReeDaoTestPg::ProductsDao.new }
133
+
134
+ it {
135
+ products_dao.delete_all
136
+
137
+ product = ReeDaoTestPg::Product.new(title: "Product", info: { price: 1337, count: 200 }, labels: ["Sale"])
138
+ products_dao.put(product)
139
+
140
+ product.info[:price] = 1440
141
+ product.labels << "New"
142
+
143
+ products_dao.update(product)
144
+
145
+ product = products_dao.find(product.id)
146
+ expect(product.title).to eq("Product")
147
+ expect(product.info[:price]).to eq(1440)
148
+ expect(product.labels).to eq(["Sale", "New"])
149
+ }
150
+ end
@@ -5,6 +5,7 @@ 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
8
9
 
9
10
  after do
10
11
  Ree.disable_irb_mode
@@ -140,7 +141,7 @@ RSpec.describe :build_sqlite_connection do
140
141
 
141
142
  expect(u).to be_a(ReeDaoTest::User)
142
143
 
143
- state = u.instance_variable_get(:@persistence_state)
144
+ state = dao_cache.get(:users, u.id)
144
145
 
145
146
  expect(state).to be_a(Hash)
146
147
  expect(state[:id]).to eq(user.id)
@@ -154,16 +155,16 @@ RSpec.describe :build_sqlite_connection do
154
155
  user = ReeDaoTest::User.new(name: 'John', age: 30)
155
156
  dao.put(user)
156
157
 
157
- u = dao.find(user.id, :read)
158
+ u = dao.find(user.id)
158
159
  expect(u).to be_a(ReeDaoTest::User)
159
- expect(u.instance_variable_get(:@persistence_state)).to eq(nil)
160
+ expect(dao_cache.get(:users, u.id)).to_not eq(nil)
160
161
 
161
162
  all = dao.all
162
163
  expect(all.size).to eq(1)
163
164
  u = all.first
164
165
 
165
166
  expect(u).to be_a(ReeDaoTest::User)
166
- expect(u.instance_variable_get(:@persistence_state)).to be_a(Hash)
167
+ expect(dao_cache.get(:users, u.id)).to be_a(Hash)
167
168
  }
168
169
 
169
170
  it {
@@ -246,7 +247,7 @@ RSpec.describe :build_sqlite_connection do
246
247
  }
247
248
  end
248
249
 
249
- context "uodate by entity" do
250
+ context "update by entity" do
250
251
  it {
251
252
  dao.delete_all
252
253
 
@@ -82,6 +82,10 @@ module ReeMapper
82
82
  pckg_name = ReeString::Underscore.new.call(mod.name)
83
83
  factory_path = "#{pckg_name}/mapper_factory"
84
84
 
85
+ if Ree.irb_mode? && Object.const_defined?("#{mod.name}::MapperFactory") && mod != self
86
+ return Object.const_get("#{mod.name}::MapperFactory").new
87
+ end
88
+
85
89
  mapper_factory_klass = if package_file_exists?(factory_path) && mod != self
86
90
  package_require(factory_path)
87
91
  Object.const_get("#{mod.name}::MapperFactory")
@@ -125,8 +125,8 @@ class Roda
125
125
  end
126
126
 
127
127
  def build_traverse_tree_proc(tree, context)
128
- has_arbitrary_param = tree.value.start_with?(":")
129
- route_part = has_arbitrary_param ? tree.value.gsub(":", "") : tree.value
128
+ has_arbitrary_param = tree.values[0].start_with?(":")
129
+ route_parts = has_arbitrary_param ? tree.values.map { _1.gsub(":", "") } : tree.values
130
130
  procs = []
131
131
 
132
132
  child_procs = tree.children.map do |child|
@@ -141,7 +141,9 @@ class Roda
141
141
  if has_arbitrary_param
142
142
  Proc.new do |r|
143
143
  r.on String do |param_val|
144
- r.params[route_part] = param_val
144
+ route_parts.each do |route_part|
145
+ r.params[route_part] = param_val
146
+ end
145
147
 
146
148
  child_procs.each do |child_proc|
147
149
  r.instance_exec(r, &child_proc)
@@ -156,7 +158,7 @@ class Roda
156
158
  end
157
159
  else
158
160
  Proc.new do |r|
159
- r.on route_part do
161
+ r.on route_parts[0] do
160
162
  child_procs.each do |child_proc|
161
163
  r.instance_exec(r, &child_proc)
162
164
  end
@@ -173,7 +175,9 @@ class Roda
173
175
  Proc.new do |r|
174
176
  if has_arbitrary_param
175
177
  r.is String do |param_val|
176
- r.params[route_part] = param_val
178
+ route_parts.each do |route_part|
179
+ r.params[route_part] = param_val
180
+ end
177
181
 
178
182
  route_procs.each do |route_proc|
179
183
  r.instance_exec(r, &route_proc)
@@ -182,7 +186,7 @@ class Roda
182
186
  nil
183
187
  end
184
188
  else
185
- r.is route_part do
189
+ r.is route_parts[0] do
186
190
  route_procs.each do |route_proc|
187
191
  r.instance_exec(r, &route_proc)
188
192
  end
@@ -1,54 +1,66 @@
1
1
  class ReeRoda::BuildRoutingTree
2
2
  include Ree::FnDSL
3
3
 
4
- fn :build_routing_tree
4
+ fn :build_routing_tree do
5
+ link "ree_routes/route", -> { Route }
6
+ end
5
7
 
6
8
  class RoutingTree
7
- attr_accessor :children, :value, :depth, :routes, :type, :parent
8
-
9
- def initialize(value, depth, type, parent = nil, routes = [])
10
- @value = value
9
+ attr_accessor :children, :values, :depth, :routes, :type, :parent
10
+
11
+ contract ArrayOf[String], Integer, Or[:param, :string], Nilor[self], ArrayOf[Route] => Any
12
+ def initialize(values, depth, type, parent = nil, routes = [])
13
+ @values = values
11
14
  @depth = depth
12
15
  @parent = parent
13
16
  @type = type
14
17
  @routes = []
15
18
  @children = []
16
19
  end
17
-
18
- def find_by_value(
20
+
21
+ contract(Kwargs[
19
22
  tree: self,
20
- value: nil,
21
- type: :param,
22
- depth: 0
23
+ value: Nilor[String],
24
+ type: Or[:param, :string],
25
+ depth: Integer] => Or[self, nil, ArrayOf[self]]
23
26
  )
24
- return tree if tree.depth == depth && tree.value == value
27
+ def find_by_value(tree: self, value: nil, type: :param, depth: 0)
28
+ return tree if tree.depth == depth && tree.values.include?(value)
29
+
25
30
  if tree.depth < depth
26
- res = tree.children.map do |c|
27
- find_by_value(tree: c, value: value, type: type, depth: depth)
28
- end.flatten.compact
31
+ res = tree
32
+ .children
33
+ .map { find_by_value(tree: _1, value: value, type: type, depth: depth) }
34
+ .flatten
35
+ .compact
29
36
 
30
- return res.size > 1 ? res : res.first
37
+ res.size > 1 ? res : res.first
31
38
  end
32
39
  end
33
40
 
34
- def children_have_value?(value)
35
- !!self.children.find { |c| c.value == value }
41
+ contract String => Bool
42
+ def any_child_has_value?(value)
43
+ !!self.children.find { |c| c.values.include?(value) }
36
44
  end
37
45
 
46
+ contract String, Integer, Or[:param, :string] => self
38
47
  def add_child(value, depth, type)
39
- new_child = self.class.new(value, depth, type, self.value)
48
+ new_child = self.class.new([value], depth, type, self)
49
+
40
50
  self.children << new_child
41
- self.children = self.children.sort { _1.value.match?(/\:/) ? 1 : 0 }
51
+ self.children = self.children.sort { _1.values[0].match?(/\:/) ? 1 : 0 }
42
52
 
43
53
  return new_child
44
54
  end
45
55
 
56
+ contract Route => nil
46
57
  def add_route(route)
47
- self.routes << route
58
+ self.routes << route; nil
48
59
  end
49
60
 
50
61
  def print_tree(tree = self)
51
- puts "#{get_offset(tree.depth)}#{tree.value} - #{tree.depth}"
62
+ puts "#{get_offset(tree.depth)}#{tree.values.inspect} - #{tree.depth}"
63
+
52
64
  if tree.children.length > 0
53
65
  tree.children.each do |child|
54
66
  print_tree(child)
@@ -59,13 +71,16 @@ class ReeRoda::BuildRoutingTree
59
71
  end
60
72
 
61
73
  def print_proc_tree(tree = self)
62
- param_value = tree.value.start_with?(":") ? String : "\"#{tree.value}\""
74
+ param_value = tree.values[0].start_with?(":") ? String : "\"#{tree.values[0]}\""
75
+
63
76
  if tree.routes.length == 0
64
77
  if tree.children.length > 0
65
78
  puts "#{get_offset(tree.depth)}r.on #{param_value} do"
79
+
66
80
  tree.children.each do |child|
67
81
  print_proc_tree(child)
68
82
  end
83
+
69
84
  puts "#{get_offset(tree.depth)}end"
70
85
  end
71
86
 
@@ -73,20 +88,25 @@ class ReeRoda::BuildRoutingTree
73
88
  else
74
89
  if tree.children.length > 0
75
90
  puts "#{get_offset(tree.depth)}r.on #{param_value} do"
91
+
76
92
  tree.children.each do |child|
77
93
  print_proc_tree(child)
78
94
  end
95
+
79
96
  tree.routes.each do |route|
80
97
  puts "#{get_offset(tree.depth + 1)}r.#{route.request_method} do"
81
98
  puts "#{get_offset(tree.depth + 1)}end"
82
99
  end
100
+
83
101
  puts "#{get_offset(tree.depth)}end"
84
102
  else
85
103
  puts "#{get_offset(tree.depth)}r.is #{param_value} do"
104
+
86
105
  tree.routes.each do |route|
87
106
  puts "#{get_offset(tree.depth + 1)}r.#{route.request_method} do"
88
107
  puts "#{get_offset(tree.depth + 1)}end"
89
108
  end
109
+
90
110
  puts "#{get_offset(tree.depth)}end"
91
111
  end
92
112
  end
@@ -104,26 +124,28 @@ class ReeRoda::BuildRoutingTree
104
124
  contract(ArrayOf[ReeRoutes::Route] => Nilor[RoutingTree])
105
125
  def call(routes)
106
126
  tree = nil
127
+
107
128
  routes.each do |route|
108
129
  splitted = route.path.split("/")
109
-
110
130
  parent_tree = tree
131
+
111
132
  splitted.each_with_index do |v, j|
112
133
  if tree.nil?
113
- tree = RoutingTree.new(v, j, :string)
134
+ tree = RoutingTree.new([v], j, :string)
114
135
  parent_tree = tree
115
136
  next
116
137
  end
117
138
 
118
139
  current = parent_tree.find_by_value(value: v, depth: j)
140
+
119
141
  if current
120
142
  parent_tree = current
121
-
122
143
  current.add_route(route) if j == (splitted.length - 1)
123
144
  else
124
- if !parent_tree.children_have_value?(v)
145
+ if !parent_tree.any_child_has_value?(v)
125
146
  if parent_tree.children.any? { |c| c.type == :param } && v.start_with?(":")
126
147
  param_child = parent_tree.children.find { |c| c.type == :param }
148
+ param_child.values << v if !param_child.values.include?(v)
127
149
  param_child.add_route(route) if j == (splitted.length - 1)
128
150
  parent_tree = param_child
129
151
 
@@ -138,7 +160,7 @@ class ReeRoda::BuildRoutingTree
138
160
  end
139
161
  end
140
162
  end
141
-
163
+
142
164
  tree
143
165
  end
144
166
  end
@@ -16,7 +16,10 @@ RSpec.describe ReeRoda::App do
16
16
  module ReeRodaTest
17
17
  include Ree::PackageDSL
18
18
 
19
- package
19
+ package do
20
+ depends_on :ree_actions
21
+ depends_on :ree_dao
22
+ end
20
23
  end
21
24
 
22
25
  class ReeRodaTest::Cmd
@@ -62,6 +65,20 @@ RSpec.describe ReeRoda::App do
62
65
  end
63
66
  end
64
67
 
68
+ class ReeRodaTest::ActionCmd
69
+ include ReeActions::DSL
70
+
71
+ action :action_cmd
72
+
73
+ ActionCaster = build_mapper.use(:cast) do
74
+ integer :action_id
75
+ end
76
+
77
+ def call(access, attrs)
78
+ {result: "action_cmd"}
79
+ end
80
+ end
81
+
65
82
  class ReeRodaTest::Serializer
66
83
  include ReeMapper::DSL
67
84
 
@@ -91,6 +108,14 @@ RSpec.describe ReeRoda::App do
91
108
  serializer :serializer, **opts
92
109
  end
93
110
 
111
+ get "api/action/:action_id/test" do
112
+ summary "Subaction"
113
+ warden_scope :visitor
114
+ sections "some_action"
115
+ action :action_cmd, **opts
116
+ serializer :serializer, **opts
117
+ end
118
+
94
119
  get "api/action/:id/subaction" do
95
120
  summary "Subaction"
96
121
  warden_scope :visitor
@@ -202,6 +227,10 @@ RSpec.describe ReeRoda::App do
202
227
  get "api/action/1/subaction"
203
228
  expect(last_response.status).to eq(200)
204
229
  expect(last_response.body).to eq("{\"result\":\"result\"}")
230
+
231
+ get "api/action/1/test"
232
+ expect(last_response.status).to eq(200)
233
+ expect(last_response.body).to eq("{\"result\":\"action_cmd\"}")
205
234
  }
206
235
 
207
236
  it {
@@ -2,10 +2,8 @@
2
2
 
3
3
  RSpec.describe :build_routing_tree do
4
4
  link :build_routing_tree, from: :ree_roda
5
- link :except, from: :ree_hash
6
5
  link :is_blank, from: :ree_object
7
6
  link :not_blank, from: :ree_object
8
- link :to_hash, from: :ree_object
9
7
 
10
8
  before :all do
11
9
  Ree.enable_irb_mode
@@ -13,7 +11,10 @@ RSpec.describe :build_routing_tree do
13
11
  module ReeRodaTestTree
14
12
  include Ree::PackageDSL
15
13
 
16
- package
14
+ package do
15
+ depends_on :ree_actions
16
+ depends_on :ree_dao
17
+ end
17
18
  end
18
19
 
19
20
  class ReeRodaTestTree::Cmd
@@ -255,7 +256,7 @@ RSpec.describe :build_routing_tree do
255
256
  expect(id_nodes.all? { not_blank(_1.routes) }).to eq(true)
256
257
  expect(count_tree_routes(tree)).to eq(13)
257
258
 
258
- hsh = to_hash(tree)
259
- expect(except(hsh, global_except: [:routes])).to eq(hsh_tree)
259
+ # hsh = to_hash(tree)
260
+ # expect(except(hsh, global_except: [:routes])).to eq(hsh_tree)
260
261
  }
261
262
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.41"
4
+ VERSION = "1.0.43"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ree_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.41
4
+ version: 1.0.43
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-23 00:00:00.000000000 Z
11
+ date: 2023-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ree
@@ -293,26 +293,35 @@ files:
293
293
  - lib/ree_lib/packages/ree_dao/bin/console
294
294
  - lib/ree_lib/packages/ree_dao/package/ree_dao.rb
295
295
  - lib/ree_lib/packages/ree_dao/package/ree_dao/beans/connections.rb
296
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/beans/dao_cache.rb
296
297
  - lib/ree_lib/packages/ree_dao/package/ree_dao/dataset_extensions.rb
297
298
  - lib/ree_lib/packages/ree_dao/package/ree_dao/dsl.rb
298
299
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_connection.rb
299
300
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_dao.rb
300
301
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_pg_connection.rb
301
302
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/build_sqlite_connection.rb
303
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/drop_cache.rb
304
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/extract_changes.rb
305
+ - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/init_cache.rb
302
306
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_many.rb
303
307
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/one_to_one.rb
304
308
  - lib/ree_lib/packages/ree_dao/package/ree_dao/functions/persist_assoc.rb
305
309
  - lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb
306
310
  - lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb
307
311
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/beans/connections.schema.json
312
+ - lib/ree_lib/packages/ree_dao/schemas/ree_dao/beans/dao_cache.schema.json
308
313
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_connection.schema.json
309
314
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_dao.schema.json
310
315
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_pg_connection.schema.json
311
316
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/build_sqlite_connection.schema.json
317
+ - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/drop_cache.schema.json
318
+ - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/extract_changes.schema.json
319
+ - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/init_cache.schema.json
312
320
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/one_to_many.schema.json
313
321
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/one_to_one.schema.json
314
322
  - lib/ree_lib/packages/ree_dao/schemas/ree_dao/functions/persist_assoc.schema.json
315
323
  - lib/ree_lib/packages/ree_dao/spec/package_schema_spec.rb
324
+ - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_pg_connection_spec.rb
316
325
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection/max_connections_spec.rb
317
326
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb
318
327
  - lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_many_spec.rb