siba 0.4.3

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 (159) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +4 -0
  3. data/Guardfile +18 -0
  4. data/LICENSE +22 -0
  5. data/README.md +47 -0
  6. data/Rakefile +27 -0
  7. data/bin/siba +5 -0
  8. data/lib/siba.rb +27 -0
  9. data/lib/siba/backup.rb +31 -0
  10. data/lib/siba/console.rb +196 -0
  11. data/lib/siba/errors.rb +8 -0
  12. data/lib/siba/generator.rb +115 -0
  13. data/lib/siba/globals.rb +19 -0
  14. data/lib/siba/helpers/encoding_helper.rb +38 -0
  15. data/lib/siba/helpers/file_helper.rb +89 -0
  16. data/lib/siba/helpers/gem_helper.rb +22 -0
  17. data/lib/siba/helpers/password_strength.rb +94 -0
  18. data/lib/siba/helpers/security_helper.rb +30 -0
  19. data/lib/siba/helpers/string_helper.rb +32 -0
  20. data/lib/siba/helpers/test/extend_test.rb +114 -0
  21. data/lib/siba/helpers/test/file_mock.rb +38 -0
  22. data/lib/siba/helpers/test/helper.rb +55 -0
  23. data/lib/siba/helpers/test/kernel_mock.rb +44 -0
  24. data/lib/siba/helpers/test/removable_constants.rb +18 -0
  25. data/lib/siba/helpers/test/require.rb +12 -0
  26. data/lib/siba/logger_plug.rb +36 -0
  27. data/lib/siba/options_backup.rb +37 -0
  28. data/lib/siba/options_loader.rb +38 -0
  29. data/lib/siba/plugins/archive/tar/archive.rb +117 -0
  30. data/lib/siba/plugins/archive/tar/init.rb +38 -0
  31. data/lib/siba/plugins/archive/tar/options.yml +1 -0
  32. data/lib/siba/plugins/destination/dir/dest_dir.rb +77 -0
  33. data/lib/siba/plugins/destination/dir/init.rb +31 -0
  34. data/lib/siba/plugins/destination/dir/options.yml +2 -0
  35. data/lib/siba/plugins/encryption/gpg/encryption.rb +140 -0
  36. data/lib/siba/plugins/encryption/gpg/init.rb +45 -0
  37. data/lib/siba/plugins/encryption/gpg/options.yml +2 -0
  38. data/lib/siba/plugins/installed_plugins.rb +77 -0
  39. data/lib/siba/plugins/plugin_loader.rb +100 -0
  40. data/lib/siba/plugins/plugins.rb +57 -0
  41. data/lib/siba/plugins/plugins.yml +9 -0
  42. data/lib/siba/plugins/source/files/files.rb +166 -0
  43. data/lib/siba/plugins/source/files/init.rb +33 -0
  44. data/lib/siba/plugins/source/files/options.yml +11 -0
  45. data/lib/siba/restore.rb +113 -0
  46. data/lib/siba/scaffold.rb +166 -0
  47. data/lib/siba/siba_check.rb +75 -0
  48. data/lib/siba/siba_file.rb +89 -0
  49. data/lib/siba/siba_kernel.rb +37 -0
  50. data/lib/siba/siba_logger.rb +172 -0
  51. data/lib/siba/tasks/siba_task.rb +42 -0
  52. data/lib/siba/tasks/siba_tasks.rb +120 -0
  53. data/lib/siba/test_files.rb +76 -0
  54. data/lib/siba/test_files/a_file +1 -0
  55. data/lib/siba/test_files/files_and_dirs/.hidden +1 -0
  56. data/lib/siba/test_files/files_and_dirs/.hidden_dir/file10 +1 -0
  57. data/lib/siba/test_files/files_and_dirs/File With Spaces +1 -0
  58. data/lib/siba/test_files/files_and_dirs/dir1/file10 +1 -0
  59. data/lib/siba/test_files/files_and_dirs/dir1/sub-dir/file111.txt +1 -0
  60. data/lib/siba/test_files/files_and_dirs/file1 +1 -0
  61. data/lib/siba/test_files/files_and_dirs/file2.txt +1 -0
  62. data/lib/siba/tmp_dir.rb +94 -0
  63. data/lib/siba/version.rb +5 -0
  64. data/scaffolds/archive.rb +26 -0
  65. data/scaffolds/destination.rb +20 -0
  66. data/scaffolds/encryption.rb +26 -0
  67. data/scaffolds/project/.gitignore +5 -0
  68. data/scaffolds/project/Gemfile +4 -0
  69. data/scaffolds/project/Guardfile +9 -0
  70. data/scaffolds/project/LICENSE +22 -0
  71. data/scaffolds/project/README.md +33 -0
  72. data/scaffolds/project/Rakefile +28 -0
  73. data/scaffolds/project/lib/siba-c6y-demo.rb +11 -0
  74. data/scaffolds/project/lib/siba-c6y-demo/options.yml +2 -0
  75. data/scaffolds/project/lib/siba-c6y-demo/version.rb +9 -0
  76. data/scaffolds/project/siba-c6y-demo.gemspec +26 -0
  77. data/scaffolds/project/test/helper/require_integration.rb +5 -0
  78. data/scaffolds/project/test/helper/require_unit.rb +4 -0
  79. data/scaffolds/project/test/integration/i9n_init.rb +35 -0
  80. data/scaffolds/project/test/unit/test_init.rb +43 -0
  81. data/scaffolds/project/test/unit/yml/valid.yml +8 -0
  82. data/scaffolds/shared/examples.rb +47 -0
  83. data/scaffolds/shared/init_example.rb +13 -0
  84. data/scaffolds/source.rb +25 -0
  85. data/siba.gemspec +30 -0
  86. data/test/helper/require_integration.rb +4 -0
  87. data/test/helper/require_unit.rb +4 -0
  88. data/test/integration/helpers/i9n_file_helper.rb +50 -0
  89. data/test/integration/i9n_backup.rb +53 -0
  90. data/test/integration/i9n_console.rb +16 -0
  91. data/test/integration/i9n_generator.rb +29 -0
  92. data/test/integration/i9n_options_backup.rb +22 -0
  93. data/test/integration/i9n_scaffold.rb +27 -0
  94. data/test/integration/i9n_siba_file.rb +30 -0
  95. data/test/integration/i9n_test_unicode_files.rb +40 -0
  96. data/test/integration/i9n_tmp_dir.rb +44 -0
  97. data/test/integration/plugins/archive/tar/i9n_archive.rb +18 -0
  98. data/test/integration/plugins/destination/dir/i9n_dest_dir.rb +52 -0
  99. data/test/integration/plugins/encryption/gpg/i9n_encryption.rb +87 -0
  100. data/test/integration/plugins/i9n_installed_plugins.rb +13 -0
  101. data/test/integration/plugins/source/files/i9n_files.rb +146 -0
  102. data/test/integration/tasks/i9n_siba_tasks.rb +30 -0
  103. data/test/integration/yml/valid.yml +16 -0
  104. data/test/unit/helpers/test_encoding_helper.rb +17 -0
  105. data/test/unit/helpers/test_gem_helper.rb +17 -0
  106. data/test/unit/helpers/test_security_helper.rb +21 -0
  107. data/test/unit/helpers/test_string_helper.rb +35 -0
  108. data/test/unit/plugins/archive/tar/test_archive.rb +41 -0
  109. data/test/unit/plugins/archive/tar/test_init.rb +36 -0
  110. data/test/unit/plugins/archive/tar/yml/archive/check_installed.yml +2 -0
  111. data/test/unit/plugins/archive/tar/yml/init/default_compression.yml +1 -0
  112. data/test/unit/plugins/archive/tar/yml/init/invalid_compression.yml +2 -0
  113. data/test/unit/plugins/archive/tar/yml/init/valid.yml +2 -0
  114. data/test/unit/plugins/destination/dir/test_dest_dir.rb +41 -0
  115. data/test/unit/plugins/destination/dir/test_init.rb +36 -0
  116. data/test/unit/plugins/destination/dir/yml/init/valid.yml +2 -0
  117. data/test/unit/plugins/encryption/gpg/test_encryption.rb +70 -0
  118. data/test/unit/plugins/encryption/gpg/test_init.rb +47 -0
  119. data/test/unit/plugins/source/files/test_files.rb +44 -0
  120. data/test/unit/plugins/source/files/test_init.rb +48 -0
  121. data/test/unit/plugins/source/files/test_path_match.rb +140 -0
  122. data/test/unit/plugins/source/files/yml/ignore_list.yml +8 -0
  123. data/test/unit/plugins/source/files/yml/ignore_not_array.yml +5 -0
  124. data/test/unit/plugins/source/files/yml/include_not_array.yml +3 -0
  125. data/test/unit/plugins/source/files/yml/include_subdirs_false.yml +6 -0
  126. data/test/unit/plugins/source/files/yml/include_subdirs_missing.yml +5 -0
  127. data/test/unit/plugins/source/files/yml/no_ignore.yml +4 -0
  128. data/test/unit/plugins/source/files/yml/no_include.yml +1 -0
  129. data/test/unit/plugins/source/files/yml/valid.yml +9 -0
  130. data/test/unit/plugins/test_installed_plugins.rb +32 -0
  131. data/test/unit/plugins/test_plugin_loader.rb +27 -0
  132. data/test/unit/plugins/test_plugins.rb +44 -0
  133. data/test/unit/tasks/test_siba_task.rb +30 -0
  134. data/test/unit/tasks/test_siba_tasks.rb +84 -0
  135. data/test/unit/tasks/yml/task/invalid.yml +4 -0
  136. data/test/unit/tasks/yml/task/valid.yml +7 -0
  137. data/test/unit/test_backup.rb +18 -0
  138. data/test/unit/test_console.rb +166 -0
  139. data/test/unit/test_generator.rb +21 -0
  140. data/test/unit/test_globals.rb +34 -0
  141. data/test/unit/test_log_message.rb +26 -0
  142. data/test/unit/test_logger_plug.rb +49 -0
  143. data/test/unit/test_options_backup.rb +21 -0
  144. data/test/unit/test_options_loader.rb +72 -0
  145. data/test/unit/test_password_strength.rb +76 -0
  146. data/test/unit/test_restore.rb +18 -0
  147. data/test/unit/test_scaffold.rb +26 -0
  148. data/test/unit/test_siba_check.rb +118 -0
  149. data/test/unit/test_siba_logger.rb +174 -0
  150. data/test/unit/test_tmp_dir.rb +21 -0
  151. data/test/unit/yml/options_loader/array.yml +2 -0
  152. data/test/unit/yml/options_loader/empty.yml +0 -0
  153. data/test/unit/yml/options_loader/invalid.yml +4 -0
  154. data/test/unit/yml/options_loader/string.yml +1 -0
  155. data/test/unit/yml/options_loader/utf8_with_bom.yml +2 -0
  156. data/test/unit/yml/options_loader/valid.yml +12 -0
  157. data/test/unit/yml/siba_options_backup.yml +20 -0
  158. data/test/unit/yml/valid.yml +18 -0
  159. metadata +240 -0
@@ -0,0 +1,19 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+
5
+ class << self
6
+ include Siba::TmpDirPlug
7
+ include Siba::FilePlug
8
+
9
+ attr_accessor :settings, :backup_name, :current_dir
10
+ Siba.settings = {}
11
+ Siba.current_dir = Siba::FilePlug.siba_file.file_utils_pwd
12
+
13
+ def cleanup
14
+ Siba.cleanup_tmp_dir
15
+ ensure
16
+ LoggerPlug.close
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+ class EncodingHelper
5
+ EXTERNAL_ENCODING = Encoding.find "external"
6
+ INTERNAL_ENCODING = Encoding::UTF_8
7
+
8
+ class << self
9
+ def encode_to_external(value)
10
+ encode value, EXTERNAL_ENCODING, INTERNAL_ENCODING
11
+ end
12
+
13
+ protected
14
+
15
+ def encode(value, dst_encoding, src_encoding=nil)
16
+ return encode_str value, dst_encoding, src_encoding if value.instance_of? String
17
+ return encode_array value, dst_encoding, src_encoding if value.instance_of? Array
18
+ value
19
+ end
20
+
21
+ def encode_str(str, dst_encoding, src_encoding=nil)
22
+ return nil if str.nil?
23
+ return str unless str.instance_of? String
24
+ if str.encoding != dst_encoding
25
+ str = str.encode(dst_encoding, src_encoding, {:invalid => :replace, :undef => :replace})
26
+ end
27
+ str
28
+ end
29
+
30
+ def encode_array(array, dst_encoding, src_encoding=nil)
31
+ return nil if array.nil?
32
+ return array unless array.instance_of? Array
33
+ array.map {|a| encode_str a, dst_encoding, src_encoding}
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,89 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+ class FileHelper
5
+ class << self
6
+ include Siba::FilePlug
7
+
8
+ def dir_empty?(dir)
9
+ entries(dir).empty?
10
+ end
11
+
12
+ def dirs_count(dir)
13
+ entries(dir).count do |a|
14
+ siba_file.file_directory? File.join(dir, a)
15
+ end
16
+ end
17
+
18
+ # Reads a file in UTF-8 encoding
19
+ def read(file)
20
+ str = File.read file, { open_args: ["r:bom|utf-8"]}
21
+ unless str.valid_encoding?
22
+ raise Siba::Error, "Incorrect file encoding. Please save the options with UTF-8 encoding."
23
+ end
24
+ str
25
+ end
26
+
27
+ # Write to file in UTF-8 encoding
28
+ def write(file, data)
29
+ siba_file.file_utils_remove_entry_secure file if siba_file.file_file? file
30
+ siba_file.file_open(file, "w:utf-8") do |file|
31
+ file << data
32
+ end
33
+ end
34
+
35
+ # Used to replace text in file
36
+ # Example:
37
+ # change_file("/path") do |file_text|
38
+ # file_text.gsub "one", "two"
39
+ # end
40
+ def change_file(path_to_file, &block)
41
+ file_text = Siba::FileHelper.read path_to_file
42
+ file_text = block.call file_text
43
+ Siba::FileHelper.write path_to_file, file_text
44
+ end
45
+
46
+ # Retuns an array containing all dir entires except '.' and '..' dirs
47
+ def entries(dir)
48
+ siba_file.dir_entries(dir) - %w{ . .. }
49
+ end
50
+
51
+ # Raises error if dirs are not identical
52
+ def dirs_same?(dir1, dir2)
53
+ dir1_entries = siba_file.dir_entries dir1
54
+ dir2_entries = siba_file.dir_entries dir2
55
+ diff1 = (dir1_entries - dir2_entries).map{|i| File.join(dir1,i)}
56
+ diff2 = (dir2_entries - dir1_entries).map{|i| File.join(dir2,i)}
57
+ diff = diff1 + diff2
58
+ msg = "The directories '#{File.basename(dir1)}' and '#{File.basename(dir2)}' are different: "
59
+ raise Siba::Error, "#{msg}#{diff.take(10).join(', ')}" unless diff.empty?
60
+
61
+ # compare files and directories
62
+ dir1_entries.each do |dir|
63
+ next if dir == "." || dir == ".."
64
+ sub_dir1_entry = File.join dir1, dir
65
+ sub_dir2_entry = File.join dir2, dir
66
+
67
+ # compare files
68
+ if siba_file.file_file? sub_dir1_entry
69
+ raise "#{msg}'#{sub_dir2_entry}' is not a file" unless siba_file.file_file? sub_dir2_entry
70
+ unless siba_file.file_utils_compare_file sub_dir1_entry, sub_dir2_entry
71
+ raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' files are different."
72
+ end
73
+ end
74
+
75
+ # compare permissions
76
+ if (siba_file.file_stat(sub_dir1_entry).mode % 01000) != (siba_file.file_stat(sub_dir2_entry).mode % 01000)
77
+ raise Siba::Error, "#{msg}'#{sub_dir1_entry}' and '#{sub_dir2_entry}' entries have different permissions."
78
+ end
79
+
80
+ # compare sub-dirs
81
+ if siba_file.file_directory? sub_dir1_entry
82
+ raise Siba::Error, "#{msg}'#{sub_dir2_entry}' is not a directory" unless siba_file.file_directory? sub_dir2_entry
83
+ dirs_same? sub_dir1_entry, sub_dir2_entry
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+ class GemHelper
5
+ class << self
6
+ def all_local_gems
7
+ @local_gems ||= begin
8
+ Gem::Specification.all = nil
9
+ all = Gem::Specification.to_a
10
+ Gem::Specification.reset
11
+ all
12
+ end
13
+ end
14
+
15
+ def gem_path(name)
16
+ gem_spec = all_local_gems.find {|a| a.name==name}
17
+ raise Siba::Error, "Gem #{name} is not installed" if gem_spec.nil?
18
+ gem_spec.full_gem_path
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,94 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+ # Password strength calculator based on:
5
+ # http://snippets.dzone.com/posts/show/4698
6
+ # https://www.grc.com/haystack.htm
7
+ class PasswordStrength
8
+ PASSWORD_SETS = {
9
+ /[a-z]/ => 26,
10
+ /[A-Z]/ => 26,
11
+ /[0-9]/ => 10,
12
+ /[^\w]/ => 33
13
+ }
14
+
15
+ AinB = {
16
+ second: 60,
17
+ minute: 60,
18
+ hour: 24,
19
+ day: 30,
20
+ month: 12,
21
+ year: 100,
22
+ century: 1
23
+ }
24
+
25
+ Illions = {
26
+ hundred: 100,
27
+ thousand: 10,
28
+ million: 1000,
29
+ billion: 1000,
30
+ trillion: 1000
31
+ }
32
+
33
+ TRIES_PER_SECOND = 100 * 10 ** 12 # 100 TFLOPS
34
+ AGE_OF_THE_UNIVERSE_SECONDS = 4.336 * 10 ** 17 # the best estimate in 2011
35
+
36
+ class << self
37
+ def seconds_to_crack(password)
38
+ set_size = 0
39
+ PASSWORD_SETS.each_pair {|k,v| set_size += v if password =~ k}
40
+ combinations = 0
41
+ 1.upto(password.length) {|i| combinations += set_size ** i }
42
+ combinations.to_f / TRIES_PER_SECOND
43
+ end
44
+
45
+ # Password is considered weak if it takes less than a year to crack it
46
+ def is_weak?(seconds_to_crack)
47
+ seconds_to_crack < 60 * 60 * 24 * 365
48
+ end
49
+
50
+ # Convert the number of seconds human-friendly timespan string
51
+ # Example:
52
+ # 130: 2 minutes
53
+ # 12345: 3 hours
54
+ def seconds_to_timespan(seconds)
55
+ return "forever" if seconds > AGE_OF_THE_UNIVERSE_SECONDS
56
+ ticks = seconds
57
+ AinB.each_pair do |a,b|
58
+ ticks_next = ticks.to_f / b
59
+ return get_timespan_str ticks, a if ticks_next < 1
60
+ ticks = ticks_next
61
+ end
62
+
63
+ # century or longer
64
+ ticks = ticks.floor
65
+ return get_timespan_str ticks, "century", "centuries" if ticks < 100
66
+ illion_unit, ticks = get_illions ticks
67
+ "#{ticks} #{illion_unit} centuries".strip
68
+ end
69
+
70
+ private
71
+
72
+ def get_timespan_str(ticks, unit, unit_plural=nil)
73
+ ticks = ticks.floor
74
+ return case
75
+ when ticks < 1 then "less than a #{unit}"
76
+ when ticks == 1 then "1 #{unit}"
77
+ else "#{ticks} #{unit_plural || unit.to_s+"s"}"
78
+ end
79
+ end
80
+
81
+ def get_illions(ticks)
82
+ illion_unit = ""
83
+ Illions.each_pair do |a,b|
84
+ ticks_next = ticks.to_f / b
85
+ break if ticks_next < 1
86
+ illion_unit = a
87
+ ticks = ticks_next
88
+ end
89
+
90
+ return illion_unit, ticks.floor
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'securerandom'
4
+
5
+ module Siba
6
+ class SecurityHelper
7
+ class << self
8
+ def generate_password_for_yaml(length = 16)
9
+ characters = (32..126).to_a - "\\\"".bytes.to_a
10
+
11
+ (0...length).map{
12
+ characters[SecureRandom.random_number(characters.size)].chr
13
+ }.join
14
+ end
15
+
16
+ def alphanumeric_password(length = 16, lowercase_only=false, non_ambiguous = false)
17
+ characters = ('a'..'z').to_a + ('0'..'9').to_a
18
+ characters += ('A'..'Z').to_a unless lowercase_only
19
+
20
+ %w{I O l 0 1}.each{ |ambiguous_character|
21
+ characters.delete ambiguous_character
22
+ } if non_ambiguous
23
+
24
+ (0...length).map{
25
+ characters[SecureRandom.random_number(characters.size)]
26
+ }.join
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+
3
+ module Siba
4
+ class StringHelper
5
+ class << self
6
+ # Helps to use a string in URLs and file names by
7
+ # replacing all non-alphanumeric characters with '-'
8
+ # and converting to lowercase
9
+ def str_to_alphnumeric(str)
10
+ str.downcase.gsub(/[^ a-z0-9]/,' ').strip.gsub(/ {1,}/,'-')
11
+ end
12
+
13
+ def nil_or_empty(str)
14
+ str.nil? || str.strip.empty?
15
+ end
16
+
17
+ # Convers a string to CamelCase. Based on Rails ActiveSupport::Inflector.camelize.
18
+ def camelize(str)
19
+ str = str.capitalize
20
+ str.gsub(/(?:_|-)([a-z\d]*)/i) { "#{$1.capitalize}" }
21
+ end
22
+
23
+ def escape_for_yaml(str)
24
+ str.gsub("\\","\\\\\\").gsub("\"","\\\"")
25
+ end
26
+
27
+ def format_time(time)
28
+ time.strftime("%B %e, %Y")
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: UTF-8
2
+
3
+ class MiniTest::Unit::TestCase
4
+ include Siba::FilePlug
5
+ def must_log(level)
6
+ verify_log true, level, true
7
+ end
8
+
9
+ def wont_log(level)
10
+ verify_log false, level, true
11
+ end
12
+
13
+ def must_log_from(level)
14
+ verify_log true, level, false
15
+ end
16
+
17
+ def wont_log_from(level)
18
+ verify_log false, level, false
19
+ end
20
+
21
+ def show_log
22
+ puts Siba::SibaLogger.messages.map{|a| a.msg}.join("\n")
23
+ end
24
+
25
+ def mock_file(name, retval, args=[])
26
+ mock = new_mock_file
27
+ mock.expect name, retval, args
28
+ mock
29
+ end
30
+
31
+ def new_mock_file
32
+ Siba::FilePlug.siba_file = MiniTest::Mock.new
33
+ end
34
+
35
+ def create_plugin(yml_file_name_or_options_hash)
36
+ if yml_file_name_or_options_hash.is_a? String
37
+ load_options yml_file_name_or_options_hash
38
+ else
39
+ @options = yml_file_name_or_options_hash
40
+ end
41
+
42
+ unless @plugin_category
43
+ raise Siba::Error, "Initialize '@plugin_category' variable (#{Siba::Plugins.categories_str})"
44
+ end
45
+
46
+ unless @plugin_type
47
+ raise Siba::Error, "Initialize '@plugin_type' variable with your gem name ('cloud', 'ftp' etc)."
48
+ end
49
+
50
+ Siba::PluginLoader.loader.load(@plugin_category, @plugin_type, @options)
51
+ end
52
+
53
+ def load_options(yml_name)
54
+ unless @yml_path
55
+ raise Siba::Error, "Initialize '@yml_path' variable with the dir to test YAML files."
56
+ end
57
+ yml_name = yml_name + ".yml" unless yml_name =~ /\.yml$/
58
+ @options = SibaTest.load_options File.join(@yml_path, yml_name)
59
+ end
60
+
61
+ def prepare_test_dir(dir_name_part, tmp_dir = nil)
62
+ tmp_dir ||= SibaTest.tmp_dir
63
+ Siba::TestFiles::prepare_test_dir dir_name_part, tmp_dir
64
+ end
65
+
66
+ def prepare_test_file(file_name_part, tmp_dir = nil)
67
+ tmp_dir ||= SibaTest.tmp_dir
68
+ Siba::TestFiles::prepare_test_file file_name_part, tmp_dir
69
+ end
70
+
71
+ def generate_path(file_name_part, tmp_dir = nil)
72
+ tmp_dir ||= SibaTest.tmp_dir
73
+ Siba::TestFiles::generate_path file_name_part, tmp_dir
74
+ end
75
+
76
+ def mkdir_in_tmp_dir(prefix, tmp_dir = nil)
77
+ tmp_dir ||= SibaTest.tmp_dir
78
+ Siba::TestFiles::mkdir_in_tmp_dir prefix, tmp_dir
79
+ end
80
+
81
+ def dirs_same?(a,b)
82
+ Siba::FileHelper::dirs_same? a, b
83
+ end
84
+
85
+ def prepare_options(src_yml_path, replace_data)
86
+ Siba::TestFiles::prepare_options(src_yml_path, replace_data)
87
+ end
88
+
89
+ def prepare_yml(src_yml_path, replace_data, tmp_dir=nil)
90
+ tmp_dir ||= SibaTest.tmp_dir
91
+ Siba::TestFiles::prepare_yml src_yml_path, replace_data, tmp_dir
92
+ end
93
+
94
+ private
95
+
96
+ def verify_log(must_change, log_level, exact_level = true)
97
+ log_count = Siba::SibaLogger.count log_level, exact_level
98
+
99
+ if exact_level
100
+ message = "'#{log_level}' log messages"
101
+ else
102
+ message = "log messages"
103
+ end
104
+
105
+ if must_change
106
+ message = "Expected " + message
107
+ raise message if log_count == 0
108
+ else
109
+ message = "Unexpected " + message
110
+ raise message if log_count > 0
111
+ end
112
+ end
113
+ end
114
+