whiskey_disk 0.6.22 → 0.6.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. data/CHANGELOG +25 -15
  2. data/README.integration_specs +24 -36
  3. data/README.markdown +112 -96
  4. data/Rakefile +79 -5
  5. data/VERSION +1 -1
  6. data/lib/whiskey_disk.rb +297 -294
  7. data/lib/whiskey_disk/config.rb +99 -168
  8. data/lib/whiskey_disk/config/abstract_filter.rb +19 -0
  9. data/lib/whiskey_disk/config/filter.rb +48 -0
  10. data/lib/whiskey_disk/config/filters/add_environment_name_filter.rb +11 -0
  11. data/lib/whiskey_disk/config/filters/add_project_name_filter.rb +11 -0
  12. data/lib/whiskey_disk/config/filters/check_for_duplicate_domains_filter.rb +21 -0
  13. data/lib/whiskey_disk/config/filters/convert_role_strings_to_list_filter.rb +20 -0
  14. data/lib/whiskey_disk/config/filters/default_config_target_filter.rb +12 -0
  15. data/lib/whiskey_disk/config/filters/default_domain_filter.rb +12 -0
  16. data/lib/whiskey_disk/config/filters/drop_empty_domain_roles_filter.rb +32 -0
  17. data/lib/whiskey_disk/config/filters/environment_scope_filter.rb +20 -0
  18. data/lib/whiskey_disk/config/filters/hashify_domain_entries_filter.rb +29 -0
  19. data/lib/whiskey_disk/config/filters/localize_domains_filter.rb +24 -0
  20. data/lib/whiskey_disk/config/filters/modules/scope_helper.rb +11 -0
  21. data/lib/whiskey_disk/config/filters/normalize_ssh_options_filter.rb +29 -0
  22. data/lib/whiskey_disk/config/filters/project_scope_filter.rb +34 -0
  23. data/lib/whiskey_disk/config/filters/select_project_and_environment_filter.rb +12 -0
  24. data/lib/whiskey_disk/config/filters/stringify_hash_keys_filter.rb +25 -0
  25. data/lib/whiskey_disk/helpers.rb +1 -1
  26. data/lib/whiskey_disk/rake.rb +25 -22
  27. data/scenarios/git_repositories/config.git/HEAD +1 -0
  28. data/scenarios/git_repositories/config.git/config +5 -0
  29. data/scenarios/git_repositories/config.git/description +1 -0
  30. data/scenarios/git_repositories/config.git/git-daemon-export-ok +0 -0
  31. data/scenarios/git_repositories/config.git/hooks/applypatch-msg.sample +15 -0
  32. data/scenarios/git_repositories/config.git/hooks/commit-msg.sample +24 -0
  33. data/scenarios/git_repositories/config.git/hooks/post-commit.sample +8 -0
  34. data/scenarios/git_repositories/config.git/hooks/post-receive.sample +15 -0
  35. data/scenarios/git_repositories/config.git/hooks/post-update.sample +8 -0
  36. data/scenarios/git_repositories/config.git/hooks/pre-applypatch.sample +14 -0
  37. data/scenarios/git_repositories/config.git/hooks/pre-commit.sample +46 -0
  38. data/scenarios/git_repositories/config.git/hooks/pre-rebase.sample +169 -0
  39. data/scenarios/git_repositories/config.git/hooks/prepare-commit-msg.sample +36 -0
  40. data/scenarios/git_repositories/config.git/hooks/update.sample +128 -0
  41. data/scenarios/git_repositories/config.git/info/exclude +6 -0
  42. data/scenarios/git_repositories/config.git/objects/0d/b14dd6ddc54017c0a11960dcda82ed802cde69 +0 -0
  43. data/scenarios/git_repositories/config.git/objects/0e/e781f5ce80d64db32a74a7aae7b5248dafe112 +3 -0
  44. data/scenarios/git_repositories/config.git/objects/17/6bf54cf17d1d1c24556dc059c4144a5df230e8 +0 -0
  45. data/scenarios/git_repositories/config.git/objects/20/e9ff3feaa8ede30f707e5f1b4356e3c02bb7ec +0 -0
  46. data/scenarios/git_repositories/config.git/objects/45/117b1c775f0de415478dbf08ed9d667ab17d13 +0 -0
  47. data/scenarios/git_repositories/config.git/objects/51/3954c9aca090e6ce40359f0e9fde30ea78eb8c +0 -0
  48. data/scenarios/git_repositories/config.git/objects/66/947a7a11a6f5d3d561fe95de284ced3010819a +0 -0
  49. data/scenarios/git_repositories/config.git/objects/6b/bc79311bfac47d3ed724aa82a4814e0dda4c67 +0 -0
  50. data/scenarios/git_repositories/config.git/objects/71/eb5df52676e8e6efba471050b46978173af110 +1 -0
  51. data/scenarios/git_repositories/config.git/objects/84/17d2fe3e8fcc0825249c517b29b0f9ea8b8b31 +2 -0
  52. data/scenarios/git_repositories/config.git/objects/8b/384fcfcf7c0dee7c3c1d5636bee9e645d9cf38 +0 -0
  53. data/scenarios/git_repositories/config.git/objects/bb/59da633ba74296b0c2f9ff70784ac155ddb599 +0 -0
  54. data/scenarios/git_repositories/config.git/objects/cc/b86b26189afbf45d8eb9165812ab86dbdfca63 +0 -0
  55. data/scenarios/git_repositories/config.git/objects/d1/0bcd51fec41f854001e4d61f99d9e282a695d3 +0 -0
  56. data/scenarios/git_repositories/config.git/objects/d8/a8b0f5b1fd66844efb141d9544965ea0065f2d +0 -0
  57. data/scenarios/git_repositories/config.git/objects/e6/b02c66ad632e6b8535c4630cb8fe07732a72fc +0 -0
  58. data/scenarios/git_repositories/config.git/objects/e8/b8bfeeba735c0a1a873082554cb4d7256ac125 +0 -0
  59. data/scenarios/git_repositories/config.git/objects/f9/0181466a1a60b793ca9cc9abd584c18d4e3887 +0 -0
  60. data/scenarios/git_repositories/config.git/objects/f9/49d5d8a4f12c91471e34d4e277239c35ebd10d +0 -0
  61. data/scenarios/git_repositories/config.git/refs/heads/master +1 -0
  62. data/scenarios/git_repositories/project.git/HEAD +1 -0
  63. data/scenarios/git_repositories/project.git/config +5 -0
  64. data/scenarios/git_repositories/project.git/description +1 -0
  65. data/scenarios/git_repositories/project.git/git-daemon-export-ok +0 -0
  66. data/scenarios/git_repositories/project.git/hooks/applypatch-msg.sample +15 -0
  67. data/scenarios/git_repositories/project.git/hooks/commit-msg.sample +24 -0
  68. data/scenarios/git_repositories/project.git/hooks/post-commit.sample +8 -0
  69. data/scenarios/git_repositories/project.git/hooks/post-receive.sample +15 -0
  70. data/scenarios/git_repositories/project.git/hooks/post-update.sample +8 -0
  71. data/scenarios/git_repositories/project.git/hooks/pre-applypatch.sample +14 -0
  72. data/scenarios/git_repositories/project.git/hooks/pre-commit.sample +46 -0
  73. data/scenarios/git_repositories/project.git/hooks/pre-rebase.sample +169 -0
  74. data/scenarios/git_repositories/project.git/hooks/prepare-commit-msg.sample +36 -0
  75. data/scenarios/git_repositories/project.git/hooks/update.sample +128 -0
  76. data/scenarios/git_repositories/project.git/info/exclude +6 -0
  77. data/scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172 +0 -0
  78. data/scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757 +1 -0
  79. data/scenarios/git_repositories/project.git/objects/06/13fe277280cbcdb2856e1eefc70bdaff011b20 +0 -0
  80. data/scenarios/git_repositories/project.git/objects/06/7aca89b86265eee211387434c3e50f37ccf009 +0 -0
  81. data/scenarios/git_repositories/project.git/objects/09/445dacc4822722612d60833c9948219ecdd8f5 +0 -0
  82. data/scenarios/git_repositories/project.git/objects/11/c4ec64326de35462f4e79d0f4229bf8e26e0c5 +0 -0
  83. data/scenarios/git_repositories/project.git/objects/20/1c7641c2e42b0b904e5c1f793489d8b858e4da +2 -0
  84. data/scenarios/git_repositories/project.git/objects/23/979639da60d2d31e9744468df1c1221b101e64 +0 -0
  85. data/scenarios/git_repositories/project.git/objects/27/a3fff2c4c45ab5513a405f694c0a042cb5d417 +1 -0
  86. data/scenarios/git_repositories/project.git/objects/2c/0c33cfba8e1af15df88522c0db2b10a6a94138 +2 -0
  87. data/scenarios/git_repositories/project.git/objects/38/b574660305ecb5fec6b2daa7ee1e0dbf1b6003 +0 -0
  88. data/scenarios/git_repositories/project.git/objects/4a/57abb5e4e426cfc9101b3af22ac83ccbd8e2ad +0 -0
  89. data/scenarios/git_repositories/project.git/objects/4c/77ebdd985e57afe7988480720c5dc77ec525c9 +0 -0
  90. data/scenarios/git_repositories/project.git/objects/51/c94da6f1b8aa9d2346088d3d362475b60c7f32 +0 -0
  91. data/scenarios/git_repositories/project.git/objects/5b/a96acf9cc9b87babe37c032676f53bf1ba9ae7 +2 -0
  92. data/scenarios/git_repositories/project.git/objects/5d/f555601d60f1c2a84d2364af0ad640612c3ba5 +0 -0
  93. data/scenarios/git_repositories/project.git/objects/71/03b5ac94940d596c2160a5cfcd55ca4ccac41f +0 -0
  94. data/scenarios/git_repositories/project.git/objects/73/3fc331098b03523f414f3509b9ae6e637c6866 +0 -0
  95. data/scenarios/git_repositories/project.git/objects/80/26076649ceccbe96a6292f2432652f08483035 +0 -0
  96. data/scenarios/git_repositories/project.git/objects/86/d1ef0976be4567de562224e1b51fbf9820c53a +1 -0
  97. data/scenarios/git_repositories/project.git/objects/87/a9d8b09b3401d21b23d90253332d6b28b47db2 +0 -0
  98. data/scenarios/git_repositories/project.git/objects/8b/030ba688255c917d189ae3f87d7c5ccd226bc2 +0 -0
  99. data/scenarios/git_repositories/project.git/objects/95/c9d5ad9b1c90e4c805516783105fc2037dedeb +2 -0
  100. data/scenarios/git_repositories/project.git/objects/95/d82d043af35a80eabfd56c0d705abfa3488787 +2 -0
  101. data/scenarios/git_repositories/project.git/objects/96/0bf34bb0b46d0aeb0be87f688f4ef06a4b35e1 +0 -0
  102. data/scenarios/git_repositories/project.git/objects/a3/860106dc1d148c7831cd45ae38829b4ed47702 +2 -0
  103. data/scenarios/git_repositories/project.git/objects/a8/506d6439b71784a72ac72d284b2ad53088f573 +0 -0
  104. data/scenarios/git_repositories/project.git/objects/ad/22ea6c7563777936ecfbe50d8e2cf8120fd525 +0 -0
  105. data/scenarios/git_repositories/project.git/objects/ae/3900de54aff557c61c81146d00f9d38e55a265 +1 -0
  106. data/scenarios/git_repositories/project.git/objects/bf/5e3740d52b80abb0378b3f85f93a53b1294521 +1 -0
  107. data/scenarios/git_repositories/project.git/objects/bf/b59811cdbc069418dee14b171e6e7e979784b7 +0 -0
  108. data/scenarios/git_repositories/project.git/objects/cc/5ac0afb24e727d5de344cc26a425f4fb7fd17d +3 -0
  109. data/scenarios/git_repositories/project.git/objects/d1/091aa2dd76885108461110c639e6b33a297fce +0 -0
  110. data/scenarios/git_repositories/project.git/objects/d8/913f6650eb2b7bf2a633732d8452008ca23dcb +0 -0
  111. data/scenarios/git_repositories/project.git/objects/db/d1b9667f1b26b13331ac0c321dced8be1aeab0 +3 -0
  112. data/scenarios/git_repositories/project.git/objects/e4/3b9107e9b1908ce415025e64eb83a493d329b7 +0 -0
  113. data/scenarios/git_repositories/project.git/objects/ef/2a88894d5421920b9dfe67a9a4d8043830e62e +0 -0
  114. data/scenarios/git_repositories/project.git/objects/f4/0123a1ff20c65d8dc15a38a83222647908e6f7 +0 -0
  115. data/scenarios/git_repositories/project.git/objects/f5/0af315b75ca0b12c720dec6d916b76b968c319 +0 -0
  116. data/scenarios/git_repositories/project.git/objects/f6/0215709b7b23f3738e9cbaf634b1c86bbd376a +0 -0
  117. data/scenarios/git_repositories/project.git/refs/heads/bad_rakefile +1 -0
  118. data/scenarios/git_repositories/project.git/refs/heads/hook_with_changed +1 -0
  119. data/scenarios/git_repositories/project.git/refs/heads/master +1 -0
  120. data/scenarios/git_repositories/project.git/refs/heads/no_rake_hooks +1 -0
  121. data/scenarios/git_repositories/project.git/refs/heads/post_rake_tasks +1 -0
  122. data/scenarios/invalid/deploy.yml +1 -0
  123. data/scenarios/local/deploy.yml.erb +17 -0
  124. data/scenarios/remote/deploy.yml +119 -0
  125. data/scenarios/setup/vagrant/.gitignore +3 -0
  126. data/scenarios/setup/vagrant/Vagrantfile +10 -0
  127. data/scenarios/setup/vagrant/manifests/integration.pp +32 -0
  128. data/scenarios/setup/vagrant/pids/.gitignore +1 -0
  129. data/spec/init_spec.rb +1 -1
  130. data/spec/install_spec.rb +4 -4
  131. data/spec/integration/branch_switching_spec.rb +41 -0
  132. data/spec/integration/deployment_failures_spec.rb +106 -0
  133. data/spec/integration/helper_spec.rb +90 -0
  134. data/spec/integration/invalid_configuration_spec.rb +39 -0
  135. data/spec/integration/local_deployments_spec.rb +230 -0
  136. data/spec/integration/post_rake_tasks_spec.rb +226 -0
  137. data/spec/integration/post_scripts_spec.rb +246 -0
  138. data/spec/integration/remote_deployments_spec.rb +166 -0
  139. data/spec/integration/staleness_checks_spec.rb +72 -0
  140. data/spec/spec_helper.rb +30 -2
  141. data/spec/wd_command_spec.rb +136 -136
  142. data/spec/wd_role_command_spec.rb +5 -5
  143. data/spec/whiskey_disk/config/filter_spec.rb +77 -0
  144. data/spec/whiskey_disk/config/filters/add_environment_name_filter_spec.rb +20 -0
  145. data/spec/whiskey_disk/config/filters/add_project_name_filter_spec.rb +19 -0
  146. data/spec/whiskey_disk/config/filters/check_for_duplicate_domains_filter_spec.rb +29 -0
  147. data/spec/whiskey_disk/config/filters/convert_role_strings_to_list_filter_spec.rb +48 -0
  148. data/spec/whiskey_disk/config/filters/default_config_target_filter_spec.rb +19 -0
  149. data/spec/whiskey_disk/config/filters/default_domain_filter_spec.rb +18 -0
  150. data/spec/whiskey_disk/config/filters/drop_empty_domain_roles_filter_spec.rb +60 -0
  151. data/spec/whiskey_disk/config/filters/environment_scope_filter_spec.rb +32 -0
  152. data/spec/whiskey_disk/config/filters/hashify_domain_entries_filter_spec.rb +41 -0
  153. data/spec/whiskey_disk/config/filters/localize_domains_filter_spec.rb +30 -0
  154. data/spec/whiskey_disk/config/filters/normalize_ssh_options_filter_spec.rb +56 -0
  155. data/spec/whiskey_disk/config/filters/project_scope_filter_spec.rb +75 -0
  156. data/spec/whiskey_disk/config/filters/select_project_and_environment_filter_spec.rb +30 -0
  157. data/spec/whiskey_disk/config/filters/stringify_hash_keys_filter_spec.rb +40 -0
  158. data/spec/whiskey_disk/config_spec.rb +259 -446
  159. data/spec/whiskey_disk/helpers_spec.rb +51 -51
  160. data/spec/whiskey_disk/rake_spec.rb +80 -80
  161. data/spec/whiskey_disk_spec.rb +591 -562
  162. data/whiskey_disk.gemspec +151 -20
  163. metadata +151 -18
@@ -1,196 +1,127 @@
1
1
  require 'yaml'
2
2
  require 'uri'
3
3
  require 'open-uri'
4
+ require 'whiskey_disk/config/filter'
4
5
 
5
6
  class WhiskeyDisk
6
7
  class Config
7
- class << self
8
- def environment_name
9
- return false unless (ENV['to'] && ENV['to'] != '')
10
- return ENV['to'] unless ENV['to'] =~ /:/
11
- ENV['to'].split(/:/)[1]
12
- end
13
-
14
- def specified_project_name
15
- return false unless (ENV['to'] && ENV['to'] =~ /:/)
16
- ENV['to'].split(/:/).first
17
- end
18
-
19
- def override_project_name!(data)
20
- return if ENV['to'] && ENV['to'] =~ /:/
21
- ENV['to'] = data[environment_name]['project'] + ':' + ENV['to'] if data[environment_name]['project']
22
- end
23
-
24
- def path
25
- (ENV['path'] && ENV['path'] != '') ? ENV['path'] : false
26
- end
27
-
28
- def check_staleness?
29
- !!(ENV['check'] && ENV['check'] =~ /^(?:t(?:rue)?|y(?:es)?|1)$/)
30
- end
8
+ def fetch
9
+ raise "Cannot determine current environment -- try rake ... to=staging, for example." unless environment_name
10
+ filter_data(load_data)
11
+ end
31
12
 
32
- def debug?
33
- !!(ENV['debug'] && ENV['debug'] =~ /^(?:t(?:rue)?|y(?:es)?|1)$/)
34
- end
13
+ def debug?
14
+ env_flag_is_true?('debug')
15
+ end
16
+
17
+ def domain_limit
18
+ env_key_or_false?('only')
19
+ end
20
+
21
+ def check_staleness?
22
+ env_flag_is_true?('check')
23
+ end
24
+
25
+ def configuration_file
26
+ return path if valid_path?(path)
35
27
 
36
- def domain_limit
37
- return false unless ENV['only'] and ENV['only'] != ''
38
- ENV['only']
39
- end
28
+ files = []
40
29
 
41
- def contains_rakefile?(path)
42
- File.exists?(File.expand_path(File.join(path, 'Rakefile')))
43
- end
44
-
45
- def find_rakefile_from_current_path
46
- original_path = Dir.pwd
47
- while (!contains_rakefile?(Dir.pwd))
48
- return File.join(original_path, 'config') if Dir.pwd == '/'
49
- Dir.chdir('..')
50
- end
51
- File.join(Dir.pwd, 'config')
52
- ensure
53
- Dir.chdir(original_path)
54
- end
55
-
56
- def base_path
57
- return path if path
58
- find_rakefile_from_current_path
59
- end
60
-
61
- def valid_path?(path)
62
- if path
63
- uri = URI.parse(path)
64
- return path if uri.scheme
65
- return path if File.file?(path)
66
- end
67
-
68
- false
69
- end
70
-
71
- def configuration_file
72
- return path if valid_path?(path)
73
-
74
- files = []
30
+ files += [
31
+ File.join(base_path, 'deploy', specified_project_name, "#{environment_name}.yml"), # /deploy/foo/staging.yml
32
+ File.join(base_path, 'deploy', "#{specified_project_name}.yml") # /deploy/foo.yml
33
+ ] if specified_project_name
75
34
 
76
- files += [
77
- File.join(base_path, 'deploy', specified_project_name, "#{environment_name}.yml"), # /deploy/foo/staging.yml
78
- File.join(base_path, 'deploy', "#{specified_project_name}.yml") # /deploy/foo.yml
79
- ] if specified_project_name
35
+ files += [
36
+ File.join(base_path, 'deploy', "#{environment_name}.yml"), # /deploy/staging.yml
37
+ File.join(base_path, "#{environment_name}.yml"), # /staging.yml
38
+ File.join(base_path, 'deploy.yml') # /deploy.yml
39
+ ]
80
40
 
81
- files += [
82
- File.join(base_path, 'deploy', "#{environment_name}.yml"), # /deploy/staging.yml
83
- File.join(base_path, "#{environment_name}.yml"), # /staging.yml
84
- File.join(base_path, 'deploy.yml') # /deploy.yml
85
- ]
41
+ files.each { |file| return file if File.exists?(file) }
86
42
 
87
- files.each { |file| return file if File.exists?(file) }
88
-
89
- raise "Could not locate configuration file in path [#{base_path}]"
90
- end
43
+ raise "Could not locate configuration file in path [#{base_path}]"
44
+ end
91
45
 
92
- def configuration_data
93
- open(configuration_file) {|f| f.read }
94
- end
46
+ def environment_name
47
+ return false unless env_has_key?('to')
48
+ return ENV['to'] unless ENV['to'] =~ /:/
49
+ ENV['to'].split(/:/)[1]
50
+ end
95
51
 
96
- def project_name
97
- specified_project_name || 'unnamed_project'
98
- end
52
+ def specified_project_name
53
+ return false unless env_has_key?('to')
54
+ return false unless ENV['to'] =~ /:/
55
+ ENV['to'].split(/:/).first
56
+ end
57
+
58
+ def contains_rakefile?(path)
59
+ File.exists?(File.expand_path(File.join(path, 'Rakefile')))
60
+ end
99
61
 
100
- def repository_depth(data, depth = 0)
101
- raise 'no repository found' unless data.respond_to?(:has_key?)
102
- return depth if data.has_key?('repository')
103
- repository_depth(data.values.first, depth + 1)
62
+ def find_rakefile_from_current_path
63
+ original_path = Dir.pwd
64
+ while (!contains_rakefile?(Dir.pwd))
65
+ return File.join(original_path, 'config') if Dir.pwd == '/'
66
+ Dir.chdir('..')
104
67
  end
68
+ File.join(Dir.pwd, 'config')
69
+ ensure
70
+ Dir.chdir(original_path)
71
+ end
105
72
 
106
- # is this data hash a bottom-level data hash without an environment name?
107
- def needs_environment_scoping?(data)
108
- repository_depth(data) == 0
109
- end
73
+ def base_path
74
+ path || find_rakefile_from_current_path
75
+ end
110
76
 
111
- # is this data hash an environment data hash without a project name?
112
- def needs_project_scoping?(data)
113
- repository_depth(data) == 1
114
- end
77
+ def valid_path?(path)
78
+ return false unless path
79
+ uri = URI.parse(path)
80
+ return path if uri.scheme
81
+ return path if File.file?(path)
82
+ end
115
83
 
116
- def add_environment_scoping(data)
117
- return data unless needs_environment_scoping?(data)
118
- { environment_name => data }
119
- end
84
+ def project_name
85
+ specified_project_name || 'unnamed_project'
86
+ end
120
87
 
121
- def add_project_scoping(data)
122
- return data unless needs_project_scoping?(data)
123
- override_project_name!(data)
124
- { project_name => data }
125
- end
88
+ # called only by #load_data
89
+ def configuration_data
90
+ open(configuration_file) {|f| f.read }
91
+ end
126
92
 
127
- def localize_domain_list(list)
128
- [ list ].flatten.collect { |d| (d.nil? or d == '') ? 'local' : d }
129
- end
130
-
131
- def compact_list(list)
132
- [ list ].flatten.delete_if { |d| d.nil? or d == '' }
133
- end
134
-
135
- def normalize_domain(data)
136
- compacted = localize_domain_list(data)
137
- compacted = [ 'local' ] if compacted.empty?
138
-
139
- compacted.collect do |d|
140
- if d.respond_to?(:keys)
141
- row = { :name => (d['name'] || d[:name]) }
142
- roles = compact_list(d['roles'] || d[:roles])
143
- row[:roles] = roles unless roles.empty?
144
- row
145
- else
146
- { :name => d }
147
- end
148
- end
149
- end
150
-
151
- def check_duplicates(project, target, domain_list)
152
- seen = {}
153
- domain_list.each do |domain|
154
- raise "duplicate domain [#{domain[:name]}] in configuration file for project [#{project}], target [#{target}]" if seen[domain[:name]]
155
- seen[domain[:name]] = true
156
- end
157
- end
158
-
159
- def normalize_domains(data)
160
- data.each_pair do |project, project_data|
161
- project_data.each_pair do |target, target_data|
162
- target_data['domain'] = check_duplicates(project, target, normalize_domain(target_data['domain']))
163
- end
164
- end
165
- end
93
+ # called only by #fetch
94
+ def load_data
95
+ YAML.load(configuration_data)
96
+ rescue Exception => e
97
+ raise %Q{Error reading configuration file [#{configuration_file}]: "#{e}"}
98
+ end
99
+
100
+ def filter
101
+ @filter ||= WhiskeyDisk::Config::Filter.new(self)
102
+ end
103
+
104
+ # called only by #fetch
105
+ def filter_data(data)
106
+ filter.filter_data(data)
107
+ end
166
108
 
167
- def normalize_data(data)
168
- normalize_domains(add_project_scoping(add_environment_scoping(data.clone)))
169
- end
109
+ private
170
110
 
171
- def load_data
172
- normalize_data(YAML.load(configuration_data))
173
- rescue Exception => e
174
- raise %Q{Error reading configuration file [#{configuration_file}]: "#{e}"}
175
- end
111
+ def path
112
+ env_key_or_false?('path')
113
+ end
176
114
 
177
- def filter_data(data)
178
- current = data[project_name][environment_name] rescue nil
179
- raise "No configuration file defined data for project `#{project_name}`, environment `#{environment_name}`" unless current
180
-
181
- current.merge!({
182
- 'environment' => environment_name,
183
- 'project' => project_name,
184
- })
185
-
186
- current['config_target'] ||= environment_name
187
- current
188
- end
115
+ def env_has_key?(key)
116
+ ENV[key] && ENV[key] != ''
117
+ end
189
118
 
190
- def fetch
191
- raise "Cannot determine current environment -- try rake ... to=staging, for example." unless environment_name
192
- filter_data(load_data)
193
- end
119
+ def env_flag_is_true?(key)
120
+ !!(env_has_key?(key) && ENV[key] =~ /^(?:t(?:rue)?|y(?:es)?|1)$/)
194
121
  end
122
+
123
+ def env_key_or_false?(key)
124
+ env_has_key?(key) ? ENV[key] : false
125
+ end
195
126
  end
196
127
  end
@@ -0,0 +1,19 @@
1
+ class WhiskeyDisk
2
+ class Config
3
+ class AbstractFilter
4
+ attr_reader :config
5
+
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def project_name
11
+ config.project_name
12
+ end
13
+
14
+ def environment_name
15
+ config.environment_name
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,48 @@
1
+ require 'whiskey_disk/config/filters/stringify_hash_keys_filter'
2
+ require 'whiskey_disk/config/filters/environment_scope_filter'
3
+ require 'whiskey_disk/config/filters/project_scope_filter'
4
+ require 'whiskey_disk/config/filters/select_project_and_environment_filter'
5
+ require 'whiskey_disk/config/filters/add_environment_name_filter'
6
+ require 'whiskey_disk/config/filters/add_project_name_filter'
7
+ require 'whiskey_disk/config/filters/default_config_target_filter'
8
+ require 'whiskey_disk/config/filters/default_domain_filter'
9
+ require 'whiskey_disk/config/filters/hashify_domain_entries_filter'
10
+ require 'whiskey_disk/config/filters/localize_domains_filter'
11
+ require 'whiskey_disk/config/filters/check_for_duplicate_domains_filter'
12
+ require 'whiskey_disk/config/filters/convert_role_strings_to_list_filter'
13
+ require 'whiskey_disk/config/filters/drop_empty_domain_roles_filter'
14
+ require 'whiskey_disk/config/filters/normalize_ssh_options_filter'
15
+
16
+ class WhiskeyDisk
17
+ class Config
18
+ class Filter
19
+ attr_reader :config, :filters
20
+
21
+ def initialize(config)
22
+ @config = config
23
+ @filters = [
24
+ StringifyHashKeysFilter,
25
+ EnvironmentScopeFilter,
26
+ ProjectScopeFilter,
27
+ SelectProjectAndEnvironmentFilter,
28
+ AddEnvironmentNameFilter,
29
+ AddProjectNameFilter,
30
+ DefaultConfigTargetFilter,
31
+ DefaultDomainFilter,
32
+ HashifyDomainEntriesFilter,
33
+ LocalizeDomainsFilter,
34
+ CheckForDuplicateDomainsFilter,
35
+ ConvertRoleStringsToListFilter,
36
+ DropEmptyDomainRolesFilter,
37
+ NormalizeSshOptionsFilter
38
+ ]
39
+ end
40
+
41
+ def filter_data(data)
42
+ filters.inject(data.clone) do |result, filter|
43
+ result = filter.new(config).filter(result)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,11 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class AddEnvironmentNameFilter < AbstractFilter
6
+ def filter(data)
7
+ data.merge( { 'environment' => environment_name } )
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class AddProjectNameFilter < AbstractFilter
6
+ def filter(data)
7
+ data.merge( { 'project' => project_name } )
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class CheckForDuplicateDomainsFilter < AbstractFilter
6
+ def check_domains(domain_list)
7
+ seen = {}
8
+ domain_list.each do |domain|
9
+ raise "duplicate domain [#{domain['name']}] in configuration file for project [#{environment_name}], target [#{environment_name}]" if seen[domain['name']]
10
+ seen[domain['name']] = true
11
+ end
12
+ end
13
+
14
+ def filter(data)
15
+ check_domains(data['domain'])
16
+ data
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,20 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class ConvertRoleStringsToListFilter < AbstractFilter
6
+ def convert_roles_for_domain(domain)
7
+ return domain unless domain['roles']
8
+ domain.merge('roles' => [ domain['roles'] ].flatten)
9
+ end
10
+
11
+ def convert_all_roles(domains_list)
12
+ domains_list.collect {|domain| convert_roles_for_domain(domain) }
13
+ end
14
+
15
+ def filter(data)
16
+ data.merge('domain' => convert_all_roles(data['domain']))
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ require 'whiskey_disk/config/abstract_filter'
2
+
3
+ class WhiskeyDisk
4
+ class Config
5
+ class DefaultConfigTargetFilter < AbstractFilter
6
+ def filter(data)
7
+ return data if data['config_target']
8
+ data.merge( { 'config_target' => environment_name })
9
+ end
10
+ end
11
+ end
12
+ end