fulmar 1.10.1 → 2.0.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +11 -4
  4. data/README.md +87 -102
  5. data/fulmar.gemspec +2 -2
  6. data/lib/fulmar/domain/{service/application_service.rb → model/application.rb} +16 -2
  7. data/lib/fulmar/domain/model/configuration.rb +185 -0
  8. data/lib/fulmar/domain/service/config_test_service.rb +32 -114
  9. data/lib/fulmar/domain/service/config_tests/hosts.rb +23 -0
  10. data/lib/fulmar/domain/service/config_tests/mariadb.rb +19 -0
  11. data/lib/fulmar/domain/service/config_tests/paths.rb +15 -0
  12. data/lib/fulmar/domain/service/config_tests/project.rb +5 -0
  13. data/lib/fulmar/domain/service/configuration_service.rb +13 -131
  14. data/lib/fulmar/domain/service/file_sync_service.rb +7 -7
  15. data/lib/fulmar/domain/service/helper/common_helper.rb +18 -32
  16. data/lib/fulmar/domain/service/plugin_service.rb +60 -0
  17. data/lib/fulmar/domain/service/{config_rendering_service.rb → template_rendering_service.rb} +3 -3
  18. data/lib/fulmar/domain/task/configuration.rake +9 -7
  19. data/lib/fulmar/domain/task/console.rake +3 -3
  20. data/lib/fulmar/domain/task/environment.rake +5 -12
  21. data/lib/fulmar/domain/task/initialization/base.rake +3 -9
  22. data/lib/fulmar/domain/task/versions.rake +8 -12
  23. data/lib/fulmar/infrastructure/default_files/Fulmar/project.config.yml +26 -0
  24. data/lib/fulmar/infrastructure/default_files/Fulmarfile +22 -0
  25. data/lib/fulmar/infrastructure/{service → model}/transfer/base.rb +4 -4
  26. data/lib/fulmar/infrastructure/{service → model}/transfer/rsync.rb +4 -2
  27. data/lib/fulmar/infrastructure/{service → model}/transfer/rsync_with_versions.rb +18 -20
  28. data/lib/fulmar/infrastructure/{service → model}/transfer/tar.rb +2 -2
  29. data/lib/fulmar/infrastructure/service/copy_service.rb +2 -2
  30. data/lib/fulmar/infrastructure/service/ssh_config_service.rb +8 -21
  31. data/lib/fulmar/service/bootstrap_service.rb +1 -5
  32. data/lib/fulmar/task_manager.rb +2 -8
  33. data/lib/fulmar/version.rb +1 -1
  34. data/spec/lib/fulmar/model/configuration_spec.rb +193 -0
  35. data/spec/lib/fulmar/service/plugin_service_spec.rb +29 -0
  36. metadata +29 -34
  37. data/lib/fulmar/domain/service/helper/database_helper.rb +0 -14
  38. data/lib/fulmar/domain/service/helper/flow_helper.rb +0 -16
  39. data/lib/fulmar/domain/service/helper/vhost_helper.rb +0 -21
  40. data/lib/fulmar/domain/task/database_sync.rake +0 -63
  41. data/lib/fulmar/infrastructure/service/composer_service.rb +0 -22
  42. data/lib/fulmar/infrastructure/service/database/database_service.rb +0 -118
  43. data/lib/fulmar/infrastructure/service/flow_service.rb +0 -47
  44. data/lib/fulmar/infrastructure/service/shell_service.rb +0 -10
  45. data/lib/fulmar/service/logger_service.rb +0 -7
  46. data/test/rsync_with_versions.rb +0 -20
@@ -1,12 +1,12 @@
1
1
  desc 'Open an interactive terminal within fulmar'
2
- task :console, [:environment] do |t, args|
2
+ task :console, [:environment] do |_t, args|
3
3
  require 'irb'
4
4
  require 'irb/completion'
5
5
  ARGV.clear
6
6
  if args[:environment] && args[:environment].include?(':')
7
7
  environment, target = args[:environment].split(':')
8
- configuration.environment = environment
9
- configuration.target = target
8
+ config.environment = environment.to_sym
9
+ config.target = target.to_sym
10
10
  end
11
11
  IRB.start
12
12
  end
@@ -2,19 +2,12 @@
2
2
  # so that these tasks might be a dependency for other tasks
3
3
 
4
4
  namespace :environment do
5
- full_configuration[:environments].each_key do |env|
6
- # Sets the environment to #{env}
7
- task env do
8
- configuration.environment = env
9
- end
10
-
5
+ config.each do |env, target, _data|
11
6
  namespace env do
12
- full_configuration[:environments][env].each_key do |target|
13
- # Sets the environment to #{env} and the target to #{target}
14
- task target do
15
- configuration.environment = env
16
- configuration.target = target
17
- end
7
+ # Sets the environment to #{env} and the target to #{target}
8
+ task target do
9
+ config.environment = env
10
+ config.target = target
18
11
  end
19
12
  end
20
13
  end
@@ -1,12 +1,6 @@
1
1
  require 'fulmar/domain/service/helper/common_helper'
2
2
  include Fulmar::Domain::Service::Helper::CommonHelper
3
3
 
4
- if configuration.feature? :database
5
- require 'fulmar/domain/service/helper/database_helper'
6
- include Fulmar::Domain::Service::Helper::DatabaseHelper
7
- end
8
-
9
- if configuration.feature? :flow
10
- require 'fulmar/domain/service/helper/flow_helper'
11
- include Fulmar::Domain::Service::Helper::FlowHelper
12
- end
4
+ Fulmar::Domain::Service::PluginService.instance.helpers.each do |helper|
5
+ include helper
6
+ end
@@ -3,12 +3,8 @@ include Fulmar::Domain::Service::Helper::CommonHelper
3
3
  namespace :versions do
4
4
  @versioned_servers = {}
5
5
 
6
- full_configuration[:environments].each_pair do |env, targets|
7
- next if env == :all
8
-
9
- targets.each_pair do |target, config|
10
- @versioned_servers["#{env}:#{target}"] = config if config[:type].to_s == 'rsync_with_versions'
11
- end
6
+ config.each do |env, target, config|
7
+ @versioned_servers["#{env}:#{target}"] = config if config[:type].to_s == 'rsync_with_versions'
12
8
  end
13
9
 
14
10
  unless @versioned_servers.empty?
@@ -25,8 +21,8 @@ namespace :versions do
25
21
 
26
22
  desc "List available versions for environment/target \"#{env}\""
27
23
  task task_environment do
28
- configuration.environment = env.split(':').first
29
- configuration.target = env.split(':').last
24
+ config.environment = env.split(':').first
25
+ config.target = env.split(':').last
30
26
  file_sync.list_releases(false).each { |item| puts item }
31
27
  end
32
28
  end
@@ -34,8 +30,8 @@ namespace :versions do
34
30
  namespace :clean do
35
31
  desc "Delete obsolete versions for target \"#{env}\""
36
32
  task task_environment do
37
- configuration.environment = env.split(':').first
38
- configuration.target = env.split(':').last
33
+ config.environment = env.split(':').first
34
+ config.target = env.split(':').last
39
35
  file_sync.cleanup
40
36
  end
41
37
  end
@@ -43,8 +39,8 @@ namespace :versions do
43
39
  namespace :revert do
44
40
  desc "Revert to the previous version for \"#{env}\""
45
41
  task task_environment do
46
- configuration.environment = env.split(':').first
47
- configuration.target = env.split(':').last
42
+ config.environment = env.split(':').first
43
+ config.target = env.split(':').last
48
44
  error 'Cannot revert to previous version.' unless file_sync.revert
49
45
  end
50
46
  end
@@ -0,0 +1,26 @@
1
+ project:
2
+ name: example_project
3
+ fulmar_version: '~> 2.0'
4
+
5
+ environments:
6
+ local:
7
+ base:
8
+ local_path: .
9
+
10
+ staging:
11
+ files:
12
+ host: staging_server
13
+
14
+ dependencies:
15
+ # Dependencies under "all" are merged into all environments
16
+ all:
17
+ application:
18
+ type: git
19
+
20
+
21
+ hosts:
22
+ staging_server:
23
+ hostname: staging
24
+ ssh_config:
25
+ Hostname: staging
26
+ User: deployment
@@ -0,0 +1,22 @@
1
+ # This is a basic Fulmarfile. You can add task just like in Rake. Additionally, you can
2
+ # use helper to modify the ssh config, open a shell locally or remote, or upload files to a preconfigured host
3
+ # All paths and hostname are configured in Fulmar/project.config.yml. You can split you configuration over multiple
4
+ # *.config.yml files which are all merged. You can create additional .rake files within the Fulmar directory.
5
+ # For more help, look at https://github.com/CORE4/fulmar
6
+
7
+ desc 'setup this project'
8
+ task setup: 'environment:local:base' do
9
+ info 'Withing this task you can add the initialization of your project.'
10
+ # Maybe do this:
11
+ # dependencies.setup
12
+ # ssh_config.add_hosts
13
+ end
14
+
15
+ namespace :deploy do
16
+ desc 'Deploy to staging system'
17
+ task staging: 'environment:staging:application' do
18
+ info 'Here you can upload your files and maybe flush the cache'
19
+ # file_sync.transfer
20
+ # remote_shell.run 'php cli/console cache:flush'
21
+ end
22
+ end
@@ -1,11 +1,10 @@
1
-
2
1
  require 'fulmar/shell'
3
2
 
4
3
  module Fulmar
5
4
  module Infrastructure
6
- module Service
5
+ module Model
7
6
  module Transfer
8
- # Abstract class for alle transfers, provides common methods
7
+ # Abstract class for all transfers, provides common methods
9
8
  class Base
10
9
  DEFAULT_CONFIG = {
11
10
  debug: false,
@@ -38,7 +37,8 @@ module Fulmar
38
37
  end
39
38
 
40
39
  def prepare
41
- @local_shell = Fulmar::Infrastructure::Service::ShellService.new @config[:local_path]
40
+ @local_shell = Fulmar::Shell.new @config[:local_path]
41
+ @local_shell.strict = true
42
42
  @local_shell.debug = @config[:debug]
43
43
  @prepared = true
44
44
  end
@@ -1,9 +1,9 @@
1
1
  require 'pathname'
2
- require 'fulmar/infrastructure/service/transfer/base'
2
+ require 'fulmar/infrastructure/model/transfer/base'
3
3
 
4
4
  module Fulmar
5
5
  module Infrastructure
6
- module Service
6
+ module Model
7
7
  module Transfer
8
8
  # Implements the rsync transfer
9
9
  class Rsync < Base
@@ -27,6 +27,8 @@ module Fulmar
27
27
  @config[:rsync][:exclude_file] = @config[:local_path] + '/.rsyncignore'
28
28
  end
29
29
 
30
+ fail 'Hostname not set. Cannot initialize sync.' if @config[:hostname].empty?
31
+
30
32
  super(@config)
31
33
  end
32
34
 
@@ -1,11 +1,11 @@
1
1
 
2
- require 'fulmar/infrastructure/service/transfer/base'
2
+ require 'fulmar/infrastructure/model/transfer/base'
3
3
  require 'time'
4
- require 'ruby_wings'
4
+ require 'active_support'
5
5
 
6
6
  module Fulmar
7
7
  module Infrastructure
8
- module Service
8
+ module Model
9
9
  module Transfer
10
10
  # Provides syncing with versioning on the server
11
11
  #
@@ -24,7 +24,7 @@ module Fulmar
24
24
  exclude_file: nil,
25
25
  chown: nil,
26
26
  chmod: nil,
27
- delete: true
27
+ delete: true
28
28
  },
29
29
  symlinks: {},
30
30
  limit_releases: 5,
@@ -47,7 +47,7 @@ module Fulmar
47
47
  # Ensures all needed services are set up
48
48
  def prepare
49
49
  super
50
- @remote_shell = Fulmar::Infrastructure::Service::ShellService.new @config[:remote_path], @config.ssh_user_and_host
50
+ @remote_shell = Fulmar::Shell.new @config[:remote_path], @config.ssh_user_and_host
51
51
  @remote_shell.debug = @config[:debug]
52
52
  end
53
53
 
@@ -56,10 +56,7 @@ module Fulmar
56
56
  def transfer
57
57
  prepare unless @prepared
58
58
 
59
- fail 'Deployment failed when trying to prepare remote directories for sync.' unless create_paths
60
- fail 'Deployment failed. Cannot sync files.' unless @local_shell.run(rsync_command)
61
- fail 'Deployment failed when trying to move file from temporary upload dir.' unless copy_temp_to_release
62
- fail 'Deployment failed when creating symlinks for shared folders' unless add_shared
59
+ create_paths && @local_shell.run(rsync_command) && copy_temp_to_release && add_shared
63
60
  end
64
61
 
65
62
  # Publishes the current release (i.e. sets the 'current' symlink)
@@ -156,7 +153,7 @@ module Fulmar
156
153
  # Builds the rsync command
157
154
  # @return [String] the command
158
155
  def rsync_command
159
- options = %w(-rl --delete-excluded)
156
+ options = ['-rl']
160
157
  options << rsync_excludes if rsync_excludes
161
158
  options << "--exclude-from='#{@config[:rsync][:exclude_file]}'" if @config[:rsync][:exclude_file]
162
159
  options << "--chown='#{@config[:rsync][:chown]}'" if @config[:rsync][:chown]
@@ -169,7 +166,7 @@ module Fulmar
169
166
  # Copies the data from the sync temp to the actual release directory
170
167
  # @return [true, false] success
171
168
  def copy_temp_to_release
172
- @remote_shell.run "cp -pR #{@config[:temp_dir]} #{release_dir}"
169
+ @remote_shell.run "cp -pr #{@config[:temp_dir]} #{release_dir}"
173
170
  end
174
171
 
175
172
  # Set the symlink to the given release or the return value of release_dir() otherwise
@@ -190,23 +187,24 @@ module Fulmar
190
187
  # @return [true, false] success
191
188
  def add_shared
192
189
  commands = [] # Collect all remote commands first, then execute them in one step to avoid reconnecting very often
193
- @config[:shared].each do |path|
194
- commands << "mkdir -p \"#{release_dir}/#{File.dirname(path)}\""
190
+ @config[:shared].each do |dir|
191
+ commands << "mkdir -p \"#{release_dir}/#{dir}\""
195
192
 
196
- unless remote_path_exists?("#{@config[:shared_dir]}/#{path}")
197
- commands << "mkdir -p \"#{@config[:shared_dir]}/#{path}\""
193
+ unless remote_dir_exists?("#{@config[:shared_dir]}/#{dir}")
194
+ commands << "mkdir -p \"#{@config[:shared_dir]}/#{File.dirname(dir)}\""
195
+ commands << "cp -pr \"#{release_dir}/#{dir}\" \"#{@config[:shared_dir]}/#{File.dirname(dir)}\""
198
196
  end
199
197
 
200
- commands << "rm -fr \"#{release_dir}/#{path}\""
201
- commands << "mkdir -p \"#{release_dir}/#{File.dirname(path)}\""
202
- commands << "ln -s \"#{@config[:remote_path]}/#{@config[:shared_dir]}/#{path}\" \"#{release_dir}/#{path}\""
198
+ commands << "rm -fr \"#{release_dir}/#{dir}\""
199
+ commands << "mkdir -p \"#{release_dir}/#{File.dirname(dir)}\""
200
+ commands << "ln -s \"#{@config[:remote_path]}/#{@config[:shared_dir]}/#{dir}\" \"#{release_dir}/#{dir}\""
203
201
  end
204
202
 
205
203
  @remote_shell.run commands if commands.length > 0
206
204
  end
207
205
 
208
- def remote_path_exists?(dir)
209
- @remote_shell.run "test -e \"#{dir}\""
206
+ def remote_dir_exists?(dir)
207
+ @remote_shell.run "test -d \"#{dir}\""
210
208
  end
211
209
  end
212
210
  end
@@ -1,9 +1,9 @@
1
1
 
2
- require 'fulmar/infrastructure/service/transfer/base'
2
+ require 'fulmar/infrastructure/model/transfer/base'
3
3
 
4
4
  module Fulmar
5
5
  module Infrastructure
6
- module Service
6
+ module Model
7
7
  module Transfer
8
8
  # Implements the rsync transfer
9
9
  class Tar < Base
@@ -4,7 +4,7 @@ module Fulmar
4
4
  # Provides access to composer
5
5
  class CopyService
6
6
  # Copies a file to a remote server
7
- # @param [Fulmar::Infrastructue::Service::ShellService] shell
7
+ # @param [Fulmar::Shell] shell
8
8
  # @param [String] local_file local filename, should be absolute
9
9
  # @param [String] remote_host SSH hostname
10
10
  # @param [String] remote_dir remote directory
@@ -15,7 +15,7 @@ module Fulmar
15
15
  end
16
16
 
17
17
  # Downloads a file from a remote server
18
- # @param [Fulmar::Infrastructue::Service::ShellService] shell
18
+ # @param [Fulmar::Shell] shell
19
19
  # @param [String] remote_host SSH hostname
20
20
  # @param [String] remote_file remote directory
21
21
  # @param [String] local_dir local filename, should be absolute
@@ -7,26 +7,13 @@ module Fulmar
7
7
  class SSHConfigService
8
8
  CONFIG_FILE = "#{ENV['HOME']}/.ssh/config"
9
9
  KNOWN_HOST_FILE = "#{ENV['HOME']}/.ssh/known_hosts"
10
- # @todo: Get rid of this layer (Version 2?)
11
- CONFIG_MAP = {
12
- hostname: 'Hostname',
13
- port: 'Port',
14
- user: 'User',
15
- proxycommand: 'ProxyCommand',
16
- checkhostip: 'CheckHostIP',
17
- stricthostkeychecking: 'StrictHostKeyChecking',
18
- identityfile: 'IdentityFile',
19
- userknownhostfile: 'UserKnownHostsFile',
20
- loglevel: 'LogLevel',
21
- forwardagent: 'ForwardAgent'
22
- }
23
10
 
24
11
  def initialize(config)
25
12
  @config = config
26
13
  end
27
14
 
28
15
  def add_hosts
29
- @config.configuration[:hosts].values.each do |data|
16
+ @config.hosts.values.each do |data|
30
17
  unless config_valid?(data)
31
18
  puts "Skipping #{data[:hostname]}, config not sufficient." if @config[:debug]
32
19
  next
@@ -68,17 +55,17 @@ module Fulmar
68
55
  puts "Adding host #{hostname}..." if @config[:debug]
69
56
  config_file = File.open(CONFIG_FILE, 'a')
70
57
 
71
- unless ssh_config[:identityfile].blank? or ssh_config[:identityfile][0, 1] == '/'
72
- ssh_config[:identityfile] = @config.base_path + '/' + ssh_config[:identityfile]
58
+ unless ssh_config[:IdentityFile].blank? or ssh_config[:IdentityFile][0, 1] == '/'
59
+ ssh_config[:IdentityFile] = @config.base_path + '/' + ssh_config[:IdentityFile]
73
60
  end
74
61
 
75
62
  config_file.puts "\n" # Add some space between this and the second last entry
76
- config_file.puts "# Automatically generated by fulmar for project #{@config.project.description}"
63
+ config_file.puts "# Automatically generated by fulmar for project '#{@config.project.description}'"
77
64
  config_file.puts "Host #{hostname}"
78
- CONFIG_MAP.keys.each do |key|
79
- unless ssh_config[key].blank?
80
- config_file.puts " #{CONFIG_MAP[key]} \"#{ssh_config[key].to_s.gsub('"', '\\"')}\""
81
- end
65
+ ssh_config.keys.each do |key|
66
+ value = ssh_config[key].to_s
67
+ value = "\"#{value.gsub('"', '\\"')}\"" if value.include?(' ')
68
+ config_file.puts " #{key} #{value}"
82
69
  end
83
70
 
84
71
  config_file.close
@@ -2,12 +2,8 @@ module Fulmar
2
2
  module Service
3
3
  # Initializes the rake service and starts it
4
4
  class BootstrapService
5
- def initialize
6
- $logger = Fulmar::Service::LoggerService.new(STDOUT)
7
- end
8
-
9
5
  def fly
10
- Fulmar::Domain::Service::ApplicationService.new.run
6
+ Fulmar::Domain::Service::Application.new.run
11
7
  end
12
8
  end
13
9
  end
@@ -2,22 +2,16 @@ require 'fulmar/version'
2
2
 
3
3
  require 'fulmar/service/bootstrap_service'
4
4
  require 'fulmar/service/helper_service'
5
- require 'fulmar/service/logger_service'
6
5
 
7
6
  require 'fulmar/domain/service/initialization_service'
8
- require 'fulmar/domain/service/application_service'
7
+ require 'fulmar/domain/model/application'
9
8
  require 'fulmar/domain/service/configuration_service'
10
- require 'fulmar/domain/service/config_rendering_service'
9
+ require 'fulmar/domain/service/template_rendering_service'
11
10
  require 'fulmar/domain/service/file_sync_service'
12
11
 
13
- require 'fulmar/infrastructure/service/composer_service'
14
- require 'fulmar/infrastructure/service/shell_service'
15
12
  require 'fulmar/infrastructure/service/copy_service'
16
13
  require 'fulmar/infrastructure/service/ssh_config_service'
17
14
 
18
- require 'fulmar/infrastructure/service/database/database_service'
19
-
20
- require 'ruby_wings'
21
15
  require 'fileutils'
22
16
 
23
17
  bootstrap = Fulmar::Service::BootstrapService.new
@@ -1,4 +1,4 @@
1
1
  # Provides a global version number
2
2
  module Fulmar
3
- VERSION = '1.10.1'
3
+ VERSION = '2.0.0'
4
4
  end
@@ -0,0 +1,193 @@
1
+ require 'fulmar/service/helper_service'
2
+ require 'fulmar/domain/model/configuration'
3
+ require 'active_support'
4
+
5
+ FULMAR_TEST_CONFIG = {
6
+ project: {
7
+ name: 'Test data'
8
+ },
9
+ environments: {
10
+ all: {
11
+ local_path: 'Application',
12
+ inherit_test: 'global'
13
+ },
14
+ staging: {
15
+ all: {
16
+ host: 'stagingserver',
17
+ local_path: '/tmp',
18
+ inherit_test: 'environment'
19
+ },
20
+ data: {
21
+ relative_path: 'relative',
22
+ absolute_path: '/absolute',
23
+ remote_path: '/'
24
+ },
25
+ files: {
26
+ inherit_test: 'local',
27
+ local_path: '.',
28
+ remote_path: 'tmp',
29
+ hostname: 'localhost'
30
+ }
31
+ },
32
+ live: {
33
+ files: {
34
+ },
35
+ data: {
36
+ local_path: 'Application',
37
+ relative_path: 'SubApplication'
38
+ }
39
+ }
40
+ },
41
+ hosts: {
42
+ liveserver: {
43
+ hostname: 'liveserver',
44
+ remote_path: '/liveserver'
45
+ },
46
+ stagingserver: {
47
+ hostname: 'stagingserver',
48
+ remote_path: '/stagingserver'
49
+ }
50
+ }
51
+
52
+ }
53
+
54
+ describe Fulmar::Domain::Model::Configuration do
55
+ before :each do
56
+ # Make a deep copy of the hash so we have a fresh copy for every test
57
+ config_data = Marshal.load( Marshal.dump(FULMAR_TEST_CONFIG) )
58
+ @config = Fulmar::Domain::Model::Configuration.new(config_data, '/tmp')
59
+ end
60
+
61
+ describe '#instantiation' do
62
+ it 'should return a simple configuration option' do
63
+ @config.environment = :staging
64
+ @config.target = :files
65
+ expect(@config[:inherit_test]).to eql('local')
66
+ end
67
+
68
+ it 'should return an inherited configuration option from the environment' do
69
+ @config.environment = :staging
70
+ @config.target = :data
71
+ expect(@config[:inherit_test]).to eql('environment')
72
+ end
73
+
74
+ it 'should return an globally inherited configuration option' do
75
+ @config.environment = :live
76
+ @config.target = :files
77
+ expect(@config[:inherit_test]).to eql('global')
78
+ end
79
+ end
80
+
81
+ describe '#each' do
82
+ it 'should iterate over all environments/targets do' do
83
+ @all_targets = []
84
+ FULMAR_TEST_CONFIG[:environments].keys.each do |env|
85
+ next if env == :all
86
+ FULMAR_TEST_CONFIG[:environments][env].keys.each do |target, _value|
87
+ next if target == :all
88
+ @all_targets << "#{env}/#{target}"
89
+ end
90
+ end
91
+ @targets = []
92
+ @config.each do |env, target, _data|
93
+ @targets << "#{env}/#{target}"
94
+ end
95
+ expect(@targets).to eql(@all_targets)
96
+ end
97
+ end
98
+
99
+ describe '#project' do
100
+ it 'should return a new project' do
101
+ expect(@config.project).to be_a Fulmar::Domain::Model::Project
102
+ end
103
+ end
104
+
105
+ describe '#ready?' do
106
+ it 'should return false if settings are missing' do
107
+ expect(@config.ready?).to be false
108
+ @config.environment = :staging
109
+ expect(@config.ready?).to be false
110
+ @config.environment = nil
111
+ @config.target = :files
112
+ expect(@config.ready?).to be false
113
+ end
114
+
115
+ it 'should return true with all settings given' do
116
+ @config.environment = :staging
117
+ @config.target = :files
118
+ expect(@config.ready?).to be true
119
+ end
120
+ end
121
+
122
+ describe '#merge_hosts' do
123
+ it 'should merge the host configuration into the target' do
124
+ @config.environment = :staging
125
+ @config.target = :data
126
+ expect(@config[:hostname]).to eql('stagingserver')
127
+ end
128
+
129
+ it 'should prefer the local configuration over the host configuration' do
130
+ @config.environment = :staging
131
+ @config.target = :data
132
+ expect(@config[:remote_path]).to eql('/')
133
+ end
134
+ end
135
+
136
+ describe '#merge' do
137
+ it 'merges the given configuration into the current target' do
138
+ default_config = { new_default_value: 'default' }
139
+ @config.environment = :staging
140
+ @config.target = :data
141
+ @config.merge(default_config)
142
+ expect(@config[:new_default_value]).to eql('default')
143
+ end
144
+
145
+ it 'prefers the explicit config over the default values' do
146
+ default_config = { remote_path: '/default' }
147
+ @config.environment = :staging
148
+ @config.target = :data
149
+ @config.merge(default_config)
150
+ expect(@config[:remote_path]).to eql('/')
151
+ end
152
+ end
153
+
154
+ describe '#path_expansion' do
155
+ it 'keeps absolute paths' do
156
+ @config.environment = :staging
157
+ @config.target = :data
158
+ expect(@config[:absolute_path]).to eql('/absolute')
159
+ end
160
+
161
+ it 'keeps remote paths' do
162
+ @config.environment = :staging
163
+ @config.target = :files
164
+ expect(@config[:remote_path]).to eql('tmp')
165
+ end
166
+
167
+ it 'makes paths absolute' do
168
+ @config.environment = :staging
169
+ @config.target = :data
170
+ expect(@config[:relative_path][0,1]).to eql('/')
171
+ end
172
+
173
+ it 'joins the path, local_path and a given third path' do
174
+ @config.environment = :live
175
+ @config.target = :data
176
+ expect(@config[:relative_path]).to eql('/tmp/Application/SubApplication')
177
+ end
178
+ end
179
+
180
+ describe '#set' do
181
+ it 'should set the environment only' do
182
+ @config.set(:live)
183
+ expect(@config.environment).to eql(:live)
184
+ expect(@config.target).to be_nil
185
+ end
186
+
187
+ it 'should set the environment and the target' do
188
+ @config.set(:live, :data)
189
+ expect(@config.environment).to eql(:live)
190
+ expect(@config.target).to eql(:data)
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,29 @@
1
+ #require 'fulmar/service/helper_service'
2
+ #require 'fulmar/domain/model/configuration'
3
+
4
+ require 'fulmar/domain/service/plugin_service'
5
+
6
+ module Fulmar
7
+ module Plugin
8
+ module MariaDB
9
+ class Database
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ describe Fulmar::Domain::Service::PluginService do
16
+ before :each do
17
+ @plugin_service = Fulmar::Domain::Service::PluginService.instance
18
+ end
19
+
20
+ describe '#classname' do
21
+ it 'returns a module' do
22
+ expect(@plugin_service.classname :maria).to eql(Fulmar::Plugin::MariaDB)
23
+ end
24
+
25
+ it 'returns a class' do
26
+ expect(@plugin_service.classname(:maria, :database)).to eql(Fulmar::Plugin::MariaDB::Database)
27
+ end
28
+ end
29
+ end