skiima 0.1.000 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +9 -0
- data/.travis.yml +11 -3
- data/Gemfile +12 -6
- data/Guardfile +13 -11
- data/LICENSE +20 -0
- data/Procfile.example +2 -0
- data/README.md +170 -23
- data/Rakefile +26 -22
- data/lib/skiima.rb +61 -240
- data/lib/skiima/config.rb +60 -0
- data/lib/skiima/config/struct.rb +87 -0
- data/lib/skiima/db/connector.rb +195 -0
- data/lib/skiima/db/connector/active_record.rb +11 -0
- data/lib/skiima/db/connector/active_record/base_connector.rb +34 -0
- data/lib/skiima/db/connector/active_record/mysql2_connector.rb +147 -0
- data/lib/skiima/db/connector/active_record/mysql_connector.rb +177 -0
- data/lib/skiima/db/connector/active_record/postgresql_connector.rb +39 -0
- data/lib/skiima/db/helpers/mysql.rb +230 -0
- data/lib/skiima/db/helpers/postgresql.rb +221 -0
- data/lib/skiima/db/resolver.rb +62 -0
- data/lib/skiima/dependency/reader.rb +55 -0
- data/lib/skiima/dependency/script.rb +63 -0
- data/lib/skiima/i18n.rb +24 -0
- data/lib/skiima/loader.rb +108 -0
- data/lib/skiima/locales/en.yml +2 -2
- data/lib/skiima/logger.rb +54 -0
- data/lib/skiima/railtie.rb +10 -0
- data/lib/skiima/railties/skiima.rake +31 -0
- data/lib/skiima/version.rb +2 -2
- data/skiima.gemspec +5 -5
- data/spec/config/{database.yml → database.yml.example} +16 -0
- data/spec/config/database.yml.travis +69 -0
- data/spec/db/skiima/{depends.yml → dependencies.yml} +7 -2
- data/spec/db/skiima/{empty_depends.yml → empty_dependencies.yml} +0 -0
- data/spec/db/skiima/init_test_db/database.skiima_test.mysql.current.sql +7 -0
- data/spec/db/skiima/init_test_db/database.skiima_test.postgresql.current.sql +7 -0
- data/spec/mysql2_spec.rb +61 -12
- data/spec/mysql_spec.rb +66 -27
- data/spec/postgresql_spec.rb +55 -34
- data/spec/shared_examples/config_shared_example.rb +40 -0
- data/spec/skiima/config/struct_spec.rb +78 -0
- data/spec/skiima/config_spec.rb +6 -0
- data/spec/skiima/db/connector/active_record/base_connector_spec.rb +0 -0
- data/spec/skiima/db/connector/active_record/mysql2_connector_spec.rb +3 -0
- data/spec/skiima/db/connector/active_record/mysql_connector_spec.rb +3 -0
- data/spec/skiima/db/connector/active_record/postgresql_connector_spec.rb +7 -0
- data/spec/skiima/db/connector_spec.rb +6 -0
- data/spec/skiima/db/resolver_spec.rb +54 -0
- data/spec/skiima/dependency/reader_spec.rb +52 -0
- data/spec/skiima/{dependency_spec.rb → dependency/script_spec.rb} +3 -41
- data/spec/skiima/i18n_spec.rb +29 -0
- data/spec/skiima/loader_spec.rb +102 -0
- data/spec/skiima/logger_spec.rb +0 -0
- data/spec/skiima_spec.rb +43 -64
- data/spec/spec_helper.rb +38 -4
- metadata +144 -100
- data/lib/skiima/db_adapters.rb +0 -187
- data/lib/skiima/db_adapters/base_mysql_adapter.rb +0 -308
- data/lib/skiima/db_adapters/mysql2_adapter.rb +0 -114
- data/lib/skiima/db_adapters/mysql_adapter.rb +0 -287
- data/lib/skiima/db_adapters/postgresql_adapter.rb +0 -509
- data/lib/skiima/dependency.rb +0 -84
- data/lib/skiima_helpers.rb +0 -49
- data/spec/skiima/db_adapters/mysql_adapter_spec.rb +0 -38
- data/spec/skiima/db_adapters/postgresql_adapter_spec.rb +0 -20
- data/spec/skiima/db_adapters_spec.rb +0 -31
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Skiima
|
3
|
+
module Db
|
4
|
+
|
5
|
+
class Resolver
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
attr_accessor :db, :orm_module, :connector_klass
|
9
|
+
attr_accessor :adapter
|
10
|
+
|
11
|
+
delegate create_connector: :connector_klass
|
12
|
+
|
13
|
+
def initialize(db_config)
|
14
|
+
merge_db_defaults(db_config)
|
15
|
+
adapter_specified?
|
16
|
+
load_orm_module
|
17
|
+
load_db_connector
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def merge_db_defaults(opts = {})
|
23
|
+
@db = (db_defaults.merge(Skiima.symbolize_keys(opts)))
|
24
|
+
end
|
25
|
+
|
26
|
+
def db_defaults
|
27
|
+
{ orm: 'active_record' }
|
28
|
+
end
|
29
|
+
|
30
|
+
def adapter_specified?
|
31
|
+
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless db.key?(:adapter)
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_db_connector
|
35
|
+
require "skiima/db/connector/#{db[:orm]}/#{db[:adapter]}_connector"
|
36
|
+
@connector_klass = get_db_connector_klass
|
37
|
+
rescue => e
|
38
|
+
raise LoadError, "Adapter does not exist for #{db[:orm]}: #{db[:adapter]} - (#{e.message})", e.backtrace
|
39
|
+
end
|
40
|
+
|
41
|
+
def load_orm_module
|
42
|
+
require "skiima/db/connector/#{db[:orm]}"
|
43
|
+
rescue => e
|
44
|
+
raise LoadError, "Adapter Module does not exist for #{db[:orb]}: (#{e.message})", e.backtrace
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_db_connector_klass
|
48
|
+
#avoiding inflections
|
49
|
+
@connector_klass =
|
50
|
+
case (@orm_module = db[:orm])
|
51
|
+
when 'active_record'
|
52
|
+
case db[:adapter]
|
53
|
+
when 'postgresql' then Skiima::Db::Connector::ActiveRecord::PostgresqlConnector
|
54
|
+
when 'mysql' then Skiima::Db::Connector::ActiveRecord::MysqlConnector
|
55
|
+
when 'mysql2' then Skiima::Db::Connector::ActiveRecord::Mysql2Connector
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Skiima
|
2
|
+
module Dependency
|
3
|
+
|
4
|
+
class Reader
|
5
|
+
attr_accessor :scripts
|
6
|
+
attr_accessor :dependencies, :adapter, :version
|
7
|
+
|
8
|
+
def initialize(dependencies, adapter, opts = {})
|
9
|
+
@dependencies, @adapter = dependencies, adapter.to_sym
|
10
|
+
@version = opts[:version] || :current
|
11
|
+
end
|
12
|
+
|
13
|
+
def adapter
|
14
|
+
case @adapter.to_s
|
15
|
+
when 'mysql', 'mysql2' then :mysql
|
16
|
+
else @adapter
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_group(g)
|
21
|
+
raise Skiima::SqlGroupNotFound unless dependencies.has_key?(g)
|
22
|
+
dependencies[g]
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_adapter(grp)
|
26
|
+
grp.has_key?(adapter) ? (grp[adapter] || {}) : {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_scripts(group, version_grp)
|
30
|
+
scr = (version_grp.has_key?(version) ? (version_grp[version] || {}) : {})
|
31
|
+
sc = scr.map {|s| Skiima::Dependency::Script.new(group, adapter, version, s)}
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_load_order(*groups)
|
35
|
+
opts = groups.last.is_a?(Hash) ? groups.pop : {}
|
36
|
+
@scripts = groups.inject([]) do |memo, g|
|
37
|
+
grp = get_group(g)
|
38
|
+
scripts = if grp.is_a?(Hash) || (opts[:node] == :internal)
|
39
|
+
get_scripts(g, Skiima.symbolize_keys(read_script_group(grp)))
|
40
|
+
else
|
41
|
+
get_load_order(*(grp.map(&:to_sym)), node: :internal)
|
42
|
+
end
|
43
|
+
memo + scripts
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def read_script_group(leaf_node)
|
50
|
+
get_adapter(Skiima.symbolize_keys(leaf_node))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Skiima
|
2
|
+
module Dependency
|
3
|
+
|
4
|
+
class Script
|
5
|
+
attr_accessor :group, :adapter, :version
|
6
|
+
attr_accessor :type, :name, :attr
|
7
|
+
attr_accessor :filename, :content, :sql
|
8
|
+
|
9
|
+
def initialize(group, adapter, version, scriptname)
|
10
|
+
@group, @adapter, @version = group.to_s, adapter.to_s, version.to_s
|
11
|
+
set_attr(scriptname)
|
12
|
+
end
|
13
|
+
|
14
|
+
def filename
|
15
|
+
@filename = [@type,@name,@adapter.to_s,@version,'sql'].join('.')
|
16
|
+
end
|
17
|
+
|
18
|
+
def read_content(direction, root)
|
19
|
+
@content = case
|
20
|
+
when (direction == :up) then read_upfile(root)
|
21
|
+
when (direction == :down && down_script?(root)) then read_downfile(root)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def interpolate_sql(char, vars = {})
|
26
|
+
@sql = Skiima.interpolate_sql(char, @content, vars)
|
27
|
+
end
|
28
|
+
|
29
|
+
def down_filename
|
30
|
+
filename.sub('.sql', '.drop.sql')
|
31
|
+
end
|
32
|
+
|
33
|
+
def read_upfile(root)
|
34
|
+
File.open(full_filename(root)).read
|
35
|
+
end
|
36
|
+
|
37
|
+
def read_downfile(root)
|
38
|
+
File.open(full_down_filename(root)).read
|
39
|
+
end
|
40
|
+
|
41
|
+
def full_filename(root)
|
42
|
+
File.join(root, group, filename)
|
43
|
+
end
|
44
|
+
|
45
|
+
def full_down_filename(root)
|
46
|
+
File.join(root, group, down_filename)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def set_attr(scr_name)
|
52
|
+
scr_name = scr_name.split('.')
|
53
|
+
@type, @name = scr_name.shift, scr_name.shift
|
54
|
+
@attr = scr_name
|
55
|
+
end
|
56
|
+
|
57
|
+
def down_script?(root)
|
58
|
+
File.exist?(full_down_filename(root))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/skiima/i18n.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Skiima
|
4
|
+
module I18n
|
5
|
+
|
6
|
+
def default_locale
|
7
|
+
::Skiima.locale
|
8
|
+
end
|
9
|
+
|
10
|
+
def msg(*args)
|
11
|
+
# TODO: change to use config.locale
|
12
|
+
locale = args.last.is_a?(Symbol) ? args.pop : default_locale
|
13
|
+
lookup = args.join('.')
|
14
|
+
Skiima._(lookup)
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_translation_repository
|
18
|
+
FastGettext.add_text_domain('skiima', :path => File.join(File.dirname(__FILE__), 'skiima', 'locales'), :type => :yaml)
|
19
|
+
Skiima.text_domain = 'skiima'
|
20
|
+
Skiima.locale = locale.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Skiima
|
3
|
+
class Loader
|
4
|
+
extend Forwardable
|
5
|
+
include Skiima::Config
|
6
|
+
|
7
|
+
attr_accessor :env, :vars, :reader, :resolver
|
8
|
+
attr_accessor :dependencies, :db, :connector
|
9
|
+
attr_accessor :direction
|
10
|
+
attr_accessor :scripts
|
11
|
+
attr_accessor :logger
|
12
|
+
|
13
|
+
delegate connection: :connector
|
14
|
+
|
15
|
+
def defaults
|
16
|
+
Skiima.config
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(env, opts = {})
|
20
|
+
@env = env
|
21
|
+
merge_db_config(opts.delete('db') || {})
|
22
|
+
get_config(opts)
|
23
|
+
set_vars
|
24
|
+
create_logger
|
25
|
+
create_resolver
|
26
|
+
create_connector
|
27
|
+
get_dependency_config
|
28
|
+
create_dependency_reader
|
29
|
+
end
|
30
|
+
|
31
|
+
def up(*args)
|
32
|
+
@direction = :up
|
33
|
+
read_and_execute(*args)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def down(*args)
|
38
|
+
@direction = :down
|
39
|
+
read_and_execute(*args)
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_resolver
|
44
|
+
@resolver = Skiima::Db::Resolver.new(db)
|
45
|
+
end
|
46
|
+
|
47
|
+
def create_connector
|
48
|
+
@connector = resolver.create_connector(db, logger)
|
49
|
+
end
|
50
|
+
|
51
|
+
def log_message(msg)
|
52
|
+
Skiima.log_message(logger, msg)
|
53
|
+
end
|
54
|
+
|
55
|
+
def read_and_execute(*scripts)
|
56
|
+
read_scripts *scripts
|
57
|
+
interpolate_each_script
|
58
|
+
execute_each_script
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def set_vars
|
64
|
+
@vars = config[:vars] || {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def read_scripts(*args)
|
68
|
+
@scripts = reader.get_load_order(*args)
|
69
|
+
@scripts.reverse! if direction == :down
|
70
|
+
end
|
71
|
+
|
72
|
+
def interpolate_each_script
|
73
|
+
scripts.each do |s|
|
74
|
+
s.read_content(direction, full_scripts_path)
|
75
|
+
s.content ||= connector.drop(s.type, s.name, {:attr => s.attr}.merge(config.to_hash)) if direction == :down
|
76
|
+
s.interpolate_sql(interpolator, interpolation_vars)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def execute_each_script
|
81
|
+
scripts.each {|s| connector.execute(s.sql)}
|
82
|
+
end
|
83
|
+
|
84
|
+
def create_dependency_reader
|
85
|
+
@reader = Skiima::Dependency::Reader.new(dependencies, db['adapter'], config)
|
86
|
+
end
|
87
|
+
|
88
|
+
def interpolation_vars
|
89
|
+
{ :database => db['database'] }.merge(config[:vars] || {})
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_config(opts)
|
93
|
+
@config = config.merge(opts)
|
94
|
+
end
|
95
|
+
|
96
|
+
def merge_db_config(db_config)
|
97
|
+
@db = read_db_yml(full_database_path)[env].merge(db_config)
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_dependency_config
|
101
|
+
@dependencies = read_dependencies_yml(full_dependencies_path)
|
102
|
+
end
|
103
|
+
|
104
|
+
def create_logger
|
105
|
+
@logger = Skiima::Logger.new config.slice(:logging_out, :logging_level)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/lib/skiima/locales/en.yml
CHANGED
@@ -6,8 +6,8 @@ en:
|
|
6
6
|
|
7
7
|
messages:
|
8
8
|
errors:
|
9
|
-
|
10
|
-
|
9
|
+
open_db_yml: Could not open Skiima Database Config!
|
10
|
+
open_dependencies_yml: Could not open Skiima Dependencies Config!
|
11
11
|
create:
|
12
12
|
start: Creating objects for @class
|
13
13
|
error: Encountered errors creating @class objects -
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Skiima
|
3
|
+
class Logger
|
4
|
+
extend Forwardable
|
5
|
+
|
6
|
+
delegate debug: :logger
|
7
|
+
delegate info: :logger
|
8
|
+
delegate warn: :logger
|
9
|
+
delegate error: :logger
|
10
|
+
delegate fatal: :logger
|
11
|
+
|
12
|
+
attr_accessor :logger, :logging_out, :logging_level
|
13
|
+
|
14
|
+
def initialize(opts = {})
|
15
|
+
@logging_out = get_logger_out(opts[:logging_out])
|
16
|
+
@logging_level = get_logger_level(opts[:logging_level])
|
17
|
+
create_logger
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def get_logger_out(str)
|
23
|
+
case str
|
24
|
+
when /STDOUT/i then ::STDOUT
|
25
|
+
when /STDERR/i then ::STDERR
|
26
|
+
else File.join(root_path, str)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_logger_level(str)
|
31
|
+
case str
|
32
|
+
when '4', /fatal/i then ::Logger::FATAL
|
33
|
+
when '3', /error/i then ::Logger::ERROR
|
34
|
+
when '2', /warn/i then ::Logger::WARN
|
35
|
+
when '1', /info/i then ::Logger::INFO
|
36
|
+
when '0', /debug/i then ::Logger::DEBUG
|
37
|
+
else ::Logger::ERROR
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_logger
|
42
|
+
@logger = ::Logger.new(logging_out)
|
43
|
+
@logger.level = logging_level
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
module LoggerHelpers
|
49
|
+
def log_message(logger, msg)
|
50
|
+
logger.debug msg
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "skiima"
|
2
|
+
|
3
|
+
namespace :skiima do
|
4
|
+
|
5
|
+
desc "Runs Skiima.up for :default group in dependencies.yml"
|
6
|
+
task :up, [:skiima_env, :group] do
|
7
|
+
args.with_defaults(:skiima_env => 'development', :group => 'default')
|
8
|
+
Skiima.up(args.skiima_env.to_sym, args.group.to_sym)
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Runs Skiima.down for :default group in dependencies.yml"
|
12
|
+
task :down, [:skiima_env, :group] do
|
13
|
+
args.with_defaults(:skiima_env => 'development', :group => 'default')
|
14
|
+
Skiima.down(args.skiima_env.to_sym, args.group.to_sym)
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :test do
|
18
|
+
desc "Runs Skiima.up for :test group in dependencies.yml"
|
19
|
+
task :up, [:skiima_env, :group] do
|
20
|
+
args.with_defaults(:skiima_env => 'test', :group => 'test')
|
21
|
+
Skiima.up(args.skiima_env.to_sym, args.group.to_sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Runs Skiima.down for :test group in dependencies.yml"
|
25
|
+
task :test, [:skiima_env, :group] do
|
26
|
+
args.with_defaults(:skiima_env => 'test', :group => 'test')
|
27
|
+
Skiima.down(args.skiima_env.to_sym, args.group.to_sym)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/skiima/version.rb
CHANGED
data/skiima.gemspec
CHANGED
@@ -5,6 +5,7 @@ require "skiima/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "skiima"
|
7
7
|
s.version = Skiima::VERSION
|
8
|
+
|
8
9
|
s.authors = ["David Conner"]
|
9
10
|
s.email = ["dconner.pro@gmail.com"]
|
10
11
|
s.homepage = "http://github.com/dcunited001/skiima"
|
@@ -22,11 +23,10 @@ Gem::Specification.new do |s|
|
|
22
23
|
s.add_dependency "fast_gettext", '~> 0.6.0'
|
23
24
|
s.add_dependency "erubis", '~> 2.7.0'
|
24
25
|
|
25
|
-
s.add_development_dependency "bundler", '>= 1.
|
26
|
-
s.add_development_dependency "minitest", '~>
|
27
|
-
s.add_development_dependency "minitest-matchers", '~> 1.
|
28
|
-
s.add_development_dependency "mocha", '~> 0.
|
29
|
-
|
26
|
+
s.add_development_dependency "bundler", '>= 1.3.3'
|
27
|
+
s.add_development_dependency "minitest", '~> 4.6.2'
|
28
|
+
s.add_development_dependency "minitest-matchers", '~> 1.2.0'
|
29
|
+
s.add_development_dependency "mocha", '~> 0.13.2'
|
30
30
|
end
|
31
31
|
|
32
32
|
# Logging
|