basiszwo-reflection 0.5.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.
Files changed (72) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/.yardoc +0 -0
  4. data/History.rdoc +21 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +117 -0
  7. data/Rakefile +75 -0
  8. data/Reflection.gemspec +135 -0
  9. data/TODO.rdoc +38 -0
  10. data/VERSION +1 -0
  11. data/bin/reflection +5 -0
  12. data/doc/Reflection/CLI.html +153 -0
  13. data/doc/Reflection/Command/Apply.html +266 -0
  14. data/doc/Reflection/Command/Base.html +385 -0
  15. data/doc/Reflection/Command/Stash.html +342 -0
  16. data/doc/Reflection/Command.html +85 -0
  17. data/doc/Reflection/Config.html +902 -0
  18. data/doc/Reflection/ConfigArgumentError.html +92 -0
  19. data/doc/Reflection/Directory/Base.html +657 -0
  20. data/doc/Reflection/Directory/Stash.html +411 -0
  21. data/doc/Reflection/Directory.html +85 -0
  22. data/doc/Reflection/Rails.html +409 -0
  23. data/doc/Reflection/Repository.html +745 -0
  24. data/doc/Reflection/Support/Home.html +182 -0
  25. data/doc/Reflection/Support/Log.html +222 -0
  26. data/doc/Reflection/Support.html +141 -0
  27. data/doc/Reflection/Validations.html +135 -0
  28. data/doc/Reflection.html +285 -0
  29. data/doc/_index.html +267 -0
  30. data/doc/class_list.html +197 -0
  31. data/doc/css/common.css +1 -0
  32. data/doc/css/full_list.css +23 -0
  33. data/doc/css/style.css +261 -0
  34. data/doc/file.README.html +200 -0
  35. data/doc/file_list.html +29 -0
  36. data/doc/index.html +200 -0
  37. data/doc/js/app.js +91 -0
  38. data/doc/js/full_list.js +39 -0
  39. data/doc/js/jquery.js +19 -0
  40. data/doc/method_list.html +572 -0
  41. data/doc/top-level-namespace.html +80 -0
  42. data/lib/reflection/cli.rb +35 -0
  43. data/lib/reflection/command/apply.rb +71 -0
  44. data/lib/reflection/command/base.rb +28 -0
  45. data/lib/reflection/command/stash.rb +64 -0
  46. data/lib/reflection/command.rb +7 -0
  47. data/lib/reflection/config.rb +139 -0
  48. data/lib/reflection/directory/base.rb +58 -0
  49. data/lib/reflection/directory/stash.rb +30 -0
  50. data/lib/reflection/directory.rb +6 -0
  51. data/lib/reflection/rails/database.rb +96 -0
  52. data/lib/reflection/rails.rb +40 -0
  53. data/lib/reflection/repository.rb +71 -0
  54. data/lib/reflection/support/home.rb +17 -0
  55. data/lib/reflection/support/log.rb +20 -0
  56. data/lib/reflection/support.rb +12 -0
  57. data/lib/reflection/validations.rb +23 -0
  58. data/lib/reflection.rb +32 -0
  59. data/spec/reflection/cli_spec.rb +41 -0
  60. data/spec/reflection/command/stash_spec.rb +104 -0
  61. data/spec/reflection/config_spec.rb +126 -0
  62. data/spec/reflection/directory/base_spec.rb +38 -0
  63. data/spec/reflection/directory/stash_spec.rb +39 -0
  64. data/spec/reflection/rails/database_spec.rb +161 -0
  65. data/spec/reflection/rails_spec.rb +62 -0
  66. data/spec/reflection/repository_spec.rb +71 -0
  67. data/spec/reflection/support/home_spec.rb +30 -0
  68. data/spec/reflection/support_spec.rb +4 -0
  69. data/spec/reflection_spec.rb +21 -0
  70. data/spec/spec.opts +1 -0
  71. data/spec/spec_helper.rb +15 -0
  72. metadata +157 -0
@@ -0,0 +1,71 @@
1
+ module Reflection
2
+ module Command
3
+ class Apply < Reflection::Command::Base
4
+
5
+ def validate!
6
+ validate.existence_of config.directory
7
+ if config.rails_root
8
+ validate.existence_of config.rails_root
9
+ Reflection::Rails.validate_environment(config)
10
+ end
11
+ end
12
+
13
+ def run!
14
+ stash_directory = Directory::Stash.new(Reflection::Repository.new(config.repository), 'apply')
15
+ target_directory = Directory::Base.new(config.directory)
16
+
17
+ unless config.force
18
+ get_user_approval_for_cleaning_target(target_directory)
19
+ get_user_approval_for_apply_database_dump if config.rails_root
20
+ end
21
+
22
+ verify_that_target_is_not_a_repository(target_directory)
23
+
24
+ Reflection.log.info "Applying '#{config.repository}' >> '#{config.directory}'.."
25
+
26
+ target_directory.clean!
27
+
28
+ if stash_directory.exists?
29
+ stash_directory.validate_repository
30
+ stash_directory.copy_git_index_to(target_directory.path)
31
+ repo = Repository.new_from_path(target_directory.path)
32
+ repo.reset!
33
+ repo.pull
34
+ stash_directory.get_git_index_from(target_directory.path)
35
+ else
36
+ stash_directory.clone_repository
37
+ stash_directory.move_content_to(target_directory.path)
38
+ # stash_directory.get_git_index_from(target_directory.path)
39
+ end
40
+
41
+ Reflection::Rails.apply(config, target_directory)
42
+ Reflection.log.info "Apply Command done."
43
+ end
44
+
45
+
46
+ private
47
+
48
+ def get_user_approval_for_cleaning_target(target_directory)
49
+ puts "\nIn order to get a fresh copy of your files, "
50
+ puts "Reflection will have to remove all files under '#{target_directory.path}'."
51
+ puts "If you are sure, hit <enter> to proceed.."
52
+
53
+ unless STDIN.getc == 10
54
+ puts "Aborting.."
55
+ exit
56
+ end
57
+ end
58
+
59
+ def get_user_approval_for_apply_database_dump
60
+ puts "\nCaution: You've enabled Rails database dumping/applying."
61
+ puts "In order to apply a fresh dump, Reflection will override your database."
62
+ puts "If you are sure, hit <enter> to proceed.."
63
+
64
+ unless STDIN.getc == 10
65
+ puts "Aborting.."
66
+ exit
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,28 @@
1
+ module Reflection
2
+ module Command
3
+ class Base
4
+ attr_accessor :config
5
+
6
+ def self.run!(config)
7
+ command = self.new(config)
8
+ command.validate! if command.respond_to?(:validate!)
9
+ command.run!
10
+ end
11
+
12
+ def initialize(new_config)
13
+ self.config = new_config
14
+ end
15
+
16
+ def validate
17
+ Reflection::Validations
18
+ end
19
+
20
+ def verify_that_target_is_not_a_repository(target_directory)
21
+ if Repository.exists?(target_directory.path)
22
+ Support.exit_with_error "The specified --directory is a repository. Reflection is afraid of breaking something, so it won't touch it. Pleace specify another one.."
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,64 @@
1
+ module Reflection
2
+ module Command
3
+ class Stash < Reflection::Command::Base
4
+
5
+ def validate!
6
+ validate.existence_of config.directory
7
+ if config.rails_root
8
+ validate.existence_of config.rails_root
9
+ Reflection::Rails.validate_environment(config)
10
+ end
11
+ end
12
+
13
+ def run!
14
+ Reflection.log.info "Stashing '#{config.directory}'.."
15
+
16
+ stash_directory = Directory::Stash.new(Reflection::Repository.new(config.repository), 'stash')
17
+ target_directory = Directory::Base.new(config.directory)
18
+
19
+ verify_that_target_is_not_a_repository(target_directory)
20
+
21
+ prepare_stash_repository(stash_directory)
22
+ stash_directory_into_repository(stash_directory, target_directory)
23
+
24
+ Reflection.log.info "Stash Command done."
25
+ end
26
+
27
+ def prepare_stash_repository(stash_directory)
28
+ Reflection.log.debug "Preparing stash repository.."
29
+
30
+ if stash_directory.exists?
31
+ stash_directory.validate_repository
32
+ else
33
+ stash_directory.clone_repository
34
+ end
35
+ end
36
+
37
+ def stash_directory_into_repository(stash_directory, target_directory)
38
+ move_stash_repository_git_index_to_target(stash_directory.git_index, target_directory.path)
39
+ Reflection::Rails.stash(config, target_directory) if config.rails_root
40
+ commit_and_push_files(target_directory.path, target_directory.name)
41
+ move_stash_repository_git_index_back(target_directory.git_index, stash_directory.path)
42
+ Reflection::Rails.clean_target(config, target_directory) if config.rails_root
43
+ end
44
+
45
+
46
+ private
47
+
48
+ def move_stash_repository_git_index_to_target(source, target)
49
+ %x(mv #{source} #{target})
50
+ end
51
+
52
+ def commit_and_push_files(repository_path, target)
53
+ repository = Repository.new_from_path(repository_path)
54
+ repository.commit_all_new_files
55
+ repository.push
56
+ end
57
+
58
+ def move_stash_repository_git_index_back(source, target)
59
+ %x(mv #{source} #{target})
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,7 @@
1
+ module Reflection
2
+ module Command
3
+ autoload :Apply, 'reflection/command/apply'
4
+ autoload :Base, 'reflection/command/base'
5
+ autoload :Stash, 'reflection/command/stash'
6
+ end
7
+ end
@@ -0,0 +1,139 @@
1
+ require 'optparse'
2
+ require 'ostruct'
3
+ require 'yaml'
4
+
5
+ module Reflection
6
+
7
+ class ConfigArgumentError < StandardError; end
8
+
9
+ class Config
10
+
11
+ attr_accessor :command
12
+ attr_accessor :directory
13
+ attr_accessor :repository
14
+ attr_accessor :rails_root
15
+ attr_accessor :rails_environment
16
+ attr_accessor :store_configuration_path
17
+ attr_accessor :verbose
18
+ attr_accessor :force
19
+
20
+ def self.parse(args = [])
21
+ config = Config.new
22
+ case
23
+ when !args.empty? && File.exists?(args.first)
24
+ config.read!(args.first)
25
+ when !args.empty?
26
+ config.parse_command_line_options(args)
27
+ config.write(config.store_configuration_path) if config.store_configuration_path
28
+ else
29
+ config.read!(File.join(Dir.pwd, 'reflection.yml'))
30
+ end
31
+ config
32
+ end
33
+
34
+ def to_hash
35
+ {
36
+ :command => self.command,
37
+ :directory => self.directory,
38
+ :repository => self.repository,
39
+ :rails_root => self.rails_root,
40
+ :rails_environment => self.rails_environment,
41
+ :verbose => self.verbose,
42
+ :force => self.force
43
+ }
44
+ end
45
+
46
+ def from_hash(hash)
47
+ self.command = hash[:command]
48
+ self.directory = hash[:directory]
49
+ self.repository = hash[:repository]
50
+ self.rails_root = hash[:rails_root]
51
+ self.rails_environment = hash[:rails_environment]
52
+ self.verbose = Reflection.verbose = hash[:verbose]
53
+ self.force = hash[:force]
54
+ end
55
+
56
+ def write(path)
57
+ begin
58
+ io = File.open(path, 'w')
59
+ YAML.dump(self.to_hash, io)
60
+ io.close
61
+ rescue => e
62
+ Reflection::Support.exit_with_error("Writing of config file to '#{path}' failed: #{e.message}")
63
+ end
64
+ end
65
+
66
+ def read!(path)
67
+ begin
68
+ if File.exist?(path)
69
+ options = YAML.load_file(path)
70
+ raise(Reflection::ConfigArgumentError, "Config file is invalid.") unless options.is_a?(Hash)
71
+ self.from_hash(options)
72
+ end
73
+ rescue => e
74
+ Reflection::Support.exit_with_error("Parsing of config file '#{path}' failed: #{e.message}")
75
+ end
76
+ end
77
+
78
+ def parse_command_line_options(args)
79
+ opt_parser = OptionParser.new do |opts|
80
+ opts.banner = "Usage: reflection --COMMAND --repository=GIT_REPO --directory=PATH\n"
81
+ opts.banner << " -or-\n"
82
+ opts.banner << "Usage: reflection /path/to/reflection-config-file.yml"
83
+
84
+ opts.separator " "
85
+ opts.separator "On the server side:"
86
+
87
+ opts.on("-s", "--stash", "Store your assets and/or a database dump in a git-repository.") do |stash|
88
+ self.command = :stash
89
+ end
90
+
91
+ opts.separator "On the client side:"
92
+ opts.on("-a", "--apply", "Apply assets and/or a database dump loaded from a git-repository.") do |apply|
93
+ self.command = :apply
94
+ end
95
+
96
+ opts.separator " "
97
+ opts.separator "Required options for both:"
98
+ opts.on("-r", "--repository GIT_URL", "A Git repository(url) to be used as storage") do |repository|
99
+ self.repository = repository
100
+ end
101
+
102
+ opts.on("-d", "--directory PATH", "Path to your asset directory") do |directory|
103
+ self.directory = directory
104
+ end
105
+
106
+ opts.separator " "
107
+ opts.separator "Additional options for both:"
108
+
109
+ opts.on("--rails [RAILS_ROOT]", "Enable dumping/applying of a Rails managed MySQL database") do |path|
110
+ self.rails_root = path || nil
111
+ end
112
+
113
+ opts.on("--rails-env [ENV]", "Rails environment to instrument") do |environment|
114
+ self.rails_environment = environment || nil
115
+ end
116
+
117
+ opts.on("--write [FILE]", "Create a configuration FILE from the current commandline options") do |config_file_path|
118
+ self.store_configuration_path = config_file_path if config_file_path
119
+ end
120
+
121
+ opts.on("--force", "Hide tedious warnings") do
122
+ self.force = true
123
+ end
124
+
125
+ opts.on("-v", "--verbose", "Include debug information in output") do
126
+ self.verbose = true
127
+ Reflection.verbose = true
128
+ end
129
+
130
+ opts.on("--version", "Show version") do
131
+ self.command = :show_version
132
+ end
133
+ end
134
+
135
+ opt_parser.parse!(args)
136
+ end
137
+
138
+ end
139
+ end
@@ -0,0 +1,58 @@
1
+ module Reflection
2
+ module Directory
3
+ class Base
4
+
5
+ attr_accessor :path
6
+
7
+ def initialize(new_path)
8
+ self.path = new_path
9
+ end
10
+
11
+ def to_s
12
+ self.path
13
+ end
14
+
15
+ def exists?
16
+ File.exist?(self.path)
17
+ end
18
+
19
+ def clean!
20
+ Reflection.log.debug "Cleaning #{self.path}/.."
21
+ %x(rm -r #{self.path}/*)
22
+ end
23
+
24
+ def parent
25
+ Base.new(File.expand_path(self.path.split('/')[0..-2].join('/')))
26
+ end
27
+
28
+ def name
29
+ self.path.split('/').last
30
+ end
31
+
32
+ def git_index
33
+ File.expand_path(File.join(self.path, '.git'))
34
+ end
35
+
36
+ def copy_git_index_to(target_path)
37
+ Reflection.log.debug "Copying git-index '#{self.git_index}' to #{target_path}"
38
+ %x(cp -R #{self.git_index} #{target_path})
39
+ end
40
+
41
+ def get_git_index_from(target_path)
42
+ Reflection.log.debug "Getting git-index from #{target_path}"
43
+
44
+ %x(rm -rf #{self.git_index}) if File.exists?(self.git_index)
45
+ %x(mkdir -p #{self.path})
46
+ %x(mv -f #{File.join(target_path, '/.git')} #{File.join(self.path, "/")})
47
+ end
48
+
49
+ def move_content_to(target_path)
50
+ Reflection.log.debug "Moving content to '#{target_path}'.."
51
+ %x(mv #{File.join(self.path, '/*')} #{File.join(target_path, '/')})
52
+ # %x(cp -R #{File.join(self.path, '/.')} #{target_path})
53
+ # %x(rm -rf #{self.path})
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,30 @@
1
+ module Reflection
2
+ module Directory
3
+ class Stash < Directory::Base
4
+
5
+ attr_accessor :repository
6
+
7
+ def initialize(repository, identifier_prefix)
8
+ @repository = repository
9
+ @identifier_prefix = identifier_prefix
10
+ end
11
+
12
+ def path
13
+ @path = File.join(Reflection.home.path, @identifier_prefix, repository.identifier)
14
+ end
15
+
16
+ def validate_repository
17
+ if Reflection::Repository.exists?(self.path) && !@repository.same_in_path?(self.path)
18
+ Reflection::Support.exit_with_error "The stash directory '#{self.path}' is a repository, but not the one you specified (--repository)."
19
+ else
20
+ Reflection.log.debug "Directory '#{self.path}' valid."
21
+ end
22
+ end
23
+
24
+ def clone_repository
25
+ Reflection.log.debug "Cloning repository '#{self.repository.url}' to '#{self.path}'"
26
+ @repository.clone(self.path)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ module Reflection
2
+ module Directory
3
+ autoload :Base, 'reflection/directory/base'
4
+ autoload :Stash, 'reflection/directory/stash'
5
+ end
6
+ end
@@ -0,0 +1,96 @@
1
+ module Reflection
2
+ module Rails
3
+ class Database
4
+
5
+ attr_accessor :configuration
6
+ attr_accessor :environment
7
+ attr_accessor :rails_root
8
+
9
+ def initialize(new_rails_root, new_environment)
10
+ self.rails_root = new_rails_root
11
+ self.environment = new_environment
12
+ self.configuration = read_configuration_yml
13
+ end
14
+
15
+ def dump_to_directory(target_directory)
16
+ Reflection.log.debug "dumping database.."
17
+ run "mysqldump #{command_line_options} --skip-lock-tables > #{dump_file_path(target_directory)}"
18
+ end
19
+
20
+ def load_dump_from_file(target_directory)
21
+ Reflection.log.debug "Loading dump.."
22
+ run("mysql #{command_line_options(:no_rehash => true)} < #{dump_file_path(target_directory)}")
23
+ end
24
+
25
+ def clean_dump_file(target_directory)
26
+ dump_file = dump_file_path(target_directory)
27
+ if File.exist?(dump_file)
28
+ run "rm #{dump_file}"
29
+ end
30
+ end
31
+
32
+ def recreate!
33
+ Reflection.log.debug "Recreating database.."
34
+ drop
35
+ create
36
+ end
37
+
38
+ def create
39
+ run("echo \"CREATE DATABASE #{self.configuration['database']};\" | mysql #{command_line_options(:skip => :database)}")
40
+ end
41
+
42
+ def drop
43
+ run("echo \"DROP DATABASE #{self.configuration['database']};\" | mysql #{command_line_options(:skip => :database)}")
44
+ end
45
+
46
+ def migrate!
47
+ Reflection.log.debug "Migrating database.."
48
+ run("(cd #{self.rails_root} && RAILS_ENV=#{self.environment} rake db:migrate)")
49
+ end
50
+
51
+ def read_configuration_yml
52
+ begin
53
+ if configuration = YAML.load_file(database_config_file_path)[self.environment]
54
+ return configuration
55
+ else
56
+ return Support.exit_with_error("Rails database configuration for '#{self.environment}' isn't available in #{database_config_file_path}")
57
+ end
58
+ rescue => e
59
+ return Support.exit_with_error("Error while parsing Rails database configuration: #{e}")
60
+ end
61
+ end
62
+
63
+ def command_line_options(opts = {})
64
+ options = []
65
+ options << "-A" if opts[:no_rehash] && opts[:no_rehash] == true
66
+ options << "-h #{configuration['host']}" if configuration['host'] && !configuration['host'].empty?
67
+ options << "-u#{configuration['username']}"
68
+ options << "-p#{configuration['password']}" if configuration['password'] && !configuration['password'].empty?
69
+ options << "#{configuration['database']}" unless opts[:skip] && opts[:skip] == :database
70
+ options.join(' ')
71
+ end
72
+
73
+ def run(command)
74
+ # Reflection.log.debug "-- #{command}"
75
+ %x(#{command})
76
+ end
77
+
78
+
79
+ private
80
+
81
+ def log_error_and_return_false(message)
82
+ Reflection.log.error(message)
83
+ return false
84
+ end
85
+
86
+ def database_config_file_path
87
+ @database_config_file_path ||= File.join(self.rails_root, "config/database.yml")
88
+ end
89
+
90
+ def dump_file_path(directory)
91
+ File.join(directory, "_rails_database_dump.sql")
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,40 @@
1
+ module Reflection
2
+ module Rails
3
+
4
+ autoload :Database, 'reflection/rails/database'
5
+
6
+ class << self
7
+
8
+ def validate_environment(config)
9
+ env_file_path = File.join(config.rails_root, 'config/environments', "#{config.rails_environment}.rb")
10
+ unless File.exist?(env_file_path)
11
+ Reflection::Support.exit_with_error("Rails environment '#{config.rails_environment}' doesn't exist in #{env_file_path}.")
12
+ end
13
+ end
14
+
15
+ # TODO:
16
+ # Method is obsolete and has moved to Rails::Database
17
+ # Cannot be removed atm because Command::Stash depends on it
18
+ def clean_target(config, target_directory)
19
+ database = Database.new(config.rails_root, config.rails_environment)
20
+ database.clean_dump_file(target_directory.path)
21
+ end
22
+
23
+ def stash(config, target_directory)
24
+ Reflection.log.debug "Stashing database dump.."
25
+ database = Database.new(config.rails_root, config.rails_environment)
26
+ database.dump_to_directory(target_directory.path)
27
+ end
28
+
29
+ def apply(config, target_directory)
30
+ Reflection.log.debug "Applying database dump.."
31
+ database = Database.new(config.rails_root, config.rails_environment)
32
+ database.recreate!
33
+ database.load_dump_from_file(target_directory.path)
34
+ database.clean_dump_file(target_directory.path)
35
+ database.migrate!
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,71 @@
1
+ require 'digest/md5'
2
+ require 'git'
3
+
4
+ module Reflection
5
+ class Repository
6
+
7
+ attr_accessor :url
8
+ attr_accessor :path
9
+
10
+ def self.new_from_path(path)
11
+ unless self.exists?(path)
12
+ raise "'#{path}' is not a valid Git repository"
13
+ end
14
+
15
+ repo = Git.open(path)
16
+ self.new(repo.remote.url, path)
17
+ end
18
+
19
+ def self.exists?(path)
20
+ begin
21
+ Git.open(path)
22
+ rescue ArgumentError
23
+ return false
24
+ end
25
+ end
26
+
27
+ def initialize(new_url, path = nil)
28
+ self.url = new_url
29
+ self.path = path
30
+ end
31
+
32
+ def identifier
33
+ Digest::MD5.hexdigest(self.url)
34
+ end
35
+
36
+ def same_in_path?(path)
37
+ git_repo = Git.open(path)
38
+ (git_repo.remote && git_repo.remote.url == self.url) || false
39
+ end
40
+
41
+ def reset!
42
+ Reflection.log.debug "Resetting target to HEAD"
43
+ repo = Git.open(self.path)
44
+ repo.reset_hard
45
+ end
46
+
47
+ def clone(path)
48
+ Git.clone(self.url, path)
49
+ end
50
+
51
+ def commit_all_new_files
52
+ repo = Git.open(self.path)
53
+ Reflection.log.debug "Committing all changes.."
54
+ Reflection.log.debug(repo.add)
55
+ Reflection.log.debug(repo.commit_all("Updated stash.")) rescue true
56
+ end
57
+
58
+ def push
59
+ # repo = Git.open(self.path)
60
+ Reflection.log.debug "Pushing commit.."
61
+ Reflection.log.debug(%x((cd #{self.path} && git push --force)))
62
+ # Reflection.log.debug(repo.push)
63
+ end
64
+
65
+ def pull
66
+ Reflection.log.debug "Pulling in #{self.path}.."
67
+ Reflection.log.debug(%x((cd #{self.path} && git pull --rebase)))
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,17 @@
1
+ module Reflection
2
+ module Support
3
+ class Home
4
+
5
+ def path
6
+ @path ||= File.expand_path(File.join(ENV['HOME'], '.reflection'))
7
+ end
8
+
9
+ def create
10
+ unless File.exist?(self.path)
11
+ Dir.mkdir(self.path)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Reflection
2
+ module Support
3
+ class Log
4
+
5
+ attr_accessor :verbose
6
+
7
+ def debug(message)
8
+ puts "** #{message}" if Reflection.verbose == true && message && !message.empty?
9
+ end
10
+
11
+ def info(message)
12
+ puts "** #{message}" if message && !message.empty?
13
+ end
14
+
15
+ def error(message)
16
+ puts "!! #{message}" if message && !message.empty?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ module Reflection
2
+ module Support
3
+
4
+ autoload :Home, 'reflection/support/home'
5
+ autoload :Log, 'reflection/support/log'
6
+
7
+ def self.exit_with_error(message)
8
+ Reflection.log.error message
9
+ exit(1)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module Reflection
2
+ module Validations
3
+ class << self
4
+
5
+ def existence_of(path)
6
+ if File.exist?(path)
7
+ return true
8
+ else
9
+ Reflection::Support.exit_with_error "Option validation failed: #{path} does not exist."
10
+ end
11
+ end
12
+
13
+ # def presense_of(option)
14
+ # if !option.nil? && !option.empty?
15
+ # return true
16
+ # else
17
+ # exit_with_error "Option validation failed: "
18
+ # end
19
+ # end
20
+
21
+ end
22
+ end
23
+ end