tzispa_data 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81f6d2fc4195aa94996282d8133b1585078c6b9e
4
+ data.tar.gz: 149267a81eeb8731de1adfe24cb81349c955c683
5
+ SHA512:
6
+ metadata.gz: 449f4f9285a404adfabac894d5dd59a57fd86eac7241ea5260359634009338d402eaec880f2e5ae0c7fde694370a679089e46183964be9254009472622d3e891
7
+ data.tar.gz: fe0811d116da497722d464b8aead0efa81a682046e81903c90d593df2bf35593ba232612c2dea65b43e4391d6343793abe0c591d55d36e943a1838067ca1c305
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ Tzispa Data
2
+
3
+ ## v0.1.0
4
+ - Initial release, code moved from tzispa main gem
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ Tzispa Data
2
+
3
+ Data access layer definition for Tzispa framework
@@ -0,0 +1,13 @@
1
+ module Tzispa
2
+ module Data
3
+
4
+ require 'sequel'
5
+ require 'tzispa/data/adapter'
6
+ require 'tzispa/data/adapter_pool'
7
+ require 'tzispa/data/repository'
8
+ require 'tzispa/data/entity'
9
+ require 'tzispa/data/version'
10
+
11
+
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ require 'sequel'
2
+ require 'forwardable'
3
+
4
+ module Tzispa
5
+ module Data
6
+
7
+ class AdapterPool
8
+ include Enumerable
9
+ extend Forwardable
10
+
11
+ def_delegators :@pool, :has_key?, :keys
12
+ attr_reader :default
13
+
14
+ def initialize(config, default=nil)
15
+ Sequel.default_timezone = :utc
16
+ Sequel.datetime_class = DateTime
17
+ Sequel.extension :core_extensions
18
+ @default = default || config.first[0].to_sym
19
+ @pool = Hash.new.tap { |hpool|
20
+ config.each { |key, value|
21
+ hpool[key.to_sym] = Sequel.connect value.adapter
22
+ }
23
+ }
24
+ end
25
+
26
+ def [](name=nil)
27
+ @pool[name&.to_sym || default]
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ require 'sequel'
2
+ require 'forwardable'
3
+
4
+ module Tzispa
5
+ module Data
6
+
7
+ class AdapterPool
8
+ include Enumerable
9
+ extend Forwardable
10
+
11
+ def_delegators :@pool, :has_key?, :keys
12
+ attr_reader :default
13
+
14
+ def initialize(config, default=nil)
15
+ @default = default || config.first[0].to_sym
16
+ @pool = Hash.new.tap { |hash|
17
+ config.each { |key, value|
18
+ hash[key.to_sym] = Sequel.connect value.adapter
19
+ }
20
+ }
21
+ #@adapter_keys = @adapters.keys
22
+ Sequel.default_timezone = :utc
23
+ Sequel.datetime_class = DateTime
24
+ end
25
+
26
+ def [](name=nil)
27
+ @pool[name&.to_sym || default]
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tzispa/utils/string'
4
+
5
+ module Tzispa
6
+ module Data
7
+ module Entity
8
+
9
+ def self.included(base)
10
+ base.extend(ClassMethods)
11
+ end
12
+
13
+ def entity!
14
+ @__entity || @__entity = self.class.entity_class.new(self)
15
+ end
16
+
17
+ module ClassMethods
18
+ def entity_class
19
+ class_variable_defined?(:@@__entity_class) ?
20
+ class_variable_get(:@@__entity_class) :
21
+ class_variable_set(:@@__entity_class, TzString.constantize("#{self}Entity") )
22
+ end
23
+ alias_method :entity, :entity_class
24
+ end
25
+
26
+ #unless model_class.respond_to?(:entity_class!)
27
+ # model_class.send(:define_singleton_method, :entity_class) {
28
+ # class_variable_defined?(:@@__entity_class) ?
29
+ # class_variable_get(:@@__entity_class) :
30
+ # class_variable_set(:@@__entity_class, TzString.constantize("#{self}Entity") )
31
+ # }
32
+ #end
33
+ #model_class.send(:define_method, :entity!) {
34
+ # instance_variable_defined?(:@__entity) ?
35
+ # instance_variable_get(:@__entity) :
36
+ # instance_variable_set(:@__entity, self.class.entity_class!.new(self))
37
+ #}
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'sequel'
4
+ require 'tzispa/utils/string'
5
+ require 'tzispa/data/adapter_pool'
6
+
7
+ module Tzispa
8
+ module Data
9
+
10
+ class DataError < StandardError; end;
11
+ class UnknownAdapter < DataError; end;
12
+ class UnknownModel < DataError; end;
13
+
14
+
15
+ class Repository
16
+
17
+ attr_reader :root, :selected_adapter
18
+
19
+ LOCAL_REPO_ROOT = :repository
20
+
21
+ def initialize(config, root = LOCAL_REPO_ROOT)
22
+ @config = config
23
+ @root = root
24
+ @pool = Hash.new
25
+ @adapters = AdapterPool.new config
26
+ @selected_adapter = @adapters.default
27
+ end
28
+
29
+ def use(repo_id)
30
+ raise UnknownAdapter.new("The '#{adapter}' adapter does not exists") unless @adapters.has_key? repo_id
31
+ @selected_adapter = repo_id
32
+ end
33
+
34
+ def [](model)
35
+ raise UnknownModel.new("The '#{model}' model does not exists in the adapter '#{selected_adapter}'") unless @pool.has_key? self.class.key(model, selected_adapter)
36
+ @pool[self.class.key(model.to_sym, selected_adapter)]
37
+ end
38
+
39
+ def load!
40
+ @config.each { |id, cfg|
41
+ Mutex.new.synchronize {
42
+ Sequel::Model.db = @adapters[id]
43
+ if cfg.local
44
+ build_local_repo id, cfg
45
+ else
46
+ require cfg.gem
47
+ repo_mod, build_method = cfg.register.split('#')
48
+ (TzString.constantize repo_mod).send build_method, self, id, cfg
49
+ end
50
+ }
51
+ }
52
+ self
53
+ end
54
+
55
+ def register(model_id, model_class, repo_id, config)
56
+ model_class.db = @adapters[repo_id]
57
+ config.extensions.split(',').each { |ext|
58
+ model_class.db.extension ext.to_sym
59
+ } if config.respond_to? :extensions
60
+ @pool[self.class.key(model_id, repo_id)] = model_class
61
+ end
62
+
63
+ private
64
+
65
+ def build_local_repo(repo_id, config)
66
+ Dir["./#{root.to_s.downcase}/#{repo_id}/*.rb"].each { |file|
67
+ model_id = file.split('/').last.split('.').first
68
+ require local_model_source(model_id, repo_id)
69
+ model_class = TzString.constantize "Repository::#{TzString.camelize repo_id}::#{TzString.camelize model_id}"
70
+ register model_id, model_class, repo_id, config
71
+ }
72
+ end
73
+
74
+ def local_model_source(model, repo_id)
75
+ "./#{root.to_s.downcase}/#{repo_id}/#{model}"
76
+ end
77
+
78
+ def self.key(model_id, repo_id)
79
+ "#{model_id}@#{repo_id}".to_sym
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tzispa
4
+ module Data
5
+
6
+ VERSION = '0.1.0'
7
+ NAME = 'Tzispa Data'
8
+ GEM_NAME = 'tzispa_data'
9
+
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Tzispa
2
+ module Data
3
+
4
+ require 'tzispa/data'
5
+
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tzispa_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Juan Antonio Piñero
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sequel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.31'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.31'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tzispa_utils
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ description: Data access layer for Tzispa
42
+ email:
43
+ - japinero@area-integral.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - CHANGELOG.md
49
+ - README.md
50
+ - lib/tzispa/data.rb
51
+ - lib/tzispa/data/adapter.rb
52
+ - lib/tzispa/data/adapter_pool.rb
53
+ - lib/tzispa/data/entity.rb
54
+ - lib/tzispa/data/repository.rb
55
+ - lib/tzispa/data/version.rb
56
+ - lib/tzispa_data.rb
57
+ homepage: https://www.area-integral.com
58
+ licenses:
59
+ - MIT
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.3'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 2.5.1
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Data access for Tzispa framework
81
+ test_files: []