remote_db 0.0.1
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 +7 -0
- data/.gitignore +10 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/README.md +7 -0
- data/lib/remote_db/concerns/configurable.rb +50 -0
- data/lib/remote_db/concerns/read_only_model.rb +41 -0
- data/lib/remote_db/concerns/restricted_columns.rb +52 -0
- data/lib/remote_db/configuration.rb +21 -0
- data/lib/remote_db/version.rb +3 -0
- data/lib/remote_db.rb +8 -0
- data/remote_db.gemspec +19 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 54d0b659f91bd851c797b2378a5a58a44e727778
|
4
|
+
data.tar.gz: 77d11bfeb7c050e54642f3621f58c665d0b06fd3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0c964ced6b11c7ef08d8e6fed0fa535267778247eeb8274d24bbbe2c5543b62a56ec124a4bda02ebc15cd8ff78d800c9a19c737090ff34535929416611fc8b8a
|
7
|
+
data.tar.gz: cdc286bb4cd33772b352dd223818e3514721a3654a68067ad17eacd6a305dd39097555702ad3b31c0986cab42017f224dfbd88669051f72bb47d9efc57fd84ad
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
## Remote DB
|
2
|
+
|
3
|
+
There are cases where you want to easily consume database objects from a specific database. This gem
|
4
|
+
makes it very easy to expose a specific set of tables/columns from a remote database, and allow them to
|
5
|
+
be consumed in *read only* form within a gem.
|
6
|
+
|
7
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module RemoteDb
|
2
|
+
module Concerns
|
3
|
+
module Configurable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def configure(config_hash = nil)
|
8
|
+
if config_hash
|
9
|
+
config_hash.each do |k,v|
|
10
|
+
setter = "#{k}="
|
11
|
+
if configuration.respond_to?(setter )
|
12
|
+
configuration.send(setter , v)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
yield(configuration) if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def configuration
|
21
|
+
@configuration ||= RemoteDb::Configuration.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def load_models!
|
25
|
+
define_base_record
|
26
|
+
send(:require_models) if respond_to?(:require_models)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def define_base_record
|
32
|
+
connection_spec = configuration.connection_spec
|
33
|
+
klass = Class.new(ActiveRecord::Base) do
|
34
|
+
self.abstract_class = true
|
35
|
+
|
36
|
+
# Connect via custom db settings
|
37
|
+
establish_connection(connection_spec)
|
38
|
+
|
39
|
+
# Force model to be ready-only
|
40
|
+
include Concerns::ReadOnlyModel
|
41
|
+
|
42
|
+
# Scope which columns are exposed
|
43
|
+
include Concerns::RestrictedColumns
|
44
|
+
end
|
45
|
+
self.const_set 'BaseRecord', klass
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RemoteDb
|
2
|
+
module Concerns
|
3
|
+
module ReadOnlyModel
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
attr_readonly(*column_names) unless abstract_class?
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def delete(id_or_array)
|
12
|
+
raise ActiveRecord::ReadOnlyRecord
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete_all(conditions = nil)
|
16
|
+
raise ActiveRecord::ReadOnlyRecord
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_all(conditions = nil)
|
20
|
+
raise ActiveRecord::ReadOnlyRecord
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def readonly?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def destroy
|
29
|
+
raise ActiveRecord::ReadOnlyRecord
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete
|
33
|
+
raise ActiveRecord::ReadOnlyRecord
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_column
|
37
|
+
raise ActiveRecord::ReadOnlyRecord
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module RemoteDb
|
2
|
+
module Concerns
|
3
|
+
module RestrictedColumns
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class ForbiddenColumnException < Exception; end
|
7
|
+
|
8
|
+
included do
|
9
|
+
def read_attribute_with_safety(name)
|
10
|
+
original_db_column = self.class.original_columns.include?(name.to_sym)
|
11
|
+
visible_db_column = self.class.visible_columns.include? (name.to_sym)
|
12
|
+
|
13
|
+
if (original_db_column && visible_db_column) || !original_db_column
|
14
|
+
read_attribute_without_safety(name)
|
15
|
+
else
|
16
|
+
raise ForbiddenColumnException, "Column #{name} is not allowed for access."
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias_method_chain :read_attribute, :safety
|
20
|
+
end
|
21
|
+
|
22
|
+
module ClassMethods
|
23
|
+
|
24
|
+
def visible_columns
|
25
|
+
@visible_columns ||= []
|
26
|
+
end
|
27
|
+
|
28
|
+
def original_columns
|
29
|
+
@original_columns ||= []
|
30
|
+
end
|
31
|
+
|
32
|
+
# Note: This is a hack that relies on ActiveRecord's internals. Most of the
|
33
|
+
# logic is originally from: ActiveRecord::ModelSchema#reset_column_information`
|
34
|
+
|
35
|
+
def table_columns=(visible_columns)
|
36
|
+
unless abstract_class?
|
37
|
+
@visible_columns = visible_columns
|
38
|
+
@original_columns = columns.map(&:name).map(&:to_sym)
|
39
|
+
@columns.reject! do |column|
|
40
|
+
!visible_columns.include?(column.name.to_sym)
|
41
|
+
end
|
42
|
+
|
43
|
+
@column_names = @content_columns = @column_defaults = @columns_hash = nil
|
44
|
+
@dynamic_methods_hash = nil
|
45
|
+
@inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
|
46
|
+
@arel_engine = @relation = nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module RemoteDb
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :adapter
|
4
|
+
attr_accessor :pool
|
5
|
+
attr_accessor :host
|
6
|
+
attr_accessor :username
|
7
|
+
attr_accessor :password
|
8
|
+
attr_accessor :database
|
9
|
+
|
10
|
+
def connection_spec
|
11
|
+
{
|
12
|
+
adapter: adapter ,
|
13
|
+
pool: pool,
|
14
|
+
host: host,
|
15
|
+
username: username,
|
16
|
+
password: password,
|
17
|
+
database: database
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/remote_db.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
require 'active_record'
|
3
|
+
|
4
|
+
require_relative 'remote_db/configuration'
|
5
|
+
require_relative 'remote_db/version'
|
6
|
+
require_relative 'remote_db/concerns/configurable'
|
7
|
+
require_relative 'remote_db/concerns/read_only_model'
|
8
|
+
require_relative 'remote_db/concerns/restricted_columns'
|
data/remote_db.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'remote_db/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'remote_db'
|
7
|
+
spec.version = RemoteDb::VERSION
|
8
|
+
spec.summary = 'Easily create a gem for consuming remote database tables/columns.'
|
9
|
+
spec.description = ''
|
10
|
+
spec.files = `git ls-files`.split($/)
|
11
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
12
|
+
spec.require_paths = ['lib']
|
13
|
+
spec.authors = ['Omar Skalli']
|
14
|
+
spec.email = ['omar@zenpayroll.com']
|
15
|
+
spec.homepage = 'https://github.com/ZenPayroll/remote_db'
|
16
|
+
|
17
|
+
spec.add_runtime_dependency 'activesupport', '>= 3.0'
|
18
|
+
spec.add_runtime_dependency 'activerecord' , '>= 3.0'
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: remote_db
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Omar Skalli
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
description: ''
|
42
|
+
email:
|
43
|
+
- omar@zenpayroll.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- CHANGELOG.md
|
50
|
+
- Gemfile
|
51
|
+
- README.md
|
52
|
+
- lib/remote_db.rb
|
53
|
+
- lib/remote_db/concerns/configurable.rb
|
54
|
+
- lib/remote_db/concerns/read_only_model.rb
|
55
|
+
- lib/remote_db/concerns/restricted_columns.rb
|
56
|
+
- lib/remote_db/configuration.rb
|
57
|
+
- lib/remote_db/version.rb
|
58
|
+
- remote_db.gemspec
|
59
|
+
homepage: https://github.com/ZenPayroll/remote_db
|
60
|
+
licenses: []
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.4.4
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: Easily create a gem for consuming remote database tables/columns.
|
82
|
+
test_files: []
|
83
|
+
has_rdoc:
|