guard-haskell 1.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmZhYzE5OTQ2MTEyZDZhYzMzNTAyNWFlOWIzNTU3ODAzZmU5ZGE2ZQ==
5
+ data.tar.gz: !binary |-
6
+ YTJiMDZhMTg4NGIzY2IyZDhhODBjMjRjYTBlYzBhMDVjOTQ5NTUyNQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OGI4NjEzNTc5MmJmMGNmYmQ2MjBkN2Q1MWI0NDkxZTJiZTc3NDFjNDZmMmU3
10
+ ZmMxMGZhZTFlZDBkZjA0MTk0ZWNjMjY1OWQ3NTAwYWFiMTRlNWIzZGQ1Y2Q3
11
+ ZDE3ZGIzODFjMWIwMjBjYTBjZjM0NTg1NzQyZTk4MWNmNzU1ODU=
12
+ data.tar.gz: !binary |-
13
+ ZDIwNDFkZjc1Yzc1YTkyZGE0NmU5MWIwMDJmZDE4ODRhZWRjOTliZWFjOTVh
14
+ YjFkYWVhMjZlNTgwYjI0MTg5ZDIwMWQ5NWIzYzE5NTI0MDZlMzAwYWJmZjdk
15
+ YWIyNmYyNDc3MjZmNWJjNTk1Zjc0OGRiNmM5NDhiOWYwNDQ1NGY=
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+
20
+ Gemfile.lock
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - ruby-head
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: ruby-head
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2013, Matvey B. Aksenov
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice, this
11
+ list of conditions and the following disclaimer in the documentation and/or
12
+ other materials provided with the distribution.
13
+
14
+ * Neither the name of the {organization} nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
22
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,82 @@
1
+ guard-haskell
2
+ =============
3
+ [![Gem Version](https://badge.fury.io/rb/guard-haskell.png)](http://badge.fury.io/rb/guard-haskell)
4
+ [![Build Status](https://secure.travis-ci.org/supki/guard-haskell.png?branch=master)](http://travis-ci.org/supki/guard-haskell)
5
+ [![Dependencies Status](https://gemnasium.com/supki/guard-haskell.png)](https://gemnasium.com/supki/guard-haskell)
6
+
7
+
8
+ `Guard::Haskell` automatically runs your specs
9
+
10
+ # Install
11
+
12
+ ```shell
13
+ % cabal install hspec
14
+ % gem install guard
15
+ % git clone https://github.com/supki/guard-haskell
16
+ % cd guard-haskell
17
+ % gem build guard-haskell.gemspec
18
+ % gem install guard-haskell-0.1.0.0.gem
19
+ ```
20
+
21
+ # Usage
22
+
23
+ ## How does it work?
24
+
25
+ For explanation what `guard` is and how to use it, please refer to the [`guard manual`][0]
26
+
27
+ `guard-haskell` uses [`hspec`][1] to run specs and check their success, so it makes some assumptions about your code style:
28
+
29
+ * `hspec` is your testing framework and
30
+
31
+ * [`hspec-discover`][2] (or similar tool) organizes your specs,
32
+ i.e. there is a "top" spec (usually `test/Spec.hs`) that pulls others in
33
+
34
+ When you type in `guard`, `guard-haskell` fires up an `ghci` instance which it talks to, reloading
35
+ and rerunning (parts of) "top" spec on files modifications.
36
+
37
+ ## Guardfile examples
38
+
39
+ Typical haskell project:
40
+
41
+ ```ruby
42
+ guard :haskell do
43
+ watch(%r{.*\.cabal$})
44
+ watch(%r{test/.+Spec.l?hs$})
45
+ watch(%r{src/.+.l?hs$})
46
+ end
47
+ ```
48
+
49
+ Customized haskell project:
50
+
51
+ ```ruby
52
+ guard :haskell, all_on_pass: true, ghci_options: ["-DTEST"] do
53
+ watch(%r{.*\.cabal$})
54
+ watch(%r{test/.+Spec.l?hs$})
55
+ watch(%r{lib/.+.l?hs$})
56
+ watch(%r{bin/.+.l?hs$})
57
+ end
58
+ ```
59
+
60
+ ## Options
61
+
62
+ `Guard::Haskell` has a bunch of options:
63
+
64
+ ### `all_on_start`
65
+
66
+ Run all specs on start (default: `false`).
67
+
68
+ ### `all_on_pass`
69
+
70
+ Run all specs after previously failing spec _finally_ passes (default: `false`).
71
+
72
+ ### `ghci_options`
73
+
74
+ Pass custom ghci options, for example, `-XCPP` directives like `-DTEST` (default: `[]`).
75
+
76
+ ### `top_spec`
77
+
78
+ "Top" spec location (default: `test/Spec.hs`).
79
+
80
+ [0]: https://github.com/guard/guard#readme
81
+ [1]: http://hspec.github.io/
82
+ [2]: http://hspec.github.io/hspec-discover.html
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
+ require "bundler/gem_tasks"
3
+ require "bundler/version"
4
+ require 'rspec/core/rake_task'
5
+
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'guard/haskell/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = 'guard-haskell'
8
+ s.version = Guard::HaskellVersion::VERSION
9
+ s.author = 'Matvey Aksenov'
10
+ s.email = 'matvey.aksenov@gmail.com'
11
+ s.summary = 'Guard gem for Haskell'
12
+ s.description = 'Guard::Haskell automatically runs your specs'
13
+ s.homepage = 'https://github.com/supki/guard-haskell#readme'
14
+ s.license = 'BSD3'
15
+
16
+ s.files = `git ls-files`.split($/)
17
+ s.test_files = s.files.grep(%r{^spec/})
18
+ s.require_path = 'lib'
19
+
20
+ s.add_dependency 'guard', '>= 2.1.1'
21
+ s.add_development_dependency 'bundler', '>= 1.3.5'
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rspec'
24
+ end
@@ -0,0 +1,102 @@
1
+ require 'bundler/setup'
2
+ require 'guard/plugin'
3
+ require 'set'
4
+
5
+ class ::String
6
+ def strip_lowercase_directories
7
+ matches = self.match(/^\p{Lower}[^\/]+\/(.+)/)
8
+ if matches
9
+ matches[1].strip_lowercase_directories
10
+ else
11
+ self
12
+ end
13
+ end
14
+
15
+ def path_to_module_name
16
+ self.gsub(/\//, ".")
17
+ end
18
+ end
19
+
20
+ module ::Guard
21
+ class Haskell < ::Guard::Plugin
22
+
23
+ require 'guard/haskell/repl'
24
+
25
+ attr_reader :repl, :top_spec, :ghci_options, :targets
26
+ attr_reader :all_on_start, :all_on_pass
27
+
28
+ def initialize options = {}
29
+ super
30
+ @last_run = :success # try to prove it wasn't :-)
31
+ @top_spec = options[:top_spec] || "test/Spec.hs"
32
+ @ghci_options = options[:ghci_options] || []
33
+ @all_on_start = options[:all_on_start] || false
34
+ @all_on_pass = options[:all_on_pass] || false
35
+ @repl = Repl.new
36
+ end
37
+
38
+ def start
39
+ repl.start(ghci_options)
40
+ repl.init(top_spec)
41
+
42
+ @targets = ::Set.new(::Dir.glob("**/*.{hs,lhs}"))
43
+
44
+ if all_on_start
45
+ run_all
46
+ success?
47
+ end
48
+ end
49
+
50
+ def stop
51
+ repl.exit
52
+ end
53
+
54
+ def reload
55
+ stop
56
+ start
57
+ end
58
+
59
+ def run_all
60
+ repl.run
61
+ end
62
+
63
+ def run pattern
64
+ if @last_run == :success
65
+ repl.run(pattern)
66
+ else
67
+ repl.rerun
68
+ end
69
+ end
70
+
71
+ def success?
72
+ if repl.success?
73
+ if @last_run == :failure
74
+ @last_run = :success
75
+ if all_on_pass
76
+ run_all
77
+ success?
78
+ end
79
+ end
80
+ Notifier.notify('Success')
81
+ else
82
+ @last_run = :failure
83
+ Notifier.notify('Failure', image: :failed)
84
+ end
85
+ end
86
+
87
+ def run_on_additions paths
88
+ unless paths.all? { |path| targets.include? path }
89
+ @targets += paths
90
+ repl.init(top_spec)
91
+ end
92
+ end
93
+
94
+ def run_on_modifications paths
95
+ case paths.first
96
+ when /(.+)Spec\.l?hs$/, /(.+)\.l?hs$/
97
+ run($1.strip_lowercase_directories.path_to_module_name)
98
+ success?
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,71 @@
1
+ require 'io/wait'
2
+ require 'open3'
3
+
4
+ class ::Guard::Haskell::Repl
5
+ attr_reader :stdin, :reader, :thread, :success
6
+
7
+ def start ghci_options
8
+ cmd = ["ghci"]
9
+ Dir["*"].each { |x| cmd << "-i#{x}" }
10
+ sandbox = ::Dir[".cabal-sandbox/*packages.conf.d"].first
11
+ cmd << "-package-db=#{sandbox}" if sandbox
12
+ cmd.concat(ghci_options)
13
+
14
+ @stdin, stdout, @thread = ::Open3.popen2e(*cmd)
15
+ @reader = ::Thread.new do
16
+ loop do
17
+ n = stdout.nread
18
+ if n > 0
19
+ out = stdout.read(n)
20
+ print out
21
+ if @running
22
+ case out
23
+ when /\d+ examples?, 0 failures/
24
+ @success = true
25
+ @running = false
26
+ when /\d+ examples?, \d+ failures?/,
27
+ /Failed, modules loaded:/,
28
+ /\*{3} Exception:/,
29
+ /phase `C preprocessor' failed/
30
+ @success = false
31
+ @running = false
32
+ end
33
+ end
34
+ else
35
+ sleep(0.1)
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ def init spec
42
+ _repl ":load #{spec}\n"
43
+ end
44
+
45
+ def exit
46
+ ::Process::kill "TERM", thread.pid
47
+ ::Thread.kill(reader)
48
+ end
49
+
50
+ def run pattern = nil
51
+ if pattern.nil?
52
+ _repl ":reload\n:main --color\n"
53
+ else
54
+ _repl ":reload\n:main --color --match #{pattern}\n"
55
+ end
56
+ end
57
+
58
+ def rerun
59
+ _repl ":reload\n:main --color --rerun\n"
60
+ end
61
+
62
+ def success?
63
+ while @running do sleep(0.01) end
64
+ @success
65
+ end
66
+
67
+ def _repl command
68
+ @running = true
69
+ stdin.write command
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ module Guard
2
+ module HaskellVersion
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
@@ -0,0 +1,243 @@
1
+ require 'spec_helper'
2
+ require 'guard/notifier'
3
+
4
+ describe "monkey patching" do
5
+ describe ::String do
6
+ describe "#strip_lowercase_directories" do
7
+ it "works on empty string" do
8
+ expect("".strip_lowercase_directories).to eq("")
9
+ end
10
+
11
+ it "works on string without lowercase directory prefixes" do
12
+ expect("Foo".strip_lowercase_directories).to eq("Foo")
13
+ end
14
+
15
+ it "works on string with lowercase directory prefix" do
16
+ expect("foo/Bar".strip_lowercase_directories).to eq("Bar")
17
+ end
18
+
19
+ it "works on string with multiple lowercase directory prefixes" do
20
+ expect("foo/bar/Baz".strip_lowercase_directories).to eq("Baz")
21
+ end
22
+ end
23
+
24
+ describe "#path_to_module_name" do
25
+ it "works on string without path separators" do
26
+ expect("Foo".path_to_module_name).to eq("Foo")
27
+ end
28
+
29
+ it "works on string with path separators" do
30
+ expect("Foo/Bar/Baz".path_to_module_name).to eq("Foo.Bar.Baz")
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ describe ::Guard::Haskell do
37
+ let(:guard) do
38
+ ::Guard::Haskell.new
39
+ end
40
+
41
+ before :each do
42
+ ::Guard.stub(:add_group)
43
+ ::Guard::Haskell::Repl.any_instance.stub(:start)
44
+ ::Guard::Haskell::Repl.any_instance.stub(:init)
45
+ end
46
+
47
+ describe ".initialize" do
48
+ it "has :all_on_start option" do
49
+ expect(guard.instance_variable_defined?(:@all_on_start)).to be_true
50
+ end
51
+
52
+ it "has :all_on_pass option" do
53
+ expect(guard.instance_variable_defined?(:@all_on_pass)).to be_true
54
+ end
55
+
56
+ it "has :ghci_options option" do
57
+ expect(guard.instance_variable_defined?(:@ghci_options)).to be_true
58
+ end
59
+
60
+ it "has :top_spec option" do
61
+ expect(guard.instance_variable_defined?(:@top_spec)).to be_true
62
+ end
63
+ end
64
+
65
+ describe "#start" do
66
+ it "starts repl" do
67
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:init).with("test/Spec.hs")
68
+
69
+ guard.start
70
+ end
71
+
72
+ it "does not run all specs on start by default" do
73
+ expect(guard).not_to receive(:run_all)
74
+ expect(guard).not_to receive(:success?)
75
+
76
+ guard.start
77
+ end
78
+
79
+ it "runs all specs on start with :all_on_start option enabled" do
80
+ custom_guard = ::Guard::Haskell.new(all_on_start: true)
81
+
82
+ expect(custom_guard).to receive(:run_all)
83
+ expect(custom_guard).to receive(:success?)
84
+
85
+ custom_guard.start
86
+ end
87
+
88
+ it "starts repl with custom spec specified with :top_spec option" do
89
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:init).with("test/CustomSpec.hs")
90
+
91
+ custom_guard = ::Guard::Haskell.new(top_spec: "test/CustomSpec.hs")
92
+ custom_guard.start
93
+ end
94
+ end
95
+
96
+ describe "#stop" do
97
+ it "stops repl" do
98
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:exit)
99
+
100
+ guard.start
101
+ guard.stop
102
+ end
103
+ end
104
+
105
+ describe "#reload" do
106
+ it "restarts repl" do
107
+ expect(guard).to receive(:stop)
108
+ expect(guard).to receive(:start)
109
+ guard.reload
110
+ end
111
+ end
112
+
113
+ describe "#run" do
114
+ it "runs specs matching pattern if last run was a success" do
115
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
116
+ guard.instance_variable_set(:@last_run, :success)
117
+
118
+ guard.start
119
+ guard.run("Foo")
120
+ end
121
+
122
+ it "reruns previous specs if last run was a failure" do
123
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:rerun)
124
+ guard.instance_variable_set(:@last_run, :failure)
125
+
126
+ guard.start
127
+ guard.run("Foo")
128
+ end
129
+ end
130
+
131
+ describe "#success" do
132
+ it "notifies on success" do
133
+ ::Guard::Haskell::Repl.any_instance.stub(:success?) { true }
134
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
135
+ expect(::Guard::Notifier).to receive(:notify).with('Success')
136
+ guard.instance_variable_set(:@last_run, :failure)
137
+
138
+ guard.start
139
+ guard.success?
140
+ expect(guard.instance_variable_get(:@last_run)).to eq(:success)
141
+ end
142
+
143
+ it "notifies on failure" do
144
+ ::Guard::Haskell::Repl.any_instance.stub(:success?) { false }
145
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
146
+ expect(::Guard::Notifier).to receive(:notify).with('Failure', image: :failed)
147
+ guard.instance_variable_set(:@last_run, :success)
148
+
149
+ guard.start
150
+ guard.success?
151
+ expect(guard.instance_variable_get(:@last_run)).to eq(:failure)
152
+ end
153
+
154
+ it "does not run all specs on success after failure by default" do
155
+ ::Guard::Haskell::Repl.any_instance.stub(:success?) { true }
156
+ guard.instance_variable_set(:@last_run, :failure)
157
+
158
+ expect(guard).not_to receive(:run_all)
159
+
160
+ guard.start
161
+ guard.success?
162
+ end
163
+
164
+ it "runs all specs on success after failure with :all_on_pass option" do
165
+ ::Guard::Haskell::Repl.any_instance.stub(:success?) { true }
166
+ custom_guard = ::Guard::Haskell.new(all_on_pass: true)
167
+ custom_guard.instance_variable_set(:@last_run, :failure)
168
+
169
+ expect(custom_guard).to receive(:run_all)
170
+
171
+ custom_guard.start
172
+ custom_guard.success?
173
+ end
174
+ end
175
+
176
+ describe "#run_on_additions" do
177
+ it "reinitializes the repl on new files" do
178
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:init).twice
179
+
180
+ guard.start
181
+ guard.instance_variable_set(:@targets, [])
182
+ guard.run_on_additions ["foo", "bar"]
183
+ end
184
+
185
+ it "does not reinitialize the repl if new files were seen before" do
186
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:init).once
187
+
188
+ guard.start
189
+ guard.instance_variable_set(:@targets, ["foo", "bar"])
190
+ guard.run_on_additions ["foo", "bar"]
191
+ end
192
+ end
193
+
194
+ describe "#run_on_modifications" do
195
+ it "run specs for simple haskell files" do
196
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
197
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
198
+
199
+ guard.start
200
+ guard.run_on_modifications(["Foo.hs"])
201
+ end
202
+
203
+ it "run specs for simple literate haskell files" do
204
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
205
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
206
+
207
+ guard.start
208
+ guard.run_on_modifications(["Foo.lhs"])
209
+ end
210
+
211
+ it "run specs for *complex* haskell files" do
212
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Bar.Baz")
213
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
214
+
215
+ guard.start
216
+ guard.run_on_modifications(["foo/Bar/Baz.hs"])
217
+ end
218
+
219
+ it "run specs for simple haskell spec files" do
220
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
221
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
222
+
223
+ guard.start
224
+ guard.run_on_modifications(["FooSpec.hs"])
225
+ end
226
+
227
+ it "run specs for simple literate haskell spec files" do
228
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Foo")
229
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
230
+
231
+ guard.start
232
+ guard.run_on_modifications(["FooSpec.lhs"])
233
+ end
234
+
235
+ it "run specs for *complex* haskell spec files" do
236
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:run).with("Bar.Baz")
237
+ expect_any_instance_of(::Guard::Haskell::Repl).to receive(:success?)
238
+
239
+ guard.start
240
+ guard.run_on_modifications(["foo/Bar/BazSpec.hs"])
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,11 @@
1
+ require 'rspec'
2
+ require 'guard/haskell'
3
+
4
+ RSpec.configure do |c|
5
+ c.color = true
6
+ c.order = :random
7
+ c.expect_with :rspec do |r|
8
+ r.syntax = :expect
9
+ end
10
+ c.warnings = true
11
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-haskell
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Matvey Aksenov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Guard::Haskell automatically runs your specs
70
+ email: matvey.aksenov@gmail.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - .gitignore
76
+ - .travis.yml
77
+ - Gemfile
78
+ - LICENSE
79
+ - README.md
80
+ - Rakefile
81
+ - guard-haskell.gemspec
82
+ - lib/guard/haskell.rb
83
+ - lib/guard/haskell/repl.rb
84
+ - lib/guard/haskell/version.rb
85
+ - spec/haskell_spec.rb
86
+ - spec/spec_helper.rb
87
+ homepage: https://github.com/supki/guard-haskell#readme
88
+ licenses:
89
+ - BSD3
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.1.11
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Guard gem for Haskell
111
+ test_files:
112
+ - spec/haskell_spec.rb
113
+ - spec/spec_helper.rb