guard-haskell 1.4.0 → 1.5.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZGVmNTAyMjBkMDZhNGJiYmI5ZDhhNmNkYTA5YTU0MDNmZDQ5MTVkNg==
4
+ ODI3NmViYzJlOThiNjQxYjNlM2VlZWRhY2Y4MTIyODc0MThiOGRhMw==
5
5
  data.tar.gz: !binary |-
6
- ODdjMjQxNTc3Y2ZmOTI0MjQ1OTIzNGE2YjFjMDJjZDQ3ZDA4NmQxOQ==
6
+ ODYyZTU5ZTM1YzM2OWJlNTU2ZTcxMDRmMTFjOTE2YzkxMTY5MDcyMA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDkyM2Y2Nzg3YWYxMzliNTI1MmY3ZjAwN2JjMDJlM2ZiOTg1NWJjZmQyYjRm
10
- ODE0Y2Y1MTQ3YTBkNDEwMDc5YWU4OTQ2MTNkOGI0MTFkMmYxY2VkYzRlODg4
11
- ZmE1YjBjNmEwNzE1NzNkNDgxMzQzOTBiM2Y1YWU0MTg1ZGRkMzE=
9
+ NjVjYmNiOTIwNGM1NzZmYTBkZWYwZTRkMWE1NDY0M2Y1MWEyYzNlOTBjZDU3
10
+ NmQ3Y2IzMDhlYjBiZmQ2OTQ2OTc5YmVhOGJiZjg5MGMxNDkzMGM1MDBmYjE4
11
+ NjlkNmU3ZmUyMGYwMTQ4NzUxODVlODc0YjRkYjRiZmM1MWQ5MmI=
12
12
  data.tar.gz: !binary |-
13
- OTUzOWIyZDE4NjU2MGU1ZTAwMDEyNDgyZTlkMzViYTQ5MzY4ZWExNjliZTAw
14
- OTgxMzZiNmRjZjdhYTQzYzkyNDA2ZmI4NWM1ZGRiYzgzZTk4ODY3ODdlNGMz
15
- MmQyYzJjMGNhZDAwMjM0ZTRkNDhkMGViOGJiOWE4MzMxZmIzZGE=
13
+ NWU4YmJkYmRkY2ZhNTZlMDI1NDI4ODllN2YyMDQ0ZGViODI2NWYwNWI3OWUz
14
+ MGJmZDkxMjAxMTRiYjE1ZmVhYTVkYzU3NmYzYTU1ZTFhOWE4ZjI1ODcyYWQ3
15
+ MGNkNzQyYTNhMjE1NWFiMjI2Mzg2OTNjN2NiNjc3NTc3YjYzMTI=
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ 1.5.0
2
+ =====
3
+
4
+ * Add `sandbox_glob` option
5
+ * Separate stages for [re]loading and rerunning specs
6
+
1
7
  1.4.0
2
8
  =====
3
9
 
data/README.md CHANGED
@@ -30,6 +30,17 @@ For explanation what `guard` is and how to use it, please refer to the [`guard m
30
30
  When you type in `guard`, `guard-haskell` fires up an `ghci` instance which it talks to, reloading
31
31
  and rerunning (parts of) "top" spec on files modifications.
32
32
 
33
+ ## Guard::Haskell setup
34
+
35
+ For `guard-haskell` to be ready to work we need a top level spec file and a Guardfile:
36
+
37
+ ```shell
38
+ mkdir --parents test
39
+ echo '{-# OPTIONS_GHC -F -pgmF hspec-discover #-}' > test/Spec.hs
40
+ guard init haskell
41
+ guard
42
+ ```
43
+
33
44
  ## Guardfile examples
34
45
 
35
46
  Typical haskell project:
@@ -75,6 +86,10 @@ Pass custom ghci options, for example, `-XCPP` directives like `-DTEST` (default
75
86
 
76
87
  "Top" spec location (default: `test/Spec.hs`).
77
88
 
89
+ ### `sandbox_glob`
90
+
91
+ A glob that matches cabal sandboxes (default: `.cabal-sandbox/*packages.conf.d`)
92
+
78
93
  ## Known problems
79
94
 
80
95
  ### App you test uses the GHC API
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency 'rake'
23
23
  s.add_development_dependency 'rspec'
24
24
  s.add_development_dependency 'guard-rspec'
25
+ s.add_development_dependency 'fakefs'
25
26
  end
data/lib/guard/haskell.rb CHANGED
@@ -22,8 +22,16 @@ module ::Guard
22
22
 
23
23
  require 'guard/haskell/repl'
24
24
 
25
- attr_reader :repl, :top_spec, :ghci_options, :targets, :last_run
26
- attr_reader :all_on_start, :all_on_pass, :focus_on_fail
25
+ attr_reader :repl, :targets, :last_run, :opts
26
+
27
+ Options = Struct.new(
28
+ :top_spec,
29
+ :ghci_options,
30
+ :all_on_start,
31
+ :all_on_pass,
32
+ :focus_on_fail,
33
+ :sandbox_glob,
34
+ )
27
35
 
28
36
  DEFAULT_OPTIONS = {
29
37
  top_spec: "test/Spec.hs",
@@ -31,30 +39,24 @@ module ::Guard
31
39
  all_on_start: false,
32
40
  all_on_pass: false,
33
41
  focus_on_fail: true,
42
+ sandbox_glob: ".cabal-sandbox/*packages.conf.d",
34
43
  }
35
44
 
36
45
  def initialize(user_options = {})
37
46
  super
38
47
 
39
- @last_run = :success # try to prove it wasn't :-)
40
-
41
- options = DEFAULT_OPTIONS.merge(user_options)
42
- @top_spec = options[:top_spec]
43
- @ghci_options = options[:ghci_options]
44
- @all_on_start = options[:all_on_start]
45
- @all_on_pass = options[:all_on_pass]
46
- @focus_on_fail = options[:focus_on_fail]
47
-
48
- @repl = Repl.new
48
+ @last_run = :success # try to prove it wasn't :-)
49
+ @opts = Options.new(*DEFAULT_OPTIONS.merge(user_options).values)
50
+ @repl = Repl.new
49
51
  end
50
52
 
51
53
  def start
52
- repl.start(ghci_options)
53
- repl.init(top_spec)
54
+ repl.start(opts.ghci_options, opts.sandbox_glob)
55
+ repl.init(opts.top_spec)
54
56
 
55
57
  @targets = ::Set.new(::Dir.glob("**/*.{hs,lhs}"))
56
58
 
57
- if all_on_start
59
+ if opts.all_on_start
58
60
  run_all
59
61
  end
60
62
  end
@@ -69,15 +71,15 @@ module ::Guard
69
71
  end
70
72
 
71
73
  def run_all
72
- repl.run
74
+ repl.reload_and_run_matching
73
75
  success?
74
76
  end
75
77
 
76
78
  def run pattern
77
- if focus_on_fail and last_run == :runtime_failure
78
- repl.rerun
79
+ if opts.focus_on_fail and last_run == :runtime_failure
80
+ repl.reload_and_rerun
79
81
  else
80
- repl.run(pattern)
82
+ repl.reload_and_run_matching(pattern)
81
83
  end
82
84
  success?
83
85
  end
@@ -88,7 +90,7 @@ module ::Guard
88
90
  [:compile_failure, :success]
89
91
  @last_run = :success
90
92
  Notifier.notify('Success')
91
- if all_on_pass
93
+ if opts.all_on_pass
92
94
  run_all
93
95
  end
94
96
  when [:success, :success]
@@ -110,7 +112,7 @@ module ::Guard
110
112
  def run_on_additions paths
111
113
  unless paths.all? { |path| targets.include? path }
112
114
  @targets += paths
113
- repl.init(top_spec)
115
+ repl.init(opts.top_spec)
114
116
  end
115
117
  end
116
118
 
@@ -10,12 +10,14 @@ class ::Guard::Haskell::Repl
10
10
 
11
11
  def self.test(str)
12
12
  case str
13
- when /\d+ examples?, 0 failures/
13
+ when /\d+ examples?, 0 failures/,
14
+ /Ok, modules loaded:/
14
15
  :success
15
16
  when /\d+ examples?, \d+ failures?/
16
17
  :runtime_failure
17
18
  when /Failed, modules loaded:/,
18
19
  /\*{3} Exception:/,
20
+ /cannot find object file for module/,
19
21
  /phase `C pre-processor' failed/,
20
22
  /GHCi runtime linker: fatal error:/,
21
23
  /During interactive linking, GHCi couldn't find the following symbol:/
@@ -23,19 +25,29 @@ class ::Guard::Haskell::Repl
23
25
  end
24
26
  end
25
27
 
26
- def start ghci_options
28
+ def start(ghci_options, sandbox_glob)
27
29
  cmd = ["ghci"]
30
+
28
31
  Dir["*"].each { |d| cmd << "-i#{d}" if File.directory?(d) }
29
- sandbox = ::Dir[".cabal-sandbox/*packages.conf.d"].first
30
- cmd.concat(["-no-user-package-db", "-package-db=#{sandbox}"]) if sandbox
32
+ lookup_sandbox(cmd, sandbox_glob)
31
33
  cmd.concat(ghci_options)
32
34
 
33
35
  @stdin, stdout, @thread = ::Open3.popen2e(*cmd)
34
36
  @listener = ::Thread.new { listen(stdout, STDOUT) }
35
37
  end
36
38
 
39
+ def lookup_sandbox(cmd, sandbox_glob)
40
+ sandboxes = Sandbox.new(sandbox_glob)
41
+ sandboxes.with_best_sandbox(->(str) { str.scan(/\d+/).map(&:to_i) }) do |best_sandbox|
42
+ puts "Cabal sandboxes found:"
43
+ sandboxes.each { |sandbox| puts " #{sandbox}" }
44
+ puts "Cabal sandbox used:\n #{best_sandbox}"
45
+ cmd.concat(["-no-user-package-db", "-package-db=#{best_sandbox}"])
46
+ end
47
+ end
48
+
37
49
  def init(spec)
38
- repl(":load #{spec}\n")
50
+ run_command_and_wait_for_result(":load #{spec}\n")
39
51
  end
40
52
 
41
53
  def exit
@@ -43,26 +55,54 @@ class ::Guard::Haskell::Repl
43
55
  ::Thread.kill(listener)
44
56
  end
45
57
 
46
- def run(pattern = nil)
47
- if pattern.nil?
48
- repl(":reload\n:main --color\n")
49
- else
50
- repl(":reload\n:main --color --match #{pattern}\n")
58
+ def reload_and_run_matching(pattern = nil)
59
+ if run_command_and_wait_for_result(":reload\n")
60
+ if pattern.nil?
61
+ run_command_and_wait_for_result(":main --color\n")
62
+ else
63
+ run_command_and_wait_for_result(":main --color --match #{pattern}\n")
64
+ end
51
65
  end
52
66
  end
53
67
 
54
- def rerun
55
- repl(":reload\n:main --color --rerun\n")
68
+ def reload_and_rerun
69
+ if run_command_and_wait_for_result(":reload\n")
70
+ run_command_and_wait_for_result(":main --color --rerun\n")
71
+ end
56
72
  end
57
73
 
58
- def result
59
- while @running do sleep(0.01) end
60
- @result
74
+ class Sandbox
75
+ attr_reader :sandboxes
76
+
77
+ include ::Enumerable
78
+
79
+ def initialize(glob)
80
+ @sandboxes = ::Dir[glob]
81
+ end
82
+
83
+ def each(&block)
84
+ sandboxes.each(&block)
85
+ end
86
+
87
+ def with_best_sandbox(ordering)
88
+ best = sandboxes.max_by(&ordering)
89
+ yield best if best
90
+ best
91
+ end
61
92
  end
62
93
 
63
94
  private
95
+ def run_command_and_wait_for_result(command)
96
+ talk_to_repl(command)
97
+ wait_for_result == :success
98
+ end
99
+
100
+ def wait_for_result
101
+ while @running do sleep(0.01) end
102
+ @result
103
+ end
64
104
 
65
- def repl(command)
105
+ def talk_to_repl(command)
66
106
  @running = true
67
107
  stdin.write(command)
68
108
  end
@@ -1,5 +1,5 @@
1
1
  module Guard
2
2
  module HaskellVersion
3
- VERSION = '1.4.0'
3
+ VERSION = '1.5.0'
4
4
  end
5
5
  end
@@ -1,3 +1,4 @@
1
+ require 'fakefs/spec_helpers'
1
2
  require 'spec_helper'
2
3
  require 'guard/notifier'
3
4
 
@@ -11,42 +12,53 @@ describe ::Guard::Haskell::Repl do
11
12
 
12
13
  describe '#init' do
13
14
  it "calls :load on ghci instance" do
14
- expect(repl).to receive(:repl).with(/:load/)
15
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/:load/)
15
16
  repl.init("Spec.hs")
16
17
  end
17
18
 
18
19
  it "loads provided spec" do
19
- expect(repl).to receive(:repl).with(/FooBarSpec.hs/)
20
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/FooBarSpec.hs/)
20
21
  repl.init("FooBarSpec.hs")
21
22
  end
22
23
  end
23
24
 
24
- describe '#run' do
25
- it "reloads the spec if no pattern is provided" do
26
- expect(repl).to receive(:repl).with(/:reload/)
27
- repl.run
25
+ context "running spec" do
26
+ before(:each) do
27
+ repl.stub(:run_command_and_wait_for_result) { |_| true }
28
28
  end
29
29
 
30
- it "reloads the spec if a pattern is provided" do
31
- expect(repl).to receive(:repl).with(/:reload/)
32
- repl.run("FooBar")
33
- end
30
+ describe '#reload_and_run_matching' do
31
+ it "reloads the spec if no pattern is provided" do
32
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/:reload/)
33
+ repl.reload_and_run_matching
34
+ end
34
35
 
35
- it "provides a pattern for spec to match" do
36
- expect(repl).to receive(:repl).with(/--match FooBar/)
37
- repl.run("FooBar")
38
- end
39
- end
36
+ it "reloads the spec if a pattern is provided" do
37
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/:reload/)
38
+ repl.reload_and_run_matching
39
+ end
40
+
41
+ it "provides a pattern for spec to match" do
42
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/--match FooBar/)
43
+ repl.reload_and_run_matching("FooBar")
44
+ end
40
45
 
41
- describe '#rerun' do
42
- it "reloads the spec" do
43
- expect(repl).to receive(:repl).with(/:reload/)
44
- repl.rerun
46
+ it "provides no pattern for spec to match if an argument is nil" do
47
+ expect(repl).not_to receive(:run_command_and_wait_for_result).with(/--match FooBar/)
48
+ repl.reload_and_run_matching(nil)
49
+ end
45
50
  end
46
51
 
47
- it "reruns the spec" do
48
- expect(repl).to receive(:repl).with(/--rerun/)
49
- repl.rerun
52
+ describe '#reload_and_rerun' do
53
+ it "reloads the spec" do
54
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/:reload/)
55
+ repl.reload_and_rerun
56
+ end
57
+
58
+ it "reruns the spec" do
59
+ expect(repl).to receive(:run_command_and_wait_for_result).with(/--rerun/)
60
+ repl.reload_and_rerun
61
+ end
50
62
  end
51
63
  end
52
64
 
@@ -131,6 +143,17 @@ describe ::Guard::Haskell::Repl do
131
143
  expect(repl.instance_variable_get(:@result)).to eq(:compile_failure)
132
144
  end
133
145
 
146
+ # This one's even trickier to reproduce than the previous one
147
+ it 'handles "cannot find object file" runtime linker error' do
148
+ in_stream = ::File.open(run_file["runtime-linker-cannot-find-object-file.error"])
149
+ repl.instance_variable_set(:@running, true)
150
+
151
+ repl.send(:listen, in_stream, dev_null)
152
+
153
+ expect(repl.instance_variable_get(:@running)).to eq(false)
154
+ expect(repl.instance_variable_get(:@result)).to eq(:compile_failure)
155
+ end
156
+
134
157
  it "handles hspec exceptions" do
135
158
  in_stream = ::File.open(run_file["hspec-exception.error"])
136
159
  repl.instance_variable_set(:@running, true)
@@ -152,4 +175,78 @@ describe ::Guard::Haskell::Repl do
152
175
  end
153
176
  end
154
177
  end
178
+
179
+ describe "#lookup_sandbox" do
180
+ include FakeFS::SpecHelpers
181
+
182
+ before(:each) { ::IO.any_instance.stub(:puts) }
183
+
184
+ it "does not find anything if there are no sandboxes" do
185
+ expect_any_instance_of(::IO).not_to receive(:puts)
186
+ expect(repl.lookup_sandbox([], "*packages.conf.d")).to be_nil
187
+ end
188
+
189
+ it "finds a sandbox" do
190
+ ::FileUtils.mkdir_p(["ghc-7.6.3-packages.conf.d"])
191
+ expect_any_instance_of(::IO).to receive(:puts).with("Cabal sandboxes found:")
192
+ expect(repl.lookup_sandbox([], "*packages.conf.d")).to eq("/ghc-7.6.3-packages.conf.d")
193
+ end
194
+
195
+ it "finds a sandbox with the default settings" do
196
+ ::FileUtils.mkdir_p([".cabal-sandbox/foo-bar-ghc-7.6.3-packages.conf.d"])
197
+ expect_any_instance_of(::IO).to receive(:puts).with("Cabal sandboxes found:")
198
+ expect(repl.lookup_sandbox([], ::Guard::Haskell::DEFAULT_OPTIONS[:sandbox_glob])).to eq("/.cabal-sandbox/foo-bar-ghc-7.6.3-packages.conf.d")
199
+ end
200
+
201
+ it "compares sandboxes cleverly" do
202
+ ::FileUtils.mkdir_p(
203
+ [ "ghc-1.0-packages.conf.d",
204
+ "ghc-1.1-packages.conf.d",
205
+ "ghc-1.2-packages.conf.d",
206
+ "ghc-1.10-packages.conf.d",
207
+ ])
208
+ expect(repl.lookup_sandbox([], "*packages.conf.d")).to eq("/ghc-1.10-packages.conf.d")
209
+ end
210
+ end
211
+ end
212
+
213
+ describe ::Guard::Haskell::Repl::Sandbox do
214
+ ::Sandbox = ::Guard::Haskell::Repl::Sandbox
215
+ include FakeFS::SpecHelpers
216
+
217
+ let(:id) { ->(x) { x } }
218
+ let(:reversed) { ->(str) { str.reverse } }
219
+
220
+ before(:each) { ::IO.any_instance.stub(:puts) }
221
+
222
+ it "has an empty list of sandboxes if no sandboxes are found" do
223
+ expect(::Sandbox.new("*").sandboxes).to eq([])
224
+ end
225
+
226
+ it "has a singleton list of sandboxes if one sandbox is found" do
227
+ ::FileUtils.touch(["foo", "bar", "baz"])
228
+ expect(::Sandbox.new("foo").sandboxes).to eq(["/foo"])
229
+ end
230
+
231
+ it "has a list of sandboxes if more than one sandbox is found" do
232
+ ::FileUtils.touch(["foo", "bar", "baz"])
233
+ expect(::Sandbox.new("ba*").sandboxes).to eq(["/bar", "/baz"])
234
+ end
235
+
236
+ it "has a nil for the best sandbox of an empty list of sandboxes" do
237
+ expect_any_instance_of(::IO).not_to receive(:puts)
238
+ expect(::Sandbox.new("*").with_best_sandbox(id) { |s| puts s }).to be_nil
239
+ end
240
+
241
+ it "chooses a \"maximum\" for the best sandbox" do
242
+ ::FileUtils.touch(["foo", "bar", "baz"])
243
+ expect_any_instance_of(::IO).to receive(:puts).with("/foo")
244
+ expect(::Sandbox.new("*").with_best_sandbox(id) { |s| puts s }).to eq("/foo")
245
+ end
246
+
247
+ it "chooses a \"maximum\" of the complex ordering for the best sandbox" do
248
+ ::FileUtils.touch(["foo", "bar", "baz", "zap"])
249
+ expect_any_instance_of(::IO).to receive(:puts).with("/baz")
250
+ expect(::Sandbox.new("*").with_best_sandbox(reversed) { |s| puts s }).to eq("/baz")
251
+ end
155
252
  end
@@ -34,9 +34,7 @@ describe "monkey patching" do
34
34
  end
35
35
 
36
36
  describe ::Guard::Haskell do
37
- let(:guard) do
38
- ::Guard::Haskell.new
39
- end
37
+ let(:guard) { ::Guard::Haskell.new }
40
38
 
41
39
  before :each do
42
40
  ::Guard.stub(:add_group)
@@ -45,24 +43,10 @@ describe ::Guard::Haskell do
45
43
  end
46
44
 
47
45
  describe ".initialize" do
48
- it "has :all_on_start option" do
49
- expect(guard.instance_variable_defined?(:@all_on_start)).to eq(true)
50
- end
51
-
52
- it "has :all_on_pass option" do
53
- expect(guard.instance_variable_defined?(:@all_on_pass)).to eq(true)
54
- end
55
-
56
- it "has :focus_on_fail option" do
57
- expect(guard.instance_variable_defined?(:@focus_on_fail)).to eq(true)
58
- end
59
-
60
- it "has :ghci_options option" do
61
- expect(guard.instance_variable_defined?(:@ghci_options)).to eq(true)
62
- end
63
-
64
- it "has :top_spec option" do
65
- expect(guard.instance_variable_defined?(:@top_spec)).to eq(true)
46
+ ::Guard::Haskell::DEFAULT_OPTIONS.each do |key, value|
47
+ it "has :#{key} option" do
48
+ expect(::Guard::Haskell.new.opts.send(key)).to eq(value)
49
+ end
66
50
  end
67
51
  end
68
52
 
@@ -83,7 +67,7 @@ describe ::Guard::Haskell do
83
67
  it "runs all examples on start with :all_on_start option enabled" do
84
68
  custom_guard = ::Guard::Haskell.new(all_on_start: true)
85
69
 
86
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run)
70
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with(no_args)
87
71
  expect(custom_guard).to receive(:success?)
88
72
 
89
73
  custom_guard.start
@@ -116,7 +100,7 @@ describe ::Guard::Haskell do
116
100
 
117
101
  describe "#run" do
118
102
  it "checks success after run" do
119
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
103
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
120
104
  expect(guard).to receive(:success?)
121
105
  guard.instance_variable_set(:@last_run, :success)
122
106
 
@@ -125,7 +109,7 @@ describe ::Guard::Haskell do
125
109
  end
126
110
 
127
111
  it "runs examples matching pattern if last run was a success" do
128
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
112
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
129
113
  guard.instance_variable_set(:@last_run, :success)
130
114
 
131
115
  guard.start
@@ -133,7 +117,7 @@ describe ::Guard::Haskell do
133
117
  end
134
118
 
135
119
  it "runs examples matching pattern if last run was a compile time failure" do
136
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
120
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
137
121
  guard.instance_variable_set(:@last_run, :compile_failure)
138
122
 
139
123
  guard.start
@@ -141,20 +125,20 @@ describe ::Guard::Haskell do
141
125
  end
142
126
 
143
127
  it "reruns failing examples if last run was a runtime failure and @focus_on_fail is set" do
144
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:rerun)
145
- expect_any_instance_of(::Guard::Haskell::Repl).not_to receive(:run).with("Foo")
128
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_rerun)
129
+ expect_any_instance_of(::Guard::Haskell::Repl).not_to receive(:reload_and_run_matching).with("Foo")
146
130
  guard.instance_variable_set(:@last_run, :runtime_failure)
147
- guard.instance_variable_set(:@focus_on_fail, true)
131
+ guard.opts.focus_on_fail = true
148
132
 
149
133
  guard.start
150
134
  guard.run("Foo")
151
135
  end
152
136
 
153
137
  it "runs examples matching pattern if last run was a runtime failure but @focus_on_fail is unset" do
154
- expect_any_instance_of(::Guard::Haskell::Repl).not_to receive(:rerun)
155
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
138
+ expect_any_instance_of(::Guard::Haskell::Repl).not_to receive(:reload_and_rerun)
139
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
156
140
  guard.instance_variable_set(:@last_run, :runtime_failure)
157
- guard.instance_variable_set(:@focus_on_fail, false)
141
+ guard.opts.focus_on_fail = false
158
142
 
159
143
  guard.start
160
144
  guard.run("Foo")
@@ -163,7 +147,7 @@ describe ::Guard::Haskell do
163
147
 
164
148
  describe "#run_all" do
165
149
  it "checks success after run" do
166
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run)
150
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching)
167
151
  expect(guard).to receive(:success?)
168
152
  guard.instance_variable_set(:@last_run, :success)
169
153
 
@@ -291,7 +275,7 @@ describe ::Guard::Haskell do
291
275
 
292
276
  describe "#run_on_modifications" do
293
277
  it "run examples for simple haskell files" do
294
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
278
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
295
279
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
296
280
 
297
281
  guard.start
@@ -299,7 +283,7 @@ describe ::Guard::Haskell do
299
283
  end
300
284
 
301
285
  it "run examples for simple literate haskell files" do
302
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
286
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
303
287
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
304
288
 
305
289
  guard.start
@@ -307,7 +291,7 @@ describe ::Guard::Haskell do
307
291
  end
308
292
 
309
293
  it "run examples for *complex* haskell files" do
310
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Bar.Baz")
294
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Bar.Baz")
311
295
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
312
296
 
313
297
  guard.start
@@ -315,7 +299,7 @@ describe ::Guard::Haskell do
315
299
  end
316
300
 
317
301
  it "run examples for simple haskell spec files" do
318
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
302
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
319
303
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
320
304
 
321
305
  guard.start
@@ -323,7 +307,7 @@ describe ::Guard::Haskell do
323
307
  end
324
308
 
325
309
  it "run examples for simple literate haskell spec files" do
326
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
310
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Foo")
327
311
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
328
312
 
329
313
  guard.start
@@ -331,7 +315,7 @@ describe ::Guard::Haskell do
331
315
  end
332
316
 
333
317
  it "run examples for *complex* haskell spec files" do
334
- expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Bar.Baz")
318
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:reload_and_run_matching).with("Bar.Baz")
335
319
  expect_any_instance_of(::Guard::Haskell::Repl).to receive(:result)
336
320
 
337
321
  guard.start
@@ -1,3 +1,2 @@
1
- *Main> Ok, modules loaded: Main, Useful.Parser, Useful.Graph, Useful.Git.
2
1
  *Main>
3
2
  *** Exception: Prelude.undefined
@@ -0,0 +1,3 @@
1
+ *Main> <interactive session>:
2
+ cannot find object file for module `main:Penirka'
3
+ while linking an interpreted expression
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: guard-haskell
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matvey Aksenov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-21 00:00:00.000000000 Z
11
+ date: 2014-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: guard
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fakefs
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Guard::Haskell automatically runs your specs
84
98
  email: matvey.aksenov@gmail.com
85
99
  executables: []
@@ -103,6 +117,7 @@ files:
103
117
  - spec/guard/haskell_spec.rb
104
118
  - spec/run-files/cpp-exception.error
105
119
  - spec/run-files/hspec-exception.error
120
+ - spec/run-files/runtime-linker-cannot-find-object-file.error
106
121
  - spec/run-files/runtime-linker-couldn't-find-symbol.error
107
122
  - spec/run-files/runtime-linker-duplicate-definition-for-symbol.error
108
123
  - spec/run-files/spec-failure.error
@@ -137,6 +152,7 @@ test_files:
137
152
  - spec/guard/haskell_spec.rb
138
153
  - spec/run-files/cpp-exception.error
139
154
  - spec/run-files/hspec-exception.error
155
+ - spec/run-files/runtime-linker-cannot-find-object-file.error
140
156
  - spec/run-files/runtime-linker-couldn't-find-symbol.error
141
157
  - spec/run-files/runtime-linker-duplicate-definition-for-symbol.error
142
158
  - spec/run-files/spec-failure.error