loris 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. data/.gitignore +2 -0
  2. data/README.rdoc +9 -0
  3. data/Rakefile +41 -0
  4. data/TODO +21 -0
  5. data/VERSION +1 -0
  6. data/bin/loris +15 -0
  7. data/cucumber.yml +1 -0
  8. data/examples/self_test/jsl.conf +1 -0
  9. data/examples/self_test/spec/spec.rhino.js +6 -0
  10. data/features/javascript_lint.feature +34 -0
  11. data/features/run.feature +36 -0
  12. data/features/step_definitons/all.rb +69 -0
  13. data/features/support/env.rb +145 -0
  14. data/lib/always_continuer.rb +7 -0
  15. data/lib/browser_finder.rb +23 -0
  16. data/lib/file_actioner.rb +16 -0
  17. data/lib/file_finder.rb +31 -0
  18. data/lib/filters/ends_with_filter.rb +17 -0
  19. data/lib/filters/extension_filter.rb +20 -0
  20. data/lib/filters/file_filter.rb +14 -0
  21. data/lib/filters/modified_filter.rb +21 -0
  22. data/lib/icons/error.png +0 -0
  23. data/lib/icons/failure.png +0 -0
  24. data/lib/icons/info.png +0 -0
  25. data/lib/icons/success.png +0 -0
  26. data/lib/icons/warning.png +0 -0
  27. data/lib/js-test-driver/JsTestDriver-1.1.jar +0 -0
  28. data/lib/js-test-driver/plugins/coverage-1.1.jar +0 -0
  29. data/lib/loris.rb +170 -0
  30. data/lib/outputs/growl_output.rb +26 -0
  31. data/lib/outputs/output_collection.rb +23 -0
  32. data/lib/outputs/shell_output.rb +17 -0
  33. data/lib/outputs/unix_console_clearing_output.rb +13 -0
  34. data/lib/outputs/windows_console_clearing_output.rb +13 -0
  35. data/lib/pinger.rb +23 -0
  36. data/lib/poller.rb +16 -0
  37. data/lib/sleep_waiter.rb +11 -0
  38. data/lib/task_manager.rb +45 -0
  39. data/lib/tasks/command_line_task.rb +28 -0
  40. data/lib/tasks/javascript_lint/javascript_lint_parser.rb +45 -0
  41. data/lib/tasks/javascript_lint/javascript_lint_runner.rb +25 -0
  42. data/lib/tasks/js_test_driver/js_test_driver_config.rb +22 -0
  43. data/lib/tasks/js_test_driver/js_test_driver_parser.rb +28 -0
  44. data/lib/tasks/js_test_driver/js_test_driver_runner.rb +28 -0
  45. data/lib/tasks/js_test_driver/js_test_driver_server.rb +38 -0
  46. data/lib/tasks/jspec/jspec_parser.rb +30 -0
  47. data/lib/tasks/jspec/jspec_runner.rb +25 -0
  48. data/lib/tasks/list_task.rb +34 -0
  49. data/lib/tasks/rspec/rspec_parser.rb +25 -0
  50. data/lib/tasks/rspec/rspec_runner.rb +25 -0
  51. data/lib/unix_process.rb +7 -0
  52. data/lib/windows_process.rb +12 -0
  53. data/loris.gemspec +133 -0
  54. data/loris.tmproj +232 -0
  55. data/spec/file_actioner_spec.rb +41 -0
  56. data/spec/file_finder_spec.rb +73 -0
  57. data/spec/filters/ends_with_filter_spec.rb +26 -0
  58. data/spec/filters/file_filter_spec.rb +28 -0
  59. data/spec/filters/modified_filter_spec.rb +47 -0
  60. data/spec/growl_output_spec.rb +33 -0
  61. data/spec/list_task_spec.rb +58 -0
  62. data/spec/poller_spec.rb +28 -0
  63. data/spec/shell_output_spec.rb +25 -0
  64. data/spec/task_manager_spec.rb +64 -0
  65. data/spec/tasks/javascript_lint/javascript_lint_runner_spec.rb +90 -0
  66. data/spec/tasks/js_test_driver/js_test_driver_runner_spec.rb +92 -0
  67. data/spec/tasks/jspec/jspec_parser_spec.rb +28 -0
  68. data/spec/tasks/jspec/jspec_runner_spec.rb +78 -0
  69. metadata +174 -0
@@ -0,0 +1,25 @@
1
+ class RSpecParser
2
+
3
+ def parse_result(detail)
4
+ summary_line = detail.grep( /\d+ examples?, \d+ failures?/ )[0]
5
+
6
+ if summary_line.nil?
7
+ # error
8
+ error_info = (detail + "\nUnknown Error!").to_a[0].strip
9
+ return :error, 'Error', error_info
10
+ end
11
+
12
+ if summary_line =~ /([1-9]+) failures?/
13
+ num_errors = $1
14
+
15
+ items = detail.split("\n\n")
16
+
17
+ error_info = items[1].split("\n")[1]
18
+ return :failure, num_errors + ' Errors', error_info
19
+ end
20
+
21
+ return :success, 'All specs pass', ''
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,25 @@
1
+ class RSpecRunner
2
+
3
+ def initialize(dir, ruby_filter, spec_filter)
4
+ @dir = dir
5
+ @ruby_filter = ruby_filter
6
+ @spec_filter = spec_filter
7
+ end
8
+
9
+ def name
10
+ return 'RSpec'
11
+ end
12
+
13
+ def execute
14
+ return `spec . 2>&1`
15
+ end
16
+
17
+ def is_configured?(all_files)
18
+ return !(all_files.detect { |file| @spec_filter.filter(file) }).nil?
19
+ end
20
+
21
+ def should_run?(modified_files)
22
+ return !(modified_files.detect { |file| @ruby_filter.filter(file) }).nil?
23
+ end
24
+
25
+ end
@@ -0,0 +1,7 @@
1
+ class UnixProcess
2
+
3
+ def create(command)
4
+ exec(command) if fork.nil?
5
+ end
6
+
7
+ end
@@ -0,0 +1,12 @@
1
+ require 'win32/process'
2
+
3
+ class WindowsProcess
4
+
5
+ def create(command)
6
+ puts command
7
+ Process.create({
8
+ :app_name => command
9
+ })
10
+ end
11
+
12
+ end
data/loris.gemspec ADDED
@@ -0,0 +1,133 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{loris}
8
+ s.version = "0.0.12"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Karl O'Keeffe"]
12
+ s.date = %q{2009-10-02}
13
+ s.default_executable = %q{loris}
14
+ s.description = %q{Automatically run javascript unit tests}
15
+ s.email = %q{loris@monket.net}
16
+ s.executables = ["loris"]
17
+ s.extra_rdoc_files = [
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".gitignore",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "TODO",
25
+ "VERSION",
26
+ "bin/loris",
27
+ "cucumber.yml",
28
+ "examples/self_test/jsl.conf",
29
+ "examples/self_test/spec/spec.rhino.js",
30
+ "features/javascript_lint.feature",
31
+ "features/run.feature",
32
+ "features/step_definitons/all.rb",
33
+ "features/support/env.rb",
34
+ "lib/always_continuer.rb",
35
+ "lib/browser_finder.rb",
36
+ "lib/file_actioner.rb",
37
+ "lib/file_finder.rb",
38
+ "lib/filters/ends_with_filter.rb",
39
+ "lib/filters/extension_filter.rb",
40
+ "lib/filters/file_filter.rb",
41
+ "lib/filters/modified_filter.rb",
42
+ "lib/icons/error.png",
43
+ "lib/icons/failure.png",
44
+ "lib/icons/info.png",
45
+ "lib/icons/success.png",
46
+ "lib/icons/warning.png",
47
+ "lib/js-test-driver/JsTestDriver-1.1.jar",
48
+ "lib/js-test-driver/plugins/coverage-1.1.jar",
49
+ "lib/loris.rb",
50
+ "lib/outputs/growl_output.rb",
51
+ "lib/outputs/output_collection.rb",
52
+ "lib/outputs/shell_output.rb",
53
+ "lib/outputs/unix_console_clearing_output.rb",
54
+ "lib/outputs/windows_console_clearing_output.rb",
55
+ "lib/pinger.rb",
56
+ "lib/poller.rb",
57
+ "lib/sleep_waiter.rb",
58
+ "lib/task_manager.rb",
59
+ "lib/tasks/command_line_task.rb",
60
+ "lib/tasks/javascript_lint/javascript_lint_parser.rb",
61
+ "lib/tasks/javascript_lint/javascript_lint_runner.rb",
62
+ "lib/tasks/js_test_driver/js_test_driver_config.rb",
63
+ "lib/tasks/js_test_driver/js_test_driver_parser.rb",
64
+ "lib/tasks/js_test_driver/js_test_driver_runner.rb",
65
+ "lib/tasks/js_test_driver/js_test_driver_server.rb",
66
+ "lib/tasks/jspec/jspec_parser.rb",
67
+ "lib/tasks/jspec/jspec_runner.rb",
68
+ "lib/tasks/list_task.rb",
69
+ "lib/tasks/rspec/rspec_parser.rb",
70
+ "lib/tasks/rspec/rspec_runner.rb",
71
+ "lib/unix_process.rb",
72
+ "lib/windows_process.rb",
73
+ "loris.gemspec",
74
+ "loris.tmproj",
75
+ "spec/file_actioner_spec.rb",
76
+ "spec/file_finder_spec.rb",
77
+ "spec/filters/ends_with_filter_spec.rb",
78
+ "spec/filters/file_filter_spec.rb",
79
+ "spec/filters/modified_filter_spec.rb",
80
+ "spec/growl_output_spec.rb",
81
+ "spec/list_task_spec.rb",
82
+ "spec/poller_spec.rb",
83
+ "spec/shell_output_spec.rb",
84
+ "spec/task_manager_spec.rb",
85
+ "spec/tasks/javascript_lint/javascript_lint_runner_spec.rb",
86
+ "spec/tasks/js_test_driver/js_test_driver_runner_spec.rb",
87
+ "spec/tasks/jspec/jspec_parser_spec.rb",
88
+ "spec/tasks/jspec/jspec_runner_spec.rb"
89
+ ]
90
+ s.homepage = %q{http://github.com/karl/loris}
91
+ s.rdoc_options = ["--charset=UTF-8"]
92
+ s.require_paths = ["lib"]
93
+ s.rubygems_version = %q{1.3.5}
94
+ s.summary = %q{Automatically run javascript unit tests}
95
+ s.test_files = [
96
+ "spec/file_actioner_spec.rb",
97
+ "spec/file_finder_spec.rb",
98
+ "spec/filters/ends_with_filter_spec.rb",
99
+ "spec/filters/file_filter_spec.rb",
100
+ "spec/filters/modified_filter_spec.rb",
101
+ "spec/growl_output_spec.rb",
102
+ "spec/list_task_spec.rb",
103
+ "spec/poller_spec.rb",
104
+ "spec/shell_output_spec.rb",
105
+ "spec/task_manager_spec.rb",
106
+ "spec/tasks/javascript_lint/javascript_lint_runner_spec.rb",
107
+ "spec/tasks/js_test_driver/js_test_driver_runner_spec.rb",
108
+ "spec/tasks/jspec/jspec_parser_spec.rb",
109
+ "spec/tasks/jspec/jspec_runner_spec.rb"
110
+ ]
111
+
112
+ if s.respond_to? :specification_version then
113
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
114
+ s.specification_version = 3
115
+
116
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
117
+ s.add_runtime_dependency(%q<visionmedia-bind>, [">= 0.2.6"])
118
+ s.add_runtime_dependency(%q<karl-growl>, [">= 1.0.3"])
119
+ s.add_runtime_dependency(%q<extensions>, [">= 0.6.0"])
120
+ s.add_runtime_dependency(%q<win32-process>, [">= 0.6.1"])
121
+ else
122
+ s.add_dependency(%q<visionmedia-bind>, [">= 0.2.6"])
123
+ s.add_dependency(%q<karl-growl>, [">= 1.0.3"])
124
+ s.add_dependency(%q<extensions>, [">= 0.6.0"])
125
+ s.add_dependency(%q<win32-process>, [">= 0.6.1"])
126
+ end
127
+ else
128
+ s.add_dependency(%q<visionmedia-bind>, [">= 0.2.6"])
129
+ s.add_dependency(%q<karl-growl>, [">= 1.0.3"])
130
+ s.add_dependency(%q<extensions>, [">= 0.6.0"])
131
+ s.add_dependency(%q<win32-process>, [">= 0.6.1"])
132
+ end
133
+ end
data/loris.tmproj ADDED
@@ -0,0 +1,232 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>currentDocument</key>
6
+ <string>Rakefile</string>
7
+ <key>documents</key>
8
+ <array>
9
+ <dict>
10
+ <key>expanded</key>
11
+ <true/>
12
+ <key>name</key>
13
+ <string>loris</string>
14
+ <key>regexFolderFilter</key>
15
+ <string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
16
+ <key>selected</key>
17
+ <true/>
18
+ <key>sourceDirectory</key>
19
+ <string></string>
20
+ </dict>
21
+ </array>
22
+ <key>fileHierarchyDrawerWidth</key>
23
+ <integer>200</integer>
24
+ <key>metaData</key>
25
+ <dict>
26
+ <key>README.rdoc</key>
27
+ <dict>
28
+ <key>caret</key>
29
+ <dict>
30
+ <key>column</key>
31
+ <integer>71</integer>
32
+ <key>line</key>
33
+ <integer>2</integer>
34
+ </dict>
35
+ <key>firstVisibleColumn</key>
36
+ <integer>0</integer>
37
+ <key>firstVisibleLine</key>
38
+ <integer>0</integer>
39
+ </dict>
40
+ <key>Rakefile</key>
41
+ <dict>
42
+ <key>caret</key>
43
+ <dict>
44
+ <key>column</key>
45
+ <integer>5</integer>
46
+ <key>line</key>
47
+ <integer>3</integer>
48
+ </dict>
49
+ <key>firstVisibleColumn</key>
50
+ <integer>0</integer>
51
+ <key>firstVisibleLine</key>
52
+ <integer>0</integer>
53
+ </dict>
54
+ <key>TODO</key>
55
+ <dict>
56
+ <key>caret</key>
57
+ <dict>
58
+ <key>column</key>
59
+ <integer>0</integer>
60
+ <key>line</key>
61
+ <integer>14</integer>
62
+ </dict>
63
+ <key>firstVisibleColumn</key>
64
+ <integer>0</integer>
65
+ <key>firstVisibleLine</key>
66
+ <integer>0</integer>
67
+ </dict>
68
+ <key>lib/filters/ends_with_filter.rb</key>
69
+ <dict>
70
+ <key>caret</key>
71
+ <dict>
72
+ <key>column</key>
73
+ <integer>29</integer>
74
+ <key>line</key>
75
+ <integer>9</integer>
76
+ </dict>
77
+ <key>firstVisibleColumn</key>
78
+ <integer>0</integer>
79
+ <key>firstVisibleLine</key>
80
+ <integer>0</integer>
81
+ </dict>
82
+ <key>lib/filters/extension_filter.rb</key>
83
+ <dict>
84
+ <key>caret</key>
85
+ <dict>
86
+ <key>column</key>
87
+ <integer>3</integer>
88
+ <key>line</key>
89
+ <integer>19</integer>
90
+ </dict>
91
+ <key>columnSelection</key>
92
+ <false/>
93
+ <key>firstVisibleColumn</key>
94
+ <integer>0</integer>
95
+ <key>firstVisibleLine</key>
96
+ <integer>0</integer>
97
+ <key>selectFrom</key>
98
+ <dict>
99
+ <key>column</key>
100
+ <integer>0</integer>
101
+ <key>line</key>
102
+ <integer>0</integer>
103
+ </dict>
104
+ <key>selectTo</key>
105
+ <dict>
106
+ <key>column</key>
107
+ <integer>3</integer>
108
+ <key>line</key>
109
+ <integer>19</integer>
110
+ </dict>
111
+ </dict>
112
+ <key>lib/filters/file_filter.rb</key>
113
+ <dict>
114
+ <key>caret</key>
115
+ <dict>
116
+ <key>column</key>
117
+ <integer>0</integer>
118
+ <key>line</key>
119
+ <integer>7</integer>
120
+ </dict>
121
+ <key>columnSelection</key>
122
+ <false/>
123
+ <key>firstVisibleColumn</key>
124
+ <integer>0</integer>
125
+ <key>firstVisibleLine</key>
126
+ <integer>0</integer>
127
+ <key>selectFrom</key>
128
+ <dict>
129
+ <key>column</key>
130
+ <integer>33</integer>
131
+ <key>line</key>
132
+ <integer>7</integer>
133
+ </dict>
134
+ <key>selectTo</key>
135
+ <dict>
136
+ <key>column</key>
137
+ <integer>0</integer>
138
+ <key>line</key>
139
+ <integer>7</integer>
140
+ </dict>
141
+ </dict>
142
+ <key>lib/filters/modified_filter.rb</key>
143
+ <dict>
144
+ <key>caret</key>
145
+ <dict>
146
+ <key>column</key>
147
+ <integer>0</integer>
148
+ <key>line</key>
149
+ <integer>4</integer>
150
+ </dict>
151
+ <key>firstVisibleColumn</key>
152
+ <integer>0</integer>
153
+ <key>firstVisibleLine</key>
154
+ <integer>0</integer>
155
+ </dict>
156
+ <key>lib/loris.rb</key>
157
+ <dict>
158
+ <key>caret</key>
159
+ <dict>
160
+ <key>column</key>
161
+ <integer>78</integer>
162
+ <key>line</key>
163
+ <integer>101</integer>
164
+ </dict>
165
+ <key>firstVisibleColumn</key>
166
+ <integer>0</integer>
167
+ <key>firstVisibleLine</key>
168
+ <integer>73</integer>
169
+ </dict>
170
+ <key>lib/tasks/rspec/rspec_runner.rb</key>
171
+ <dict>
172
+ <key>caret</key>
173
+ <dict>
174
+ <key>column</key>
175
+ <integer>61</integer>
176
+ <key>line</key>
177
+ <integer>13</integer>
178
+ </dict>
179
+ <key>firstVisibleColumn</key>
180
+ <integer>0</integer>
181
+ <key>firstVisibleLine</key>
182
+ <integer>0</integer>
183
+ </dict>
184
+ <key>lib/tasks/rspec/rspec_task.rb</key>
185
+ <dict>
186
+ <key>caret</key>
187
+ <dict>
188
+ <key>column</key>
189
+ <integer>42</integer>
190
+ <key>line</key>
191
+ <integer>41</integer>
192
+ </dict>
193
+ <key>firstVisibleColumn</key>
194
+ <integer>0</integer>
195
+ <key>firstVisibleLine</key>
196
+ <integer>0</integer>
197
+ </dict>
198
+ <key>spec/filters/ends_with_filter_spec.rb</key>
199
+ <dict>
200
+ <key>caret</key>
201
+ <dict>
202
+ <key>column</key>
203
+ <integer>43</integer>
204
+ <key>line</key>
205
+ <integer>9</integer>
206
+ </dict>
207
+ <key>firstVisibleColumn</key>
208
+ <integer>0</integer>
209
+ <key>firstVisibleLine</key>
210
+ <integer>0</integer>
211
+ </dict>
212
+ </dict>
213
+ <key>openDocuments</key>
214
+ <array>
215
+ <string>TODO</string>
216
+ <string>README.rdoc</string>
217
+ <string>lib/tasks/rspec/rspec_task.rb</string>
218
+ <string>lib/tasks/rspec/rspec_runner.rb</string>
219
+ <string>lib/filters/ends_with_filter.rb</string>
220
+ <string>Rakefile</string>
221
+ <string>spec/filters/ends_with_filter_spec.rb</string>
222
+ <string>lib/loris.rb</string>
223
+ <string>lib/filters/modified_filter.rb</string>
224
+ <string>lib/filters/file_filter.rb</string>
225
+ <string>lib/filters/extension_filter.rb</string>
226
+ </array>
227
+ <key>showFileHierarchyDrawer</key>
228
+ <false/>
229
+ <key>windowFrame</key>
230
+ <string>{{0, 0}, {1436, 878}}</string>
231
+ </dict>
232
+ </plist>
@@ -0,0 +1,41 @@
1
+ require 'lib/file_actioner.rb'
2
+
3
+ describe FileActioner do
4
+
5
+ it "Should get filtered files and send them to action" do
6
+ files = {
7
+ :all => ['/path/to.file'],
8
+ :filtered => ['/path/to.file']
9
+ }
10
+
11
+ ff = mock('file finder')
12
+ ff.should_receive(:find).and_return(files)
13
+
14
+ tm = mock('TaskManager')
15
+ tm.should_receive(:run).with(files)
16
+
17
+ fa = FileActioner.new(ff, tm)
18
+ fa.run
19
+
20
+ end
21
+
22
+ it "should not run the actions if no filtered files" do
23
+ files = {
24
+ :all => ['/path/to.file'],
25
+ :filtered => []
26
+ }
27
+
28
+ ff = mock('file finder')
29
+ ff.should_receive(:find).and_return(files)
30
+
31
+ tm = mock('TaskManager')
32
+ tm.should_not_receive(:run)
33
+
34
+ fa = FileActioner.new(ff, tm)
35
+ fa.run
36
+
37
+ end
38
+
39
+ end
40
+
41
+
@@ -0,0 +1,73 @@
1
+ require 'lib/file_finder'
2
+
3
+ describe FileFinder do
4
+
5
+ before do
6
+ finder = mock('finder')
7
+ finder.should_receive(:find).with('/monkey').and_yield('/monkey/modified.txt').and_yield('/monkey/modified-2.txt').and_yield('/monkey/not-modified.txt')
8
+
9
+ @filter = mock('filter')
10
+ @filter.should_receive(:filter).at_most(1).with('/monkey/modified.txt').and_return(true)
11
+ @filter.should_receive(:filter).at_most(1).with('/monkey/modified-2.txt').and_return(true)
12
+ @filter.should_receive(:filter).at_most(1).with('/monkey/not-modified.txt').and_return(false)
13
+
14
+ @filter2 = mock('filter')
15
+ @filter2.should_receive(:filter).at_most(1).with('/monkey/modified.txt').and_return(true)
16
+ @filter2.should_receive(:filter).at_most(1).with('/monkey/modified-2.txt').and_return(false)
17
+ @filter2.should_receive(:filter).at_most(1).with('/monkey/not-modified.txt').and_return(true)
18
+
19
+ dir = '/monkey'
20
+ @ff = FileFinder.new(finder, dir)
21
+ end
22
+
23
+ it 'with no filters, should return all files' do
24
+ result = {
25
+ :all => ['/monkey/modified.txt', '/monkey/modified-2.txt', '/monkey/not-modified.txt'],
26
+ :filtered => ['/monkey/modified.txt', '/monkey/modified-2.txt', '/monkey/not-modified.txt']
27
+ }
28
+
29
+ files = @ff.find
30
+ files.should == result
31
+ end
32
+
33
+ it 'with filter, should return only filtered' do
34
+ result = {
35
+ :all => ['/monkey/modified.txt', '/monkey/modified-2.txt', '/monkey/not-modified.txt'],
36
+ :filtered => ['/monkey/modified.txt', '/monkey/modified-2.txt']
37
+ }
38
+
39
+ @filter.should_receive(:complete)
40
+
41
+ @ff.add_filter(@filter)
42
+ files = @ff.find
43
+
44
+ files.should == result
45
+ end
46
+
47
+ it 'should be able to accept multiple filters' do
48
+ result = {
49
+ :all => ['/monkey/modified.txt', '/monkey/modified-2.txt', '/monkey/not-modified.txt'],
50
+ :filtered => ['/monkey/modified.txt']
51
+ }
52
+
53
+ @filter.should_receive(:complete)
54
+ @filter2.should_receive(:complete)
55
+
56
+ @ff.add_filter(@filter)
57
+ @ff.add_filter(@filter2)
58
+ files = @ff.find
59
+
60
+ files.should == result
61
+ end
62
+
63
+ it 'should call filter.complete methods at the end of find' do
64
+ @filter.should_receive(:complete)
65
+ @filter2.should_receive(:complete)
66
+
67
+ @ff.add_filter(@filter)
68
+ @ff.add_filter(@filter2)
69
+ files = @ff.find
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,26 @@
1
+ require 'lib/filters/ends_with_filter'
2
+
3
+ describe EndsWithFilter do
4
+
5
+ before do
6
+ end
7
+
8
+ it 'should return true if ends with text' do
9
+ @path = '/path/to/file_spec.rb'
10
+ filter = EndsWithFilter.new('_spec.rb')
11
+ filter.filter(@path).should be_true
12
+ end
13
+
14
+ it 'should return true if ends with text in a different case' do
15
+ @path = '/path/to/file_Spec.RB'
16
+ filter = EndsWithFilter.new('_spec.rb')
17
+ filter.filter(@path).should be_true
18
+ end
19
+
20
+ it 'should return false if does not end with text' do
21
+ @path = '/path/to/file_spec.rbx'
22
+ filter = EndsWithFilter.new('_spec.rb')
23
+ filter.filter(@path).should be_false
24
+ end
25
+
26
+ end
@@ -0,0 +1,28 @@
1
+ require 'lib/filters/file_filter'
2
+
3
+ describe FileFilter do
4
+
5
+ before do
6
+ end
7
+
8
+ it 'should return true if a file' do
9
+ @path = '/path/to.file'
10
+ @file = mock('File class')
11
+ @file.should_receive(:file?).with(@path).and_return(true)
12
+
13
+ filter = FileFilter.new(@file)
14
+
15
+ filter.filter(@path).should be_true
16
+ end
17
+
18
+ it 'should return false if a directory' do
19
+ @path = '/path/to/dir'
20
+ @file = mock('File class')
21
+ @file.should_receive(:file?).with(@path).and_return(false)
22
+
23
+ filter = FileFilter.new(@file)
24
+
25
+ filter.filter(@path).should be_false
26
+ end
27
+
28
+ end
@@ -0,0 +1,47 @@
1
+ require 'lib/filters/modified_filter'
2
+ require 'time'
3
+
4
+ describe ModifiedFilter do
5
+
6
+ before do
7
+ @path = '/path/to.file'
8
+ @file = mock('File class')
9
+ @file.should_receive(:mtime).any_number_of_times.with(@path).and_return(Time.parse('2000/01/01'))
10
+ end
11
+
12
+ it 'should return true if no last modified date set' do
13
+ filter = ModifiedFilter.new(@file)
14
+
15
+ filter.filter(@path).should be_true
16
+ end
17
+
18
+ it 'should return false if file modified before given last modified date' do
19
+ last_modified = Time.parse('2000/01/02')
20
+ filter = ModifiedFilter.new(@file, last_modified)
21
+
22
+ filter.filter(@path).should be_false
23
+ end
24
+
25
+ it 'should remember the last modified date on complete method' do
26
+ filter = ModifiedFilter.new(@file)
27
+ filter.filter(@path)
28
+
29
+ filter.complete
30
+
31
+ filter.filter(@path).should be_false
32
+ end
33
+
34
+ it 'should remember the last modified date and recognise changed date on file' do
35
+ @file = mock('File class')
36
+ @file.should_receive(:mtime).with(@path).and_return(Time.parse('2000/01/01'))
37
+ @file.should_receive(:mtime).with(@path).and_return(Time.parse('2000/01/03'))
38
+
39
+ filter = ModifiedFilter.new(@file)
40
+ filter.filter(@path)
41
+
42
+ filter.complete
43
+
44
+ filter.filter(@path).should be_true
45
+ end
46
+
47
+ end
@@ -0,0 +1,33 @@
1
+ require 'lib/outputs/growl_output.rb'
2
+
3
+ describe GrowlOutput do
4
+
5
+ it "should not notify if growl is not installed" do
6
+ result = {}
7
+
8
+ growl = mock('Growl')
9
+ growl.should_receive(:installed?).and_return(false)
10
+
11
+ growl_output = GrowlOutput.new(growl)
12
+ growl_output.add_result(result)
13
+ end
14
+
15
+ it "should call original add_result method" do
16
+ result = {
17
+ :state => :success,
18
+ :title => 'Example Title',
19
+ :summary => 'Example Summary',
20
+ :detail => 'Detail goes here...'
21
+ }
22
+
23
+ growl = mock('Growl')
24
+ growl.should_receive(:installed?).and_return(true)
25
+ growl.should_receive(:notify)
26
+
27
+ growl_output = GrowlOutput.new(growl)
28
+ growl_output.add_result(result)
29
+ end
30
+
31
+ end
32
+
33
+