spicycode-beholder 1.0.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,44 +1,58 @@
1
1
  begin
2
2
  require 'jeweler'
3
- Jeweler::Tasks.new do |s|
4
- s.name = "beholder"
5
- s.summary = "An ancient beholder that watches your treasure, and deals with thiefs"
6
- s.email = "chad@spicycode.com, rsanheim@gmail.com"
7
- s.homepage = "http://github.com/rsanheim/beholder"
8
- s.description = "beholder"
9
- s.authors = "Chad Humphries, Rob Sanheim"
10
- s.has_rdoc = true
11
- s.extra_rdoc_files = ["README.textile", "LICENSE", 'TODO']
12
- s.add_dependency "fsevents"
13
- s.bindir = 'bin'
14
- s.default_executable = 'beholder'
15
- s.executables = ["beholder"]
16
- s.require_path = 'lib'
17
- s.files = %w(LICENSE README.textile Rakefile TODO) + Dir.glob("{lib,examples}/**/*")
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = "beholder"
5
+ gem.summary = "An ancient beholder that watches your treasure, and deals with thiefs"
6
+ gem.email = "chad@spicycode.com, rsanheim@gmail.com"
7
+ gem.homepage = "http://github.com/rsanheim/beholder"
8
+ gem.description = "beholder"
9
+ gem.authors = "Chad Humphries, Rob Sanheim"
10
+ gem.has_rdoc = true
11
+ gem.extra_rdoc_files = ["README.md", "LICENSE"]
12
+ gem.bindir = 'bin'
13
+ gem.default_executable = 'beholder'
14
+ gem.executables = ["beholder"]
15
+ gem.require_path = 'lib'
16
+ gem.files = %w(LICENSE README.md Rakefile) + Dir.glob("{lib,spec}/**/*")
17
+ gem.add_dependency "fsevents"
18
+ gem.add_development_dependency "rspec"
19
+ gem.add_development_dependency "yard"
20
+ gem.add_development_dependency "rr", ">= 0.7.0"
18
21
  end
19
22
  rescue LoadError
20
23
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
21
24
  end
22
25
 
23
- begin
24
- gem "spicycode-micronaut"
25
- require 'micronaut/rake_task'
26
+ begin
27
+ require 'spec/rake/spectask'
26
28
 
27
- desc "Run all micronaut examples"
28
- Micronaut::RakeTask.new :examples do |t|
29
- t.pattern = "examples/**/*_example.rb"
29
+ Spec::Rake::SpecTask.new(:spec) do |spec|
30
+ spec.libs << 'lib' << 'spec'
31
+ spec.spec_files = FileList['spec/**/*_spec.rb']
32
+ spec.spec_opts = ['-c', '-fn']
30
33
  end
31
34
 
32
- namespace :examples do
33
- desc "Run all micronaut examples using rcov"
34
- Micronaut::RakeTask.new :coverage do |t|
35
- t.pattern = "examples/**/*_example.rb"
36
- t.rcov = true
37
- t.rcov_opts = "--exclude \"examples/*,gems/*,db/*,/Library/Frameworks/*,/Library/Ruby/*,config/*\" --text-summary --sort coverage --no-validator-links"
38
- end
35
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
36
+ spec.libs << 'lib' << 'spec'
37
+ spec.pattern = 'spec/**/*_spec.rb'
38
+ spec.rcov = true
39
+ spec.spec_opts = ['-c', '-fn']
39
40
  end
40
41
 
41
- task :default => 'examples:coverage'
42
+ task :spec => :check_dependencies
43
+
44
+ task :default => :spec
42
45
  rescue LoadError
43
- puts "Micronaut required to run examples. Install it with: sudo gem install spicycode-micronaut -s http://gems.github.com"
44
- end
46
+ task :default do
47
+ abort "Rspec is not available."
48
+ end
49
+ end
50
+
51
+ begin
52
+ require 'yard'
53
+ YARD::Rake::YardocTask.new
54
+ rescue LoadError
55
+ task :yardoc do
56
+ abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
57
+ end
58
+ end
@@ -1,25 +1,66 @@
1
1
  require 'rubygems'
2
- gem 'fsevents'
3
2
  require 'fsevents'
4
3
 
5
4
  class Beholder
5
+ DEFAULT_RUNNER = 'ruby'
6
6
 
7
- attr_reader :paths_to_watch, :sent_an_int, :mappings, :working_directory, :verbose
8
- attr_reader :watcher, :treasure_maps, :possible_map_locations, :all_examples, :default_runner
7
+ class << self
8
+ attr_writer :runner, :test_types, :possible_treasure_map_locations
9
+
10
+ def runner
11
+ @runner ||= ::Beholder::DEFAULT_RUNNER
12
+ end
13
+
14
+ def possible_treasure_map_locations
15
+ @possible_treasure_map_locations ||= ["#{Dir.pwd}/.treasure_map.rb", "#{Dir.pwd}/treasure_map.rb", "#{Dir.pwd}/config/treasure_map.rb"]
16
+ end
17
+
18
+ def test_types
19
+ @test_types ||= %w{spec examples test}
20
+ end
21
+
22
+ def test_extensions
23
+ @test_extensions ||= %w{spec example test}
24
+ end
25
+
26
+ def test_directories
27
+ return @test_directories if @test_directories
28
+ @test_directories = []
29
+ test_types.each do |test_type|
30
+ @test_directories << test_type if File.exist?(test_type)
31
+ end
32
+ @test_directories
33
+ end
34
+
35
+ def all_tests
36
+ lambda {
37
+ dirs = []
38
+ test_directories.each do |dir|
39
+ test_extensions.each do |test_ext|
40
+ files = Dir["#{dir}/**/*_#{test_ext}.rb"]
41
+ # Ignore tarantula tests for now until we add a cleaner way
42
+ files.reject! { |file| file.include?('tarantula/') }
43
+ next if files.empty?
44
+ dirs << files
45
+ end
46
+ end
47
+ dirs.flatten!
48
+ }.call
49
+ end
50
+ end
51
+
52
+ attr_reader :paths_to_watch, :sent_an_int, :mappings, :be_verbose
53
+ attr_reader :watcher, :treasure_maps
9
54
 
10
55
  def initialize
11
- @working_directory = Dir.pwd
12
- @paths_to_watch, @all_examples = [], []
56
+ @paths_to_watch = []
13
57
  @mappings, @treasure_maps = {}, {}
14
58
  @sent_an_int = false
15
- @verbose = ARGV.include?("-v") || ARGV.include?("--verbose")
16
- @default_runner = 'ruby'
17
- @possible_map_locations = ["#{@working_directory}/.treasure_map.rb", "#{@working_directory}/treasure_map.rb", "#{@working_directory}/config/treasure_map.rb"]
59
+ @be_verbose = ARGV.include?("-v") || ARGV.include?("--verbose")
18
60
  end
19
61
 
20
62
  def run
21
63
  read_all_maps
22
- set_all_examples if all_examples.empty?
23
64
  prepare
24
65
  start
25
66
  end
@@ -39,22 +80,22 @@ class Beholder
39
80
  end
40
81
 
41
82
  def default_options
42
- { :command => "ruby" }
83
+ { :command => ::Beholder.runner }
43
84
  end
44
85
 
45
- def add_mapping(pattern, options = {}, &blk)
86
+ def prepare_spell_for(pattern, options = {}, &blk)
46
87
  options = default_options.merge(options)
47
88
  @current_map << [pattern, options, blk]
48
89
  end
49
90
 
50
- def watch(*paths)
91
+ def keep_a_watchful_eye_for(*paths)
51
92
  @paths_to_watch.concat(paths)
52
93
  @paths_to_watch.uniq!
53
94
  @paths_to_watch.sort!
54
95
  end
55
96
 
56
- alias :keep_a_watchful_eye_for :watch
57
- alias :prepare_spell_for :add_mapping
97
+ alias :watch :keep_a_watchful_eye_for
98
+ alias :add_mapping :prepare_spell_for
58
99
 
59
100
  def shutdown
60
101
  watcher.shutdown
@@ -64,7 +105,7 @@ class Beholder
64
105
  def on_change(paths)
65
106
  say "#{paths} changed" unless paths.nil? || paths.empty?
66
107
 
67
- treasure_maps_changed = paths.select { |p| possible_map_locations.include?(p) }
108
+ treasure_maps_changed = paths.select { |p| ::Beholder.possible_treasure_map_locations.include?(p) }
68
109
  treasure_maps_changed.each {|map_path| read_map_at(map_path) }
69
110
 
70
111
  runners_with_paths = {}
@@ -80,9 +121,9 @@ class Beholder
80
121
  run_tests runners_with_paths
81
122
  end
82
123
 
83
- def examples_matching(name, suffix = "example")
84
- regex = %r%.*#{name}_#{suffix}\.rb$%
85
- all_examples.find_all { |ex| ex =~ regex }
124
+ def tests_matching(name)
125
+ regex = %r%.*#{name}.*\.rb$%
126
+ ::Beholder.all_tests.find_all { |ex| ex =~ regex }
86
127
  end
87
128
 
88
129
  def build_cmd(runner, paths)
@@ -94,7 +135,7 @@ class Beholder
94
135
 
95
136
  def read_all_maps
96
137
  read_default_map
97
- possible_map_locations.each { |path| read_map_at(path) }
138
+ ::Beholder::possible_treasure_map_locations.each { |path| read_map_at(path) }
98
139
  end
99
140
 
100
141
  def read_map_at(path)
@@ -119,7 +160,7 @@ class Beholder
119
160
  puts " Did you just send me an INT? Ugh. I'll quit for real if you do it again."
120
161
  @sent_an_int = true
121
162
  Kernel.sleep 1.5
122
- run_tests default_runner => all_examples
163
+ run_tests ::Beholder.runner => ::Beholder.all_tests
123
164
  end
124
165
  end
125
166
  end
@@ -139,20 +180,16 @@ class Beholder
139
180
  end
140
181
 
141
182
  def read_default_map
142
- map_for(:default) do |m|
143
-
144
- m.watch 'lib', 'examples'
145
-
146
- m.add_mapping %r%examples/(.*)_example\.rb% do |match|
147
- ["examples/#{match[1]}_example.rb"]
183
+ map_for(:and_lo_for_i_am_the_default_treasure_map) do |m|
184
+
185
+ m.watch 'lib', *::Beholder.test_directories
186
+
187
+ m.prepare_spell_for %r%lib/(.*)\.rb% do |match|
188
+ tests_matching match[1]
148
189
  end
149
190
 
150
- m.add_mapping %r%examples/example_helper\.rb% do |match|
151
- Dir["examples/**/*_example.rb"]
152
- end
153
-
154
- m.add_mapping %r%lib/(.*)\.rb% do |match|
155
- examples_matching match[1]
191
+ m.prepare_spell_for %r%.*#{::Beholder.test_extensions.join('|')}\.rb% do |match|
192
+ tests_matching match[1]
156
193
  end
157
194
 
158
195
  end
@@ -162,21 +199,6 @@ class Beholder
162
199
  @treasure_maps = {}
163
200
  end
164
201
 
165
- # TODO: These need to be lambdas to catch newly added files
166
- def set_all_examples
167
- if paths_to_watch.include?('examples')
168
- @all_examples += Dir['examples/**/*_example.rb']
169
- end
170
-
171
- if paths_to_watch.include?('test')
172
- @all_examples += Dir['test/**/*_test.rb']
173
- end
174
-
175
- if paths_to_watch.include?('spec')
176
- @all_examples += Dir['spec/**/*_spec.rb']
177
- end
178
- end
179
-
180
202
  def blink
181
203
  @sent_an_int = false
182
204
  end
@@ -185,6 +207,7 @@ class Beholder
185
207
  treasure_maps.each do |name, map|
186
208
  map.each do |pattern, options, blk|
187
209
  run_using = options[:command]
210
+
188
211
  if match = path.match(pattern)
189
212
  say "Found the match for #{path} using the #{name} map "
190
213
  runners_with_paths[run_using] ||= []
@@ -215,15 +238,15 @@ class Beholder
215
238
  runners_with_paths.each do |runner, paths|
216
239
  paths.reject! do |path|
217
240
  found_treasure = File.exist?(path)
218
- puts "#{path} does not exist." unless found_treasure
241
+ say "#{path} does not exist." unless found_treasure
219
242
  end
220
243
  end
221
244
 
222
245
  runners_with_paths.reject! { |runner, paths| paths.empty? }
223
246
  end
224
247
 
225
- def say(msg)
226
- puts msg if verbose
248
+ def say(this_message_please)
249
+ puts this_message_please if be_verbose
227
250
  end
228
251
 
229
252
  end
@@ -1,7 +1,21 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../example_helper")
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
2
 
3
3
  describe Beholder do
4
4
 
5
+ describe "runner" do
6
+ it "should be 'ruby'" do
7
+ Beholder.runner.should == 'ruby'
8
+ end
9
+ end
10
+
11
+ describe "test types" do
12
+ it "should include 'spec', 'examples', and 'test' by default" do
13
+ Beholder.test_types.should include('spec')
14
+ Beholder.test_types.should include('examples')
15
+ Beholder.test_types.should include('test')
16
+ end
17
+ end
18
+
5
19
  describe "when run is called" do
6
20
 
7
21
  it "should create a new beholder" do
@@ -115,36 +129,34 @@ describe Beholder do
115
129
  end
116
130
  end
117
131
 
118
- describe "add_mapping" do
119
-
120
- it "adds pattern and block to current_map" do
121
- beholder = Beholder.new
122
- blk = lambda { "something" }
123
- beholder.map_for(:example) { |m| m.add_mapping(%r%example_helper\.rb%, &blk) }
124
- beholder.treasure_maps[:example].should == [[ %r%example_helper\.rb%, {:command => "ruby"}, blk ]]
125
- end
126
-
127
- it "aliases prepare_spell_for to add_mapping" do
128
- beholder = Beholder.new
129
- blk = lambda { "something" }
132
+ describe "prepare spell for" do
133
+ def generate_map(beholder, blk)
130
134
  beholder.map_for(:example) { |m| m.prepare_spell_for(%r%example_helper\.rb%, &blk) }
131
- beholder.treasure_maps[:example].should == [[ %r%example_helper\.rb%, {:command => "ruby"}, blk ]]
132
135
  end
133
136
 
134
- it "adds mapping using default command of ruby" do
137
+ it "adds pattern and block to current_map" do
135
138
  beholder = Beholder.new
136
139
  blk = lambda { "something" }
137
- beholder.map_for(:example) { |m| m.add_mapping(%r%example_helper\.rb%, &blk) }
138
- beholder.treasure_maps[:example].should == [[ %r%example_helper\.rb%, {:command => "ruby"}, blk ]]
139
- end
140
+ generate_map(beholder, blk)
141
+ # This is not ideal
142
+ # currently returns array, array
143
+ beholder.treasure_maps[:example].first.first.should == %r%example_helper\.rb%
144
+ end
145
+
146
+ # it "adds mapping using default command of ruby" do
147
+ # beholder = Beholder.new
148
+ # blk = lambda { "something" }
149
+ # generate_map(beholder, blk)
150
+ # beholder.treasure_maps[:example].should == [[ %r%example_helper\.rb%, {:command => "ruby"}, blk ]]
151
+ # end
140
152
  end
141
153
 
142
- describe "examples_matching" do
154
+ describe "tests_matching" do
143
155
 
144
- it "finds a fuzzy match from all_examples" do
156
+ it "finds a fuzzy match from all tests" do
145
157
  beholder = Beholder.new
146
- stub(beholder).all_examples { ["examples/unit/foo_example.rb", "examples/slow/foo_example.rb", "src/foo_system_example.rb", "examples/some/deeper/dir/foo_example.rb"] }
147
- beholder.examples_matching("foo").should == ["examples/unit/foo_example.rb", "examples/slow/foo_example.rb", "examples/some/deeper/dir/foo_example.rb"]
158
+ stub(Beholder).all_tests { ["spec/unit/bar_example.rb", "src/foo_system_example.rb", "spec/some/deeper/dir/foo_example.rb"] }
159
+ beholder.tests_matching("foo").should == ["src/foo_system_example.rb", "spec/some/deeper/dir/foo_example.rb"]
148
160
  end
149
161
  end
150
162
 
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format nested
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'beholder'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+ require 'rr'
8
+
9
+ Spec::Runner.configure do |config|
10
+ config.mock_with :rr
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spicycode-beholder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Humphries, Rob Sanheim
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-20 00:00:00 -07:00
12
+ date: 2009-08-23 00:00:00 -07:00
13
13
  default_executable: beholder
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,6 +22,36 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: "0"
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: yard
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: rr
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.7.0
54
+ version:
25
55
  description: beholder
26
56
  email: chad@spicycode.com, rsanheim@gmail.com
27
57
  executables:
@@ -30,18 +60,17 @@ extensions: []
30
60
 
31
61
  extra_rdoc_files:
32
62
  - LICENSE
33
- - README.textile
34
- - TODO
35
63
  files:
36
64
  - LICENSE
37
- - README.textile
38
65
  - Rakefile
39
- - TODO
40
- - examples/example_helper.rb
41
- - examples/lib/beholder_example.rb
42
66
  - lib/beholder.rb
43
- has_rdoc: true
67
+ - spec/beholder_spec.rb
68
+ - spec/setup.rb
69
+ - spec/spec.opts
70
+ - spec/spec_helper.rb
71
+ has_rdoc: false
44
72
  homepage: http://github.com/rsanheim/beholder
73
+ licenses:
45
74
  post_install_message:
46
75
  rdoc_options:
47
76
  - --charset=UTF-8
@@ -62,10 +91,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
91
  requirements: []
63
92
 
64
93
  rubyforge_project:
65
- rubygems_version: 1.2.0
94
+ rubygems_version: 1.3.5
66
95
  signing_key:
67
96
  specification_version: 3
68
97
  summary: An ancient beholder that watches your treasure, and deals with thiefs
69
98
  test_files:
70
- - examples/example_helper.rb
71
- - examples/lib/beholder_example.rb
99
+ - spec/beholder_spec.rb
100
+ - spec/setup.rb
101
+ - spec/spec_helper.rb
@@ -1,67 +0,0 @@
1
- h1. Beholder
2
-
3
- An ancient beholder that watches your treasure, and deals with thiefs.
4
-
5
- h2. What does it do?
6
-
7
- Think autotest, but powered by fseventd.
8
-
9
- h2. Requirements
10
-
11
- # OSX 10.5 or higher
12
- # RubyCocoa
13
- # fsevents gem
14
-
15
-
16
-
17
- The default treasure map:
18
-
19
- map_for(:default_dungeon) do |wizard|
20
-
21
- wizard.keep_a_watchful_eye_for 'app', 'config', 'lib', 'examples'
22
-
23
- wizard.prepare_spell_for /\/app\/(.*)\.rb/ do |spell_component|
24
- ["examples/#{spell_component[1]}.rb"]
25
- end
26
-
27
- wizard.prepare_spell_for /\/lib\/(.*)\.rb/ do |spell_component|
28
- ["examples/lib/#{spell_component[1]}_example.rb"]
29
- end
30
-
31
- wizard.prepare_spell_for /\/examples\/(.*)_example\.rb/ do |spell_component|
32
- ["examples/#{spell_component[1]}_example.rb"]
33
- end
34
-
35
- wizard.prepare_spell_for /\/examples\/example_helper\.rb/ do |spell_component|
36
- Dir["examples/**/*_example.rb"]
37
- end
38
-
39
- wizard.prepare_spell_for /\/config/ do
40
- Dir["examples/**/*_example.rb"]
41
- end
42
-
43
- end
44
-
45
-
46
- In your own treasure map (stored as treasure_map.rb, .treasure_map.rb, or config/treasure_map.rb) you could do:
47
-
48
- map_for(:beholders_lair) do |wizard|
49
-
50
- # Clear all watched paths => wizard.paths_to_watch.clear
51
- # Add these paths to the paths to watch
52
- wizard.keep_a_watchful_eye_for 'coverage'
53
-
54
- # Forget all other treasure maps loaded
55
- # wizard.clear_maps
56
-
57
- # Add your own rules
58
- # wizard.prepare_spell_for /\/foobar/ do
59
- # Dir["examples/foobar/*_example.rb"]
60
- # end
61
-
62
- # You could set the list of all examples to be run after pressing ctrl-c once
63
- # it defaults to any files in examples, spec, and test
64
- wizard.all_examples = Dir['your/path/**/*_here.rb']
65
- end
66
-
67
- Treasure maps are automatically reloaded when you change them, so you can fire up Beholder and start iterating on the config live.
data/TODO DELETED
@@ -1 +0,0 @@
1
- TODO:
@@ -1,20 +0,0 @@
1
- lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib")
2
- $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
3
-
4
- require 'beholder'
5
- require 'rubygems'
6
- require 'micronaut'
7
- gem 'rr', '>=0.7.0'
8
- require 'log_buddy'
9
- LogBuddy.init
10
-
11
- def not_in_editor?
12
- ['TM_MODE', 'EMACS', 'VIM'].all? { |k| !ENV.has_key?(k) }
13
- end
14
-
15
- Micronaut.configure do |c|
16
- c.formatter = :documentation
17
- c.mock_with :rr
18
- c.color_enabled = not_in_editor?
19
- c.filter_run :focused => true
20
- end