skiima 0.1.000 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +11 -3
  4. data/Gemfile +12 -6
  5. data/Guardfile +13 -11
  6. data/LICENSE +20 -0
  7. data/Procfile.example +2 -0
  8. data/README.md +170 -23
  9. data/Rakefile +26 -22
  10. data/lib/skiima.rb +61 -240
  11. data/lib/skiima/config.rb +60 -0
  12. data/lib/skiima/config/struct.rb +87 -0
  13. data/lib/skiima/db/connector.rb +195 -0
  14. data/lib/skiima/db/connector/active_record.rb +11 -0
  15. data/lib/skiima/db/connector/active_record/base_connector.rb +34 -0
  16. data/lib/skiima/db/connector/active_record/mysql2_connector.rb +147 -0
  17. data/lib/skiima/db/connector/active_record/mysql_connector.rb +177 -0
  18. data/lib/skiima/db/connector/active_record/postgresql_connector.rb +39 -0
  19. data/lib/skiima/db/helpers/mysql.rb +230 -0
  20. data/lib/skiima/db/helpers/postgresql.rb +221 -0
  21. data/lib/skiima/db/resolver.rb +62 -0
  22. data/lib/skiima/dependency/reader.rb +55 -0
  23. data/lib/skiima/dependency/script.rb +63 -0
  24. data/lib/skiima/i18n.rb +24 -0
  25. data/lib/skiima/loader.rb +108 -0
  26. data/lib/skiima/locales/en.yml +2 -2
  27. data/lib/skiima/logger.rb +54 -0
  28. data/lib/skiima/railtie.rb +10 -0
  29. data/lib/skiima/railties/skiima.rake +31 -0
  30. data/lib/skiima/version.rb +2 -2
  31. data/skiima.gemspec +5 -5
  32. data/spec/config/{database.yml → database.yml.example} +16 -0
  33. data/spec/config/database.yml.travis +69 -0
  34. data/spec/db/skiima/{depends.yml → dependencies.yml} +7 -2
  35. data/spec/db/skiima/{empty_depends.yml → empty_dependencies.yml} +0 -0
  36. data/spec/db/skiima/init_test_db/database.skiima_test.mysql.current.sql +7 -0
  37. data/spec/db/skiima/init_test_db/database.skiima_test.postgresql.current.sql +7 -0
  38. data/spec/mysql2_spec.rb +61 -12
  39. data/spec/mysql_spec.rb +66 -27
  40. data/spec/postgresql_spec.rb +55 -34
  41. data/spec/shared_examples/config_shared_example.rb +40 -0
  42. data/spec/skiima/config/struct_spec.rb +78 -0
  43. data/spec/skiima/config_spec.rb +6 -0
  44. data/spec/skiima/db/connector/active_record/base_connector_spec.rb +0 -0
  45. data/spec/skiima/db/connector/active_record/mysql2_connector_spec.rb +3 -0
  46. data/spec/skiima/db/connector/active_record/mysql_connector_spec.rb +3 -0
  47. data/spec/skiima/db/connector/active_record/postgresql_connector_spec.rb +7 -0
  48. data/spec/skiima/db/connector_spec.rb +6 -0
  49. data/spec/skiima/db/resolver_spec.rb +54 -0
  50. data/spec/skiima/dependency/reader_spec.rb +52 -0
  51. data/spec/skiima/{dependency_spec.rb → dependency/script_spec.rb} +3 -41
  52. data/spec/skiima/i18n_spec.rb +29 -0
  53. data/spec/skiima/loader_spec.rb +102 -0
  54. data/spec/skiima/logger_spec.rb +0 -0
  55. data/spec/skiima_spec.rb +43 -64
  56. data/spec/spec_helper.rb +38 -4
  57. metadata +144 -100
  58. data/lib/skiima/db_adapters.rb +0 -187
  59. data/lib/skiima/db_adapters/base_mysql_adapter.rb +0 -308
  60. data/lib/skiima/db_adapters/mysql2_adapter.rb +0 -114
  61. data/lib/skiima/db_adapters/mysql_adapter.rb +0 -287
  62. data/lib/skiima/db_adapters/postgresql_adapter.rb +0 -509
  63. data/lib/skiima/dependency.rb +0 -84
  64. data/lib/skiima_helpers.rb +0 -49
  65. data/spec/skiima/db_adapters/mysql_adapter_spec.rb +0 -38
  66. data/spec/skiima/db_adapters/postgresql_adapter_spec.rb +0 -20
  67. 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
@@ -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
@@ -6,8 +6,8 @@ en:
6
6
 
7
7
  messages:
8
8
  errors:
9
- open_db_yaml: Could not open Skiima Database Config!
10
- open_depends_yaml: Could not open Skiima Depends Config!
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,10 @@
1
+ require "skiima"
2
+ require "rails"
3
+
4
+ module Skiima
5
+ class Railtie < Rails::Railtie
6
+ rake_tasks do
7
+ load "skiima/railties/skiima.rake"
8
+ end
9
+ end
10
+ end
@@ -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
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Skiima
3
- VERSION = "0.1.000"
4
- end
3
+ VERSION = "0.2.2"
4
+ end
@@ -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.0.21'
26
- s.add_development_dependency "minitest", '~> 2.9.1'
27
- s.add_development_dependency "minitest-matchers", '~> 1.1.3'
28
- s.add_development_dependency "mocha", '~> 0.10.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