ActiveSambaLdap 0.0.7

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 (180) hide show
  1. data/NEWS.en +40 -0
  2. data/NEWS.ja +44 -0
  3. data/README.en +366 -0
  4. data/README.ja +361 -0
  5. data/Rakefile +168 -0
  6. data/bin/asl-groupadd +73 -0
  7. data/bin/asl-groupadd.help +1 -0
  8. data/bin/asl-groupdel +61 -0
  9. data/bin/asl-groupdel.help +1 -0
  10. data/bin/asl-groupmod +137 -0
  11. data/bin/asl-groupmod.help +1 -0
  12. data/bin/asl-groupshow +33 -0
  13. data/bin/asl-groupshow.help +1 -0
  14. data/bin/asl-passwd +90 -0
  15. data/bin/asl-passwd.help +1 -0
  16. data/bin/asl-populate +101 -0
  17. data/bin/asl-populate.help +1 -0
  18. data/bin/asl-purge +26 -0
  19. data/bin/asl-purge.help +1 -0
  20. data/bin/asl-samba-computeradd +96 -0
  21. data/bin/asl-samba-computeradd.help +1 -0
  22. data/bin/asl-samba-groupadd +57 -0
  23. data/bin/asl-samba-groupadd.help +1 -0
  24. data/bin/asl-samba-groupdel +55 -0
  25. data/bin/asl-samba-groupdel.help +1 -0
  26. data/bin/asl-samba-groupmod +99 -0
  27. data/bin/asl-samba-groupmod.help +1 -0
  28. data/bin/asl-samba-useradd +100 -0
  29. data/bin/asl-samba-useradd.help +1 -0
  30. data/bin/asl-samba-userdel +49 -0
  31. data/bin/asl-samba-userdel.help +1 -0
  32. data/bin/asl-samba-usermod +94 -0
  33. data/bin/asl-samba-usermod.help +1 -0
  34. data/bin/asl-useradd +264 -0
  35. data/bin/asl-useradd.help +1 -0
  36. data/bin/asl-userdel +84 -0
  37. data/bin/asl-userdel.help +1 -0
  38. data/bin/asl-usermod +335 -0
  39. data/bin/asl-usermod.help +1 -0
  40. data/bin/asl-usershow +33 -0
  41. data/bin/asl-usershow.help +1 -0
  42. data/lib/active_samba_ldap.rb +42 -0
  43. data/lib/active_samba_ldap/account_entry.rb +208 -0
  44. data/lib/active_samba_ldap/base.rb +137 -0
  45. data/lib/active_samba_ldap/command.rb +100 -0
  46. data/lib/active_samba_ldap/computer.rb +24 -0
  47. data/lib/active_samba_ldap/computer_account_entry.rb +34 -0
  48. data/lib/active_samba_ldap/configuration.rb +333 -0
  49. data/lib/active_samba_ldap/dc.rb +19 -0
  50. data/lib/active_samba_ldap/entry.rb +81 -0
  51. data/lib/active_samba_ldap/get_text_support.rb +12 -0
  52. data/lib/active_samba_ldap/group.rb +17 -0
  53. data/lib/active_samba_ldap/group_entry.rb +187 -0
  54. data/lib/active_samba_ldap/idmap.rb +19 -0
  55. data/lib/active_samba_ldap/ou.rb +20 -0
  56. data/lib/active_samba_ldap/populate.rb +257 -0
  57. data/lib/active_samba_ldap/reloadable.rb +15 -0
  58. data/lib/active_samba_ldap/samba_account_entry.rb +225 -0
  59. data/lib/active_samba_ldap/samba_entry.rb +26 -0
  60. data/lib/active_samba_ldap/samba_group_entry.rb +143 -0
  61. data/lib/active_samba_ldap/unix_id_pool.rb +43 -0
  62. data/lib/active_samba_ldap/user.rb +44 -0
  63. data/lib/active_samba_ldap/user_account_entry.rb +30 -0
  64. data/lib/active_samba_ldap/version.rb +3 -0
  65. data/lib/samba/encrypt.rb +86 -0
  66. data/misc/rd2html.rb +42 -0
  67. data/po/ja/active-samba-ldap.po +465 -0
  68. data/rails/README +30 -0
  69. data/rails/init.rb +33 -0
  70. data/rails_generators/scaffold_active_samba_ldap/scaffold_active_samba_ldap_generator.rb +27 -0
  71. data/rails_generators/scaffold_active_samba_ldap/templates/computer.rb +3 -0
  72. data/rails_generators/scaffold_active_samba_ldap/templates/dc.rb +3 -0
  73. data/rails_generators/scaffold_active_samba_ldap/templates/group.rb +3 -0
  74. data/rails_generators/scaffold_active_samba_ldap/templates/idmap.rb +3 -0
  75. data/rails_generators/scaffold_active_samba_ldap/templates/ldap.yml +24 -0
  76. data/rails_generators/scaffold_active_samba_ldap/templates/ou.rb +3 -0
  77. data/rails_generators/scaffold_active_samba_ldap/templates/samba_controller.rb +12 -0
  78. data/rails_generators/scaffold_active_samba_ldap/templates/samba_helper.rb +2 -0
  79. data/rails_generators/scaffold_active_samba_ldap/templates/samba_index.rhtml +17 -0
  80. data/rails_generators/scaffold_active_samba_ldap/templates/samba_populate.rhtml +15 -0
  81. data/rails_generators/scaffold_active_samba_ldap/templates/samba_purge.rhtml +10 -0
  82. data/rails_generators/scaffold_active_samba_ldap/templates/unix_id_pool.rb +3 -0
  83. data/rails_generators/scaffold_active_samba_ldap/templates/user.rb +3 -0
  84. data/setup.rb +1585 -0
  85. data/test-unit/History.txt +107 -0
  86. data/test-unit/README.txt +52 -0
  87. data/test-unit/Rakefile +40 -0
  88. data/test-unit/TODO +5 -0
  89. data/test-unit/bin/testrb +5 -0
  90. data/test-unit/lib/test/unit.rb +342 -0
  91. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  92. data/test-unit/lib/test/unit/assertions.rb +1149 -0
  93. data/test-unit/lib/test/unit/attribute.rb +125 -0
  94. data/test-unit/lib/test/unit/autorunner.rb +329 -0
  95. data/test-unit/lib/test/unit/collector.rb +43 -0
  96. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  97. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  98. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  99. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  100. data/test-unit/lib/test/unit/color-scheme.rb +86 -0
  101. data/test-unit/lib/test/unit/color.rb +96 -0
  102. data/test-unit/lib/test/unit/diff.rb +538 -0
  103. data/test-unit/lib/test/unit/error.rb +124 -0
  104. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  105. data/test-unit/lib/test/unit/failure.rb +110 -0
  106. data/test-unit/lib/test/unit/fixture.rb +176 -0
  107. data/test-unit/lib/test/unit/notification.rb +125 -0
  108. data/test-unit/lib/test/unit/omission.rb +143 -0
  109. data/test-unit/lib/test/unit/pending.rb +146 -0
  110. data/test-unit/lib/test/unit/priority.rb +181 -0
  111. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  112. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  113. data/test-unit/lib/test/unit/testcase.rb +425 -0
  114. data/test-unit/lib/test/unit/testresult.rb +89 -0
  115. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  116. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  117. data/test-unit/lib/test/unit/ui/console/testrunner.rb +223 -0
  118. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  119. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  120. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  121. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  122. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  123. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  124. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  125. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  126. data/test-unit/lib/test/unit/version.rb +7 -0
  127. data/test-unit/sample/adder.rb +13 -0
  128. data/test-unit/sample/subtracter.rb +12 -0
  129. data/test-unit/sample/tc_adder.rb +18 -0
  130. data/test-unit/sample/tc_subtracter.rb +18 -0
  131. data/test-unit/sample/test_user.rb +22 -0
  132. data/test-unit/sample/ts_examples.rb +7 -0
  133. data/test-unit/test/collector/test-descendant.rb +135 -0
  134. data/test-unit/test/collector/test-load.rb +333 -0
  135. data/test-unit/test/collector/test_dir.rb +406 -0
  136. data/test-unit/test/collector/test_objectspace.rb +98 -0
  137. data/test-unit/test/run-test.rb +13 -0
  138. data/test-unit/test/test-attribute.rb +86 -0
  139. data/test-unit/test/test-color-scheme.rb +56 -0
  140. data/test-unit/test/test-color.rb +47 -0
  141. data/test-unit/test/test-diff.rb +477 -0
  142. data/test-unit/test/test-emacs-runner.rb +60 -0
  143. data/test-unit/test/test-fixture.rb +287 -0
  144. data/test-unit/test/test-notification.rb +33 -0
  145. data/test-unit/test/test-omission.rb +81 -0
  146. data/test-unit/test/test-pending.rb +70 -0
  147. data/test-unit/test/test-priority.rb +119 -0
  148. data/test-unit/test/test-testcase.rb +507 -0
  149. data/test-unit/test/test_assertions.rb +1082 -0
  150. data/test-unit/test/test_error.rb +26 -0
  151. data/test-unit/test/test_failure.rb +33 -0
  152. data/test-unit/test/test_testresult.rb +113 -0
  153. data/test-unit/test/test_testsuite.rb +129 -0
  154. data/test-unit/test/testunit-test-util.rb +14 -0
  155. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  156. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  157. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  158. data/test-unit/test/util/test_observable.rb +102 -0
  159. data/test-unit/test/util/test_procwrapper.rb +36 -0
  160. data/test/asl-test-utils.rb +276 -0
  161. data/test/command.rb +67 -0
  162. data/test/config.yaml.sample +17 -0
  163. data/test/run-test.rb +20 -0
  164. data/test/test_asl_groupadd.rb +69 -0
  165. data/test/test_asl_groupdel.rb +88 -0
  166. data/test/test_asl_groupmod.rb +259 -0
  167. data/test/test_asl_groupshow.rb +21 -0
  168. data/test/test_asl_passwd.rb +126 -0
  169. data/test/test_asl_populate.rb +92 -0
  170. data/test/test_asl_purge.rb +21 -0
  171. data/test/test_asl_useradd.rb +712 -0
  172. data/test/test_asl_userdel.rb +75 -0
  173. data/test/test_asl_usermod.rb +549 -0
  174. data/test/test_asl_usershow.rb +27 -0
  175. data/test/test_entry.rb +21 -0
  176. data/test/test_group.rb +21 -0
  177. data/test/test_password.rb +51 -0
  178. data/test/test_samba_encrypt.rb +35 -0
  179. data/test/test_user_home_directory.rb +43 -0
  180. metadata +314 -0
@@ -0,0 +1,43 @@
1
+ module Test
2
+ module Unit
3
+ module Collector
4
+ def initialize
5
+ @filters = []
6
+ end
7
+
8
+ def filter=(filters)
9
+ @filters = case(filters)
10
+ when Proc
11
+ [filters]
12
+ when Array
13
+ filters
14
+ end
15
+ end
16
+
17
+ def add_suite(destination, suite)
18
+ to_delete = suite.tests.find_all{|t| !include?(t)}
19
+ to_delete.each{|t| suite.delete(t)}
20
+ destination << suite unless(suite.size == 0)
21
+ end
22
+
23
+ def include?(test)
24
+ return true if(@filters.empty?)
25
+ @filters.each do |filter|
26
+ result = filter[test]
27
+ if(result.nil?)
28
+ next
29
+ elsif(!result)
30
+ return false
31
+ else
32
+ return true
33
+ end
34
+ end
35
+ true
36
+ end
37
+
38
+ def sort(suites)
39
+ suites.sort_by {|suite| suite.name || suite.to_s}
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'test/unit/collector'
2
+
3
+ module Test
4
+ module Unit
5
+ module Collector
6
+ class Descendant
7
+ include Collector
8
+
9
+ NAME = 'collected from the subclasses of TestCase'
10
+
11
+ def collect(name=NAME)
12
+ suite = TestSuite.new(name)
13
+ sub_suites = []
14
+ TestCase::DESCENDANTS.each do |descendant_test_case|
15
+ add_suite(sub_suites, descendant_test_case.suite)
16
+ end
17
+ sort(sub_suites).each {|s| suite << s}
18
+ suite
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,108 @@
1
+ require 'test/unit/testsuite'
2
+ require 'test/unit/collector'
3
+
4
+ module Test
5
+ module Unit
6
+ module Collector
7
+ class Dir
8
+ include Collector
9
+
10
+ attr_reader :pattern, :exclude
11
+ attr_accessor :base
12
+
13
+ def initialize(dir=::Dir, file=::File, object_space=::ObjectSpace, req=nil)
14
+ super()
15
+ @dir = dir
16
+ @file = file
17
+ @object_space = object_space
18
+ @req = req
19
+ @pattern = [/\btest_.*\.rb\Z/m]
20
+ @exclude = []
21
+ @base = nil
22
+ end
23
+
24
+ def collect(*from)
25
+ basedir = @base
26
+ $:.push(basedir) if basedir
27
+ if(from.empty?)
28
+ recursive_collect('.', find_test_cases)
29
+ elsif(from.size == 1)
30
+ recursive_collect(from.first, find_test_cases)
31
+ else
32
+ suites = []
33
+ from.each do |f|
34
+ suite = recursive_collect(f, find_test_cases)
35
+ suites << suite unless(suite.tests.empty?)
36
+ end
37
+ suite = TestSuite.new("[#{from.join(', ')}]")
38
+ sort(suites).each{|s| suite << s}
39
+ suite
40
+ end
41
+ ensure
42
+ $:.delete_at($:.rindex(basedir)) if basedir
43
+ end
44
+
45
+ def find_test_cases(ignore=[])
46
+ cases = []
47
+ @object_space.each_object(Class) do |c|
48
+ cases << c if(c < TestCase && !ignore.include?(c))
49
+ end
50
+ ignore.concat(cases)
51
+ cases
52
+ end
53
+
54
+ def recursive_collect(name, already_gathered)
55
+ sub_suites = []
56
+ path = realdir(name)
57
+ if @file.directory?(path)
58
+ dir_name = name unless name == '.'
59
+ @dir.entries(path).each do |e|
60
+ next if(e == '.' || e == '..')
61
+ e_name = dir_name ? @file.join(dir_name, e) : e
62
+ if @file.directory?(realdir(e_name))
63
+ next if /\A(?:CVS|\.svn)\z/ =~ e
64
+ sub_suite = recursive_collect(e_name, already_gathered)
65
+ sub_suites << sub_suite unless(sub_suite.empty?)
66
+ else
67
+ next if /~\z/ =~ e_name or /\A\.\#/ =~ e
68
+ if @pattern and !@pattern.empty?
69
+ next unless @pattern.any? {|pat| pat =~ e_name}
70
+ end
71
+ if @exclude and !@exclude.empty?
72
+ next if @exclude.any? {|pat| pat =~ e_name}
73
+ end
74
+ collect_file(e_name, sub_suites, already_gathered)
75
+ end
76
+ end
77
+ else
78
+ collect_file(name, sub_suites, already_gathered)
79
+ end
80
+ suite = TestSuite.new(@file.basename(name))
81
+ sort(sub_suites).each{|s| suite << s}
82
+ suite
83
+ end
84
+
85
+ def collect_file(name, suites, already_gathered)
86
+ dir = @file.dirname(@file.expand_path(name, @base))
87
+ $:.unshift(dir)
88
+ if(@req)
89
+ @req.require(name)
90
+ else
91
+ require(name)
92
+ end
93
+ find_test_cases(already_gathered).each{|t| add_suite(suites, t.suite)}
94
+ ensure
95
+ $:.delete_at($:.rindex(dir)) if(dir)
96
+ end
97
+
98
+ def realdir(path)
99
+ if @base
100
+ @file.join(@base, path)
101
+ else
102
+ path
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,135 @@
1
+ require 'pathname'
2
+
3
+ require 'test/unit/testsuite'
4
+ require 'test/unit/collector'
5
+
6
+ module Test
7
+ module Unit
8
+ module Collector
9
+ class Load
10
+ include Collector
11
+
12
+ attr_reader :patterns, :excludes, :base
13
+
14
+ def initialize
15
+ super
16
+ @system_excludes = [/~\z/, /\A\.\#/]
17
+ @system_directory_excludes = [/\A(?:CVS|\.svn)\z/]
18
+ @patterns = [/\Atest[_\-].+\.rb\z/m]
19
+ @excludes = []
20
+ @base = nil
21
+ end
22
+
23
+ def base=(base)
24
+ base = Pathname(base) unless base.nil?
25
+ @base = base
26
+ end
27
+
28
+ def collect(*froms)
29
+ add_load_path(@base) do
30
+ froms = ["."] if froms.empty?
31
+ test_suites = froms.collect do |from|
32
+ test_suite = collect_recursive(from, find_test_cases)
33
+ test_suite = nil if test_suite.tests.empty?
34
+ test_suite
35
+ end.compact
36
+
37
+ if test_suites.size > 1
38
+ test_suite = TestSuite.new("[#{froms.join(', ')}]")
39
+ sort(test_suites).each do |sub_test_suite|
40
+ test_suite << sub_test_suite
41
+ end
42
+ test_suite
43
+ else
44
+ test_suites.first
45
+ end
46
+ end
47
+ end
48
+
49
+ def find_test_cases(ignore=[])
50
+ test_cases = []
51
+ TestCase::DESCENDANTS.each do |test_case|
52
+ test_cases << test_case unless ignore.include?(test_case)
53
+ end
54
+ ignore.concat(test_cases)
55
+ test_cases
56
+ end
57
+
58
+ private
59
+ def collect_recursive(name, already_gathered)
60
+ sub_test_suites = []
61
+
62
+ path = resolve_path(name)
63
+ if path.directory?
64
+ directories, files = path.children.partition do |child|
65
+ child.directory?
66
+ end
67
+
68
+ files.each do |child|
69
+ next if excluded_file?(child.basename.to_s)
70
+ collect_file(child, sub_test_suites, already_gathered)
71
+ end
72
+
73
+ directories.each do |child|
74
+ next if excluded_directory?(child.basename.to_s)
75
+ sub_test_suite = collect_recursive(child, already_gathered)
76
+ sub_test_suites << sub_test_suite unless sub_test_suite.empty?
77
+ end
78
+ else
79
+ collect_file(path, sub_test_suites, already_gathered)
80
+ end
81
+
82
+ test_suite = TestSuite.new(path.basename.to_s)
83
+ sort(sub_test_suites).each do |sub_test_suite|
84
+ test_suite << sub_test_suite
85
+ end
86
+ test_suite
87
+ end
88
+
89
+ def collect_file(path, test_suites, already_gathered)
90
+ add_load_path(path.expand_path.dirname) do
91
+ require(path.to_s)
92
+ find_test_cases(already_gathered).each do |test_case|
93
+ add_suite(test_suites, test_case.suite)
94
+ end
95
+ end
96
+ end
97
+
98
+ def resolve_path(path)
99
+ if @base
100
+ @base + path
101
+ else
102
+ Pathname(path)
103
+ end
104
+ end
105
+
106
+ def add_load_path(path)
107
+ $LOAD_PATH.push(path.to_s) if path
108
+ yield
109
+ ensure
110
+ $LOAD_PATH.delete_at($LOAD_PATH.rindex(path.to_s)) if path
111
+ end
112
+
113
+ def excluded_directory?(base)
114
+ @system_directory_excludes.any? {|pattern| pattern =~ base}
115
+ end
116
+
117
+ def excluded_file?(base)
118
+ return true if @system_excludes.any? {|pattern| pattern =~ base}
119
+
120
+ patterns = @patterns || []
121
+ unless patterns.empty?
122
+ return true unless patterns.any? {|pattern| pattern =~ base}
123
+ end
124
+
125
+ excludes = @excludes || []
126
+ unless excludes.empty?
127
+ return true if excludes.any? {|pattern| pattern =~ base}
128
+ end
129
+
130
+ false
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,34 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit/collector'
6
+
7
+ module Test
8
+ module Unit
9
+ module Collector
10
+ class ObjectSpace
11
+ include Collector
12
+
13
+ NAME = 'collected from the ObjectSpace'
14
+
15
+ def initialize(source=::ObjectSpace)
16
+ super()
17
+ @source = source
18
+ end
19
+
20
+ def collect(name=NAME)
21
+ suite = TestSuite.new(name)
22
+ sub_suites = []
23
+ @source.each_object(Class) do |klass|
24
+ if(Test::Unit::TestCase > klass)
25
+ add_suite(sub_suites, klass.suite)
26
+ end
27
+ end
28
+ sort(sub_suites).each{|s| suite << s}
29
+ suite
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,86 @@
1
+ require 'test/unit/color'
2
+
3
+ module Test
4
+ module Unit
5
+ class ColorScheme
6
+ include Enumerable
7
+
8
+ class << self
9
+ @@default = nil
10
+ def default
11
+ @@default ||= new("success" => Color.new("green", :bold => true),
12
+ "failure" => Color.new("red", :bold => true),
13
+ "pending" => Color.new("magenta", :bold => true),
14
+ "omission" => Color.new("blue", :bold => true),
15
+ "notification" => Color.new("cyan", :bold => true),
16
+ "error" => Color.new("yellow", :bold => true) +
17
+ Color.new("black", :foreground => false))
18
+ end
19
+
20
+ @@schemes = {}
21
+ def all
22
+ @@schemes.merge("default" => default)
23
+ end
24
+
25
+ def [](id)
26
+ @@schemes[id.to_s]
27
+ end
28
+
29
+ def []=(id, scheme_or_spec)
30
+ if scheme_or_spec.is_a?(self)
31
+ scheme = scheme_or_spec
32
+ else
33
+ scheme = new(scheme_or_spec)
34
+ end
35
+ @@schemes[id.to_s] = scheme
36
+ end
37
+ end
38
+
39
+ def initialize(scheme_spec)
40
+ @scheme = {}
41
+ scheme_spec.each do |key, color_spec|
42
+ self[key] = color_spec
43
+ end
44
+ end
45
+
46
+ def [](name)
47
+ @scheme[name.to_s]
48
+ end
49
+
50
+ def []=(name, color_spec)
51
+ @scheme[name.to_s] = make_color(color_spec)
52
+ end
53
+
54
+ def each(&block)
55
+ @scheme.each(&block)
56
+ end
57
+
58
+ def to_hash
59
+ hash = {}
60
+ @scheme.each do |key, color|
61
+ hash[key] = color
62
+ end
63
+ hash
64
+ end
65
+
66
+ private
67
+ def make_color(color_spec)
68
+ if color_spec.is_a?(Color) or color_spec.is_a?(MixColor)
69
+ color_spec
70
+ else
71
+ color_name = nil
72
+ normalized_color_spec = {}
73
+ color_spec.each do |key, value|
74
+ key = key.to_sym
75
+ if key == :name
76
+ color_name = value
77
+ else
78
+ normalized_color_spec[key] = value
79
+ end
80
+ end
81
+ Color.new(color_name, normalized_color_spec)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,96 @@
1
+ module Test
2
+ module Unit
3
+ class Color
4
+ NAMES = ["black", "red", "green", "yellow",
5
+ "blue", "magenta", "cyan", "white"]
6
+
7
+ attr_reader :name
8
+ def initialize(name, options={})
9
+ @name = name
10
+ @foreground = options[:foreground]
11
+ @foreground = true if @foreground.nil?
12
+ @intensity = options[:intensity]
13
+ @bold = options[:bold]
14
+ @italic = options[:italic]
15
+ @underline = options[:underline]
16
+ end
17
+
18
+ def foreground?
19
+ @foreground
20
+ end
21
+
22
+ def intensity?
23
+ @intensity
24
+ end
25
+
26
+ def bold?
27
+ @bold
28
+ end
29
+
30
+ def italic?
31
+ @italic
32
+ end
33
+
34
+ def underline?
35
+ @underline
36
+ end
37
+
38
+ def ==(other)
39
+ self.class === other and
40
+ [name, foreground?, intensity?,
41
+ bold?, italic?, underline?] ==
42
+ [other.name, other.foreground?, other.intensity?,
43
+ other.bold?, other.italic?, other.underline?]
44
+ end
45
+
46
+ def sequence
47
+ sequence = []
48
+ if @name == "none"
49
+ elsif @name == "reset"
50
+ sequence << "0"
51
+ else
52
+ foreground_parameter = foreground? ? 3 : 4
53
+ foreground_parameter += 6 if intensity?
54
+ sequence << "#{foreground_parameter}#{NAMES.index(@name)}"
55
+ end
56
+ sequence << "1" if bold?
57
+ sequence << "3" if italic?
58
+ sequence << "4" if underline?
59
+ sequence
60
+ end
61
+
62
+ def escape_sequence
63
+ "\e[#{sequence.join(';')}m"
64
+ end
65
+
66
+ def +(other)
67
+ MixColor.new([self, other])
68
+ end
69
+ end
70
+
71
+ class MixColor
72
+ attr_reader :colors
73
+ def initialize(colors)
74
+ @colors = colors
75
+ end
76
+
77
+ def sequence
78
+ @colors.inject([]) do |result, color|
79
+ result + color.sequence
80
+ end
81
+ end
82
+
83
+ def escape_sequence
84
+ "\e[#{sequence.join(';')}m"
85
+ end
86
+
87
+ def +(other)
88
+ self.class.new([self, other])
89
+ end
90
+
91
+ def ==(other)
92
+ self.class === other and colors == other.colors
93
+ end
94
+ end
95
+ end
96
+ end