pakyow-data 1.0.0.rc5 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/pakyow/application/behavior/data/lookup.rb +77 -0
- data/lib/pakyow/application/behavior/data/serialization.rb +43 -0
- data/lib/pakyow/{data/behavior/config.rb → application/config/data.rb} +3 -3
- data/lib/pakyow/application/helpers/data.rb +13 -0
- data/lib/pakyow/{environment → behavior}/data/auto_migrate.rb +1 -1
- data/lib/pakyow/{environment → behavior}/data/connections.rb +1 -1
- data/lib/pakyow/{environment → behavior}/data/memory_db.rb +1 -1
- data/lib/pakyow/config/data.rb +52 -0
- data/lib/pakyow/data.rb +10 -10
- data/lib/pakyow/data/framework.rb +9 -9
- data/lib/pakyow/data/subscribers.rb +6 -8
- data/lib/pakyow/data/subscribers/adapters/redis.rb +8 -2
- data/lib/pakyow/{data/tasks → tasks/db}/bootstrap.rake +0 -0
- data/lib/pakyow/{data/tasks → tasks/db}/create.rake +0 -0
- data/lib/pakyow/{data/tasks → tasks/db}/drop.rake +0 -0
- data/lib/pakyow/{data/tasks → tasks/db}/finalize.rake +0 -0
- data/lib/pakyow/{data/tasks → tasks/db}/migrate.rake +0 -0
- data/lib/pakyow/{data/tasks → tasks/db}/reset.rake +0 -0
- data/lib/pakyow/tasks/info/sources.rake +64 -0
- data/lib/pakyow/validations/data/unique.rb +35 -0
- metadata +26 -25
- data/lib/pakyow/data/behavior/lookup.rb +0 -75
- data/lib/pakyow/data/behavior/serialization.rb +0 -41
- data/lib/pakyow/data/helpers.rb +0 -11
- data/lib/pakyow/environment/data/config.rb +0 -54
- data/lib/pakyow/validations/unique.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e05427fdd149e88fb48af9182abc15a427dcb8b621c4cb9e362d5df377ab157f
|
4
|
+
data.tar.gz: a219ae7c4044104a259adf7e901d51c4655f0e746cf79e1491c477716f72242b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44e1ab1da9e2f891255856fefa0821e8547be015dce16beab0823603d631dbdc4d34e55ec091c2e1ee756712956751c6d7ebe9ef36615fb52dfd885acdfb276f
|
7
|
+
data.tar.gz: b6e2caffba485db823a392901f88334bd95ef3e7b96e688e81b62e62ada92baa2ac2fedfa2bc51ea40f64e5ef06ac5b02f73e24b7f6e28ec851ef13f39728225
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
require "pakyow/data/container"
|
6
|
+
require "pakyow/data/lookup"
|
7
|
+
require "pakyow/data/subscribers"
|
8
|
+
|
9
|
+
module Pakyow
|
10
|
+
class Application
|
11
|
+
module Behavior
|
12
|
+
module Data
|
13
|
+
module Lookup
|
14
|
+
extend Support::Extension
|
15
|
+
|
16
|
+
# Data container object.
|
17
|
+
#
|
18
|
+
attr_reader :data
|
19
|
+
|
20
|
+
apply_extension do
|
21
|
+
after "boot", "initialize.data", priority: :high do
|
22
|
+
# Validate that each source connection exists.
|
23
|
+
#
|
24
|
+
state(:source).each do |source|
|
25
|
+
Pakyow.connection(source.adapter, source.connection)
|
26
|
+
end
|
27
|
+
|
28
|
+
subscribers = if is_a?(Plugin)
|
29
|
+
# Plugins should use the same subscribers object as their parent app.
|
30
|
+
#
|
31
|
+
parent.data.subscribers
|
32
|
+
else
|
33
|
+
Pakyow::Data::Subscribers.new(
|
34
|
+
self,
|
35
|
+
Pakyow.config.data.subscriptions.adapter,
|
36
|
+
Pakyow.config.data.subscriptions.adapter_settings
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
containers = Pakyow.data_connections.values.each_with_object([]) { |connections, arr|
|
41
|
+
connections.values.each do |connection|
|
42
|
+
arr << Pakyow::Data::Container.new(
|
43
|
+
connection: connection,
|
44
|
+
sources: state(:source).select { |source|
|
45
|
+
connection.name == source.connection && connection.type == source.adapter
|
46
|
+
},
|
47
|
+
objects: state(:object)
|
48
|
+
)
|
49
|
+
end
|
50
|
+
}
|
51
|
+
|
52
|
+
containers.each do |container|
|
53
|
+
container.finalize_associations!(containers - [container])
|
54
|
+
end
|
55
|
+
|
56
|
+
containers.each do |container|
|
57
|
+
container.finalize_sources!(containers - [container])
|
58
|
+
end
|
59
|
+
|
60
|
+
@data = Pakyow::Data::Lookup.new(
|
61
|
+
app: self,
|
62
|
+
containers: containers,
|
63
|
+
subscribers: subscribers
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
on "shutdown" do
|
68
|
+
if instance_variable_defined?(:@data)
|
69
|
+
@data.subscribers.shutdown
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
require "pakyow/support/serializer"
|
5
|
+
|
6
|
+
module Pakyow
|
7
|
+
class Application
|
8
|
+
module Behavior
|
9
|
+
module Data
|
10
|
+
# Persists in-memory subscribers across restarts.
|
11
|
+
#
|
12
|
+
module Serialization
|
13
|
+
extend Support::Extension
|
14
|
+
|
15
|
+
apply_extension do
|
16
|
+
on "shutdown", priority: :high do
|
17
|
+
if Pakyow.config.data.subscriptions.adapter == :memory && data
|
18
|
+
subscriber_serializer.serialize
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
after "boot" do
|
23
|
+
if Pakyow.config.data.subscriptions.adapter == :memory && data
|
24
|
+
subscriber_serializer.deserialize
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private def subscriber_serializer
|
30
|
+
Support::Serializer.new(
|
31
|
+
data.subscribers.adapter,
|
32
|
+
name: "#{config.name}-subscribers",
|
33
|
+
path: File.join(
|
34
|
+
Pakyow.config.root, "tmp", "state"
|
35
|
+
),
|
36
|
+
logger: Pakyow.logger
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/extension"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
module Config
|
7
|
+
module Data
|
8
|
+
extend Support::Extension
|
9
|
+
|
10
|
+
apply_extension do
|
11
|
+
on "configure" do
|
12
|
+
# We have to define these in a before configure hook since new types could be added.
|
13
|
+
#
|
14
|
+
Pakyow.config.data.connections.instance_eval do
|
15
|
+
Pakyow::Data::Connection.adapter_types.each do |type|
|
16
|
+
setting type, {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
configurable :data do
|
22
|
+
setting :default_adapter, :sql
|
23
|
+
setting :default_connection, :default
|
24
|
+
|
25
|
+
setting :silent, true
|
26
|
+
setting :auto_migrate, true
|
27
|
+
setting :auto_migrate_always, [:memory]
|
28
|
+
setting :migration_path, "./database/migrations"
|
29
|
+
|
30
|
+
defaults :production do
|
31
|
+
setting :auto_migrate, false
|
32
|
+
end
|
33
|
+
|
34
|
+
configurable :subscriptions do
|
35
|
+
setting :adapter, :memory
|
36
|
+
setting :adapter_settings, {}
|
37
|
+
|
38
|
+
defaults :production do
|
39
|
+
setting :adapter, :redis
|
40
|
+
setting :adapter_settings do
|
41
|
+
Pakyow.config.redis.to_h
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
configurable :connections do
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/pakyow/data.rb
CHANGED
@@ -10,18 +10,18 @@ Pakyow::Data::Connection.register_adapter :sql
|
|
10
10
|
require "pakyow/data/errors"
|
11
11
|
require "pakyow/data/framework"
|
12
12
|
|
13
|
-
require "pakyow/
|
14
|
-
require "pakyow/
|
15
|
-
require "pakyow/
|
16
|
-
require "pakyow/
|
13
|
+
require "pakyow/behavior/data/auto_migrate"
|
14
|
+
require "pakyow/behavior/data/connections"
|
15
|
+
require "pakyow/behavior/data/memory_db"
|
16
|
+
require "pakyow/config/data"
|
17
17
|
|
18
|
-
require "pakyow/validations/unique"
|
18
|
+
require "pakyow/validations/data/unique"
|
19
19
|
|
20
20
|
module Pakyow
|
21
|
-
config.tasks.paths << File.expand_path("../
|
21
|
+
config.tasks.paths << File.expand_path("../tasks", __FILE__)
|
22
22
|
|
23
|
-
include
|
24
|
-
include
|
25
|
-
include
|
26
|
-
include
|
23
|
+
include Behavior::Data::AutoMigrate
|
24
|
+
include Behavior::Data::Connections
|
25
|
+
include Behavior::Data::MemoryDB
|
26
|
+
include Config::Data
|
27
27
|
end
|
@@ -2,12 +2,12 @@
|
|
2
2
|
|
3
3
|
require "pakyow/framework"
|
4
4
|
|
5
|
-
require "pakyow/data
|
6
|
-
require "pakyow/data/
|
5
|
+
require "pakyow/application/config/data"
|
6
|
+
require "pakyow/application/behavior/data/lookup"
|
7
|
+
require "pakyow/application/behavior/data/serialization"
|
8
|
+
require "pakyow/application/helpers/data"
|
7
9
|
|
8
|
-
require "pakyow/data/
|
9
|
-
require "pakyow/data/behavior/lookup"
|
10
|
-
require "pakyow/data/behavior/serialization"
|
10
|
+
require "pakyow/data/object"
|
11
11
|
|
12
12
|
require "pakyow/data/sources/relational"
|
13
13
|
|
@@ -30,11 +30,11 @@ module Pakyow
|
|
30
30
|
#
|
31
31
|
aspect :objects
|
32
32
|
|
33
|
-
register_helper :active, Helpers
|
33
|
+
register_helper :active, Pakyow::Application::Helpers::Data
|
34
34
|
|
35
|
-
include
|
36
|
-
include Behavior::Lookup
|
37
|
-
include Behavior::Serialization
|
35
|
+
include Application::Config::Data
|
36
|
+
include Application::Behavior::Data::Lookup
|
37
|
+
include Application::Behavior::Data::Serialization
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -44,15 +44,13 @@ module Pakyow
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def register_subscriptions(subscriptions, subscriber: nil, &block)
|
47
|
-
|
48
|
-
subscriptions.
|
49
|
-
|
50
|
-
end
|
47
|
+
subscriptions.each do |subscription|
|
48
|
+
subscription[:version] = @app.config.data.subscriptions.version
|
49
|
+
end
|
51
50
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
}
|
51
|
+
@adapter.register_subscriptions(subscriptions, subscriber: subscriber).tap do |ids|
|
52
|
+
yield ids if block_given?
|
53
|
+
end
|
56
54
|
end
|
57
55
|
|
58
56
|
def did_mutate(source_name, changed_values = nil, result_source = nil)
|
@@ -138,9 +138,15 @@ module Pakyow
|
|
138
138
|
def cleanup
|
139
139
|
@redis.with do |redis|
|
140
140
|
redis.scan_each(match: key_subscription_ids_by_source("*")) do |key|
|
141
|
-
Pakyow.logger.
|
141
|
+
Pakyow.logger.internal {
|
142
|
+
"[Pakyow::Data::Subscribers::Adapters::Redis] Cleaning up expired subscriptions for #{key}"
|
143
|
+
}
|
144
|
+
|
142
145
|
removed_count = redis.zremrangebyscore(key, 0, Time.now.to_i)
|
143
|
-
|
146
|
+
|
147
|
+
Pakyow.logger.internal {
|
148
|
+
"[Pakyow::Data::Subscribers::Adapters::Redis] Removed #{removed_count} members for #{key}"
|
149
|
+
}
|
144
150
|
end
|
145
151
|
end
|
146
152
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/support/cli/style"
|
4
|
+
require "pakyow/support/dependencies"
|
5
|
+
|
6
|
+
desc "Show defined sources for an app"
|
7
|
+
namespace :info do
|
8
|
+
task :sources, [:app] do |_, args|
|
9
|
+
sources = args[:app].state(:source).sort_by { |source|
|
10
|
+
source.plural_name
|
11
|
+
}
|
12
|
+
|
13
|
+
source_names = sources.map { |source|
|
14
|
+
source.plural_name
|
15
|
+
}
|
16
|
+
|
17
|
+
source_locations = sources.map { |source|
|
18
|
+
source_location = source.__source_location.to_a.join(":")
|
19
|
+
|
20
|
+
source_location = if source_location.empty?
|
21
|
+
"unknown"
|
22
|
+
else
|
23
|
+
Pakyow::Support::Dependencies.library_name(source_location) ||
|
24
|
+
Pakyow::Support::Dependencies.strip_path_prefix(source_location)
|
25
|
+
end
|
26
|
+
|
27
|
+
source_location = if source_location.start_with?("pakyow-")
|
28
|
+
Pakyow::Support::CLI.style.blue(
|
29
|
+
"pakyow/#{source_location.split("pakyow-", 2)[1]}"
|
30
|
+
)
|
31
|
+
elsif source_location == "unknown"
|
32
|
+
Pakyow::Support::CLI.style.italic(source_location)
|
33
|
+
else
|
34
|
+
source_location
|
35
|
+
end
|
36
|
+
}
|
37
|
+
|
38
|
+
sources.each_with_index do |source, i|
|
39
|
+
puts Pakyow::Support::CLI.style.bold(source_names[i].inspect) + " #{source_locations[i]}"
|
40
|
+
|
41
|
+
source.associations.each do |association_type, associations|
|
42
|
+
associations.each do |association|
|
43
|
+
puts " #{association_type} #{association.name.inspect}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if source.attributes.any? && source.associations.values.flatten.any?
|
48
|
+
puts
|
49
|
+
end
|
50
|
+
|
51
|
+
if source.attributes.any?
|
52
|
+
attributes = source.attributes.sort_by { |attribute_name, _|
|
53
|
+
attribute_name
|
54
|
+
}
|
55
|
+
|
56
|
+
attributes.each do |attribute_name, attribute_type|
|
57
|
+
puts " attribute #{attribute_name.inspect}, #{attribute_type.meta[:mapping].inspect}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
puts
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pakyow/validator"
|
4
|
+
|
5
|
+
module Pakyow
|
6
|
+
module Validations
|
7
|
+
module Data
|
8
|
+
# Validates that the value is unique within its data source.
|
9
|
+
#
|
10
|
+
module Unique
|
11
|
+
def self.message(**)
|
12
|
+
"must be unique"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.valid?(value, source:, **options)
|
16
|
+
query = options[:context].app.data.public_send(source).public_send(:"by_#{options[:key]}", value)
|
17
|
+
|
18
|
+
if updating = options[:updating]
|
19
|
+
if updating.is_a?(Pakyow::Data::Result)
|
20
|
+
query.count == 0 || query.any? { |result|
|
21
|
+
result[updating.__proxy.source.class.primary_key_field] == updating[updating.__proxy.source.class.primary_key_field]
|
22
|
+
}
|
23
|
+
else
|
24
|
+
raise ArgumentError, "Expected `#{updating.class}' to be a `Pakyow::Data::Result'"
|
25
|
+
end
|
26
|
+
else
|
27
|
+
query.count == 0
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Validator.register_validation(Unique, :unique)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pakyow-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pakyow-core
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0
|
19
|
+
version: 1.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.0
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pakyow-support
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.0.0
|
33
|
+
version: 1.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.0.0
|
40
|
+
version: 1.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: concurrent-ruby
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '5.22'
|
111
111
|
description: Data persistence layer for Pakyow
|
112
|
-
email: bryan@
|
112
|
+
email: bryan@bryanp.org
|
113
113
|
executables: []
|
114
114
|
extensions: []
|
115
115
|
extra_rdoc_files: []
|
@@ -117,6 +117,14 @@ files:
|
|
117
117
|
- CHANGELOG.md
|
118
118
|
- LICENSE
|
119
119
|
- README.md
|
120
|
+
- lib/pakyow/application/behavior/data/lookup.rb
|
121
|
+
- lib/pakyow/application/behavior/data/serialization.rb
|
122
|
+
- lib/pakyow/application/config/data.rb
|
123
|
+
- lib/pakyow/application/helpers/data.rb
|
124
|
+
- lib/pakyow/behavior/data/auto_migrate.rb
|
125
|
+
- lib/pakyow/behavior/data/connections.rb
|
126
|
+
- lib/pakyow/behavior/data/memory_db.rb
|
127
|
+
- lib/pakyow/config/data.rb
|
120
128
|
- lib/pakyow/data.rb
|
121
129
|
- lib/pakyow/data/adapters/base.rb
|
122
130
|
- lib/pakyow/data/adapters/sql.rb
|
@@ -130,14 +138,10 @@ files:
|
|
130
138
|
- lib/pakyow/data/adapters/sql/runner.rb
|
131
139
|
- lib/pakyow/data/adapters/sql/source_extension.rb
|
132
140
|
- lib/pakyow/data/adapters/sql/types.rb
|
133
|
-
- lib/pakyow/data/behavior/config.rb
|
134
|
-
- lib/pakyow/data/behavior/lookup.rb
|
135
|
-
- lib/pakyow/data/behavior/serialization.rb
|
136
141
|
- lib/pakyow/data/connection.rb
|
137
142
|
- lib/pakyow/data/container.rb
|
138
143
|
- lib/pakyow/data/errors.rb
|
139
144
|
- lib/pakyow/data/framework.rb
|
140
|
-
- lib/pakyow/data/helpers.rb
|
141
145
|
- lib/pakyow/data/lookup.rb
|
142
146
|
- lib/pakyow/data/migrator.rb
|
143
147
|
- lib/pakyow/data/object.rb
|
@@ -161,19 +165,16 @@ files:
|
|
161
165
|
- lib/pakyow/data/subscribers/adapters/redis/scripts/expire.lua
|
162
166
|
- lib/pakyow/data/subscribers/adapters/redis/scripts/persist.lua
|
163
167
|
- lib/pakyow/data/subscribers/adapters/redis/scripts/register.lua
|
164
|
-
- lib/pakyow/data/tasks/bootstrap.rake
|
165
|
-
- lib/pakyow/data/tasks/create.rake
|
166
|
-
- lib/pakyow/data/tasks/drop.rake
|
167
|
-
- lib/pakyow/data/tasks/finalize.rake
|
168
|
-
- lib/pakyow/data/tasks/migrate.rake
|
169
|
-
- lib/pakyow/data/tasks/reset.rake
|
170
168
|
- lib/pakyow/data/types.rb
|
171
|
-
- lib/pakyow/
|
172
|
-
- lib/pakyow/
|
173
|
-
- lib/pakyow/
|
174
|
-
- lib/pakyow/
|
175
|
-
- lib/pakyow/
|
176
|
-
|
169
|
+
- lib/pakyow/tasks/db/bootstrap.rake
|
170
|
+
- lib/pakyow/tasks/db/create.rake
|
171
|
+
- lib/pakyow/tasks/db/drop.rake
|
172
|
+
- lib/pakyow/tasks/db/finalize.rake
|
173
|
+
- lib/pakyow/tasks/db/migrate.rake
|
174
|
+
- lib/pakyow/tasks/db/reset.rake
|
175
|
+
- lib/pakyow/tasks/info/sources.rake
|
176
|
+
- lib/pakyow/validations/data/unique.rb
|
177
|
+
homepage: https://pakyow.com
|
177
178
|
licenses:
|
178
179
|
- LGPL-3.0
|
179
180
|
metadata: {}
|
@@ -188,9 +189,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
189
|
version: 2.5.0
|
189
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
191
|
requirements:
|
191
|
-
- - "
|
192
|
+
- - ">="
|
192
193
|
- !ruby/object:Gem::Version
|
193
|
-
version:
|
194
|
+
version: '0'
|
194
195
|
requirements: []
|
195
196
|
rubygems_version: 3.0.3
|
196
197
|
signing_key:
|
@@ -1,75 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
require "pakyow/data/container"
|
6
|
-
require "pakyow/data/lookup"
|
7
|
-
require "pakyow/data/subscribers"
|
8
|
-
|
9
|
-
module Pakyow
|
10
|
-
module Data
|
11
|
-
module Behavior
|
12
|
-
module Lookup
|
13
|
-
extend Support::Extension
|
14
|
-
|
15
|
-
# Data container object.
|
16
|
-
#
|
17
|
-
attr_reader :data
|
18
|
-
|
19
|
-
apply_extension do
|
20
|
-
after "boot", "initialize.data", priority: :high do
|
21
|
-
# Validate that each source connection exists.
|
22
|
-
#
|
23
|
-
state(:source).each do |source|
|
24
|
-
Pakyow.connection(source.adapter, source.connection)
|
25
|
-
end
|
26
|
-
|
27
|
-
subscribers = if is_a?(Plugin)
|
28
|
-
# Plugins should use the same subscribers object as their parent app.
|
29
|
-
#
|
30
|
-
parent.data.subscribers
|
31
|
-
else
|
32
|
-
Subscribers.new(
|
33
|
-
self,
|
34
|
-
Pakyow.config.data.subscriptions.adapter,
|
35
|
-
Pakyow.config.data.subscriptions.adapter_settings
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
|
-
containers = Pakyow.data_connections.values.each_with_object([]) { |connections, arr|
|
40
|
-
connections.values.each do |connection|
|
41
|
-
arr << Container.new(
|
42
|
-
connection: connection,
|
43
|
-
sources: state(:source).select { |source|
|
44
|
-
connection.name == source.connection && connection.type == source.adapter
|
45
|
-
},
|
46
|
-
objects: state(:object)
|
47
|
-
)
|
48
|
-
end
|
49
|
-
}
|
50
|
-
|
51
|
-
containers.each do |container|
|
52
|
-
container.finalize_associations!(containers - [container])
|
53
|
-
end
|
54
|
-
|
55
|
-
containers.each do |container|
|
56
|
-
container.finalize_sources!(containers - [container])
|
57
|
-
end
|
58
|
-
|
59
|
-
@data = Data::Lookup.new(
|
60
|
-
app: self,
|
61
|
-
containers: containers,
|
62
|
-
subscribers: subscribers
|
63
|
-
)
|
64
|
-
end
|
65
|
-
|
66
|
-
on "shutdown" do
|
67
|
-
if instance_variable_defined?(:@data)
|
68
|
-
@data.subscribers.shutdown
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
require "pakyow/support/serializer"
|
5
|
-
|
6
|
-
module Pakyow
|
7
|
-
module Data
|
8
|
-
module Behavior
|
9
|
-
# Persists in-memory subscribers across restarts.
|
10
|
-
#
|
11
|
-
module Serialization
|
12
|
-
extend Support::Extension
|
13
|
-
|
14
|
-
apply_extension do
|
15
|
-
on "shutdown", priority: :high do
|
16
|
-
if Pakyow.config.data.subscriptions.adapter == :memory && data
|
17
|
-
subscriber_serializer.serialize
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
after "boot" do
|
22
|
-
if Pakyow.config.data.subscriptions.adapter == :memory && data
|
23
|
-
subscriber_serializer.deserialize
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private def subscriber_serializer
|
29
|
-
Support::Serializer.new(
|
30
|
-
data.subscribers.adapter,
|
31
|
-
name: "#{config.name}-subscribers",
|
32
|
-
path: File.join(
|
33
|
-
Pakyow.config.root, "tmp", "state"
|
34
|
-
),
|
35
|
-
logger: Pakyow.logger
|
36
|
-
)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/pakyow/data/helpers.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/support/extension"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Environment
|
7
|
-
module Data
|
8
|
-
module Config
|
9
|
-
extend Support::Extension
|
10
|
-
|
11
|
-
apply_extension do
|
12
|
-
on "configure" do
|
13
|
-
# We have to define these in a before configure hook since new types could be added.
|
14
|
-
#
|
15
|
-
Pakyow.config.data.connections.instance_eval do
|
16
|
-
Pakyow::Data::Connection.adapter_types.each do |type|
|
17
|
-
setting type, {}
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
configurable :data do
|
23
|
-
setting :default_adapter, :sql
|
24
|
-
setting :default_connection, :default
|
25
|
-
|
26
|
-
setting :silent, true
|
27
|
-
setting :auto_migrate, true
|
28
|
-
setting :auto_migrate_always, [:memory]
|
29
|
-
setting :migration_path, "./database/migrations"
|
30
|
-
|
31
|
-
defaults :production do
|
32
|
-
setting :auto_migrate, false
|
33
|
-
end
|
34
|
-
|
35
|
-
configurable :subscriptions do
|
36
|
-
setting :adapter, :memory
|
37
|
-
setting :adapter_settings, {}
|
38
|
-
|
39
|
-
defaults :production do
|
40
|
-
setting :adapter, :redis
|
41
|
-
setting :adapter_settings do
|
42
|
-
Pakyow.config.redis.to_h
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
configurable :connections do
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pakyow/validator"
|
4
|
-
|
5
|
-
module Pakyow
|
6
|
-
module Validations
|
7
|
-
# Validates that the value is unique within its data source.
|
8
|
-
#
|
9
|
-
module Unique
|
10
|
-
def self.message(**)
|
11
|
-
"must be unique"
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.valid?(value, source:, **options)
|
15
|
-
query = options[:context].app.data.public_send(source).public_send(:"by_#{options[:key]}", value)
|
16
|
-
|
17
|
-
if updating = options[:updating]
|
18
|
-
if updating.is_a?(Data::Result)
|
19
|
-
query.count == 0 || query.any? { |result|
|
20
|
-
result[updating.__proxy.source.class.primary_key_field] == updating[updating.__proxy.source.class.primary_key_field]
|
21
|
-
}
|
22
|
-
else
|
23
|
-
raise ArgumentError, "Expected `#{updating.class}' to be a `Pakyow::Data::Result'"
|
24
|
-
end
|
25
|
-
else
|
26
|
-
query.count == 0
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
Validator.register_validation(Unique, :unique)
|
32
|
-
end
|
33
|
-
end
|