duck_test 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/ducktest +29 -0
- data/lib/duck_test/autoload_config.rb +103 -0
- data/lib/duck_test/base.rb +41 -0
- data/lib/duck_test/commands.rb +208 -0
- data/lib/duck_test/config.rb +675 -0
- data/lib/duck_test/config_helper.rb +99 -0
- data/lib/duck_test/console.rb +18 -0
- data/lib/duck_test/default_config.rb +48 -0
- data/lib/duck_test/frame_work/base.rb +587 -0
- data/lib/duck_test/frame_work/file_manager.rb +511 -0
- data/lib/duck_test/frame_work/filter_set.rb +233 -0
- data/lib/duck_test/frame_work/map.rb +331 -0
- data/lib/duck_test/frame_work/queue.rb +221 -0
- data/lib/duck_test/frame_work/queue_event.rb +29 -0
- data/lib/duck_test/frame_work/rspec/base.rb +17 -0
- data/lib/duck_test/frame_work/rspec/frame_work.rb +30 -0
- data/lib/duck_test/frame_work/test_unit/base.rb +14 -0
- data/lib/duck_test/frame_work/test_unit/frame_work.rb +33 -0
- data/lib/duck_test/frame_work/watch_config.rb +69 -0
- data/lib/duck_test/gem/helper.rb +107 -0
- data/lib/duck_test/logger.rb +127 -0
- data/lib/duck_test/option_parser.rb +30 -0
- data/lib/duck_test/platforms/base.rb +18 -0
- data/lib/duck_test/platforms/dependencies.rb +18 -0
- data/lib/duck_test/platforms/generic/base.rb +15 -0
- data/lib/duck_test/platforms/generic/listener.rb +104 -0
- data/lib/duck_test/platforms/linux/base.rb +15 -0
- data/lib/duck_test/platforms/linux/listener.rb +76 -0
- data/lib/duck_test/platforms/listener.rb +303 -0
- data/lib/duck_test/platforms/mac/base.rb +15 -0
- data/lib/duck_test/platforms/mac/listener.rb +79 -0
- data/lib/duck_test/platforms/mac/listener.rb.orig +147 -0
- data/lib/duck_test/platforms/os_helper.rb +102 -0
- data/lib/duck_test/platforms/watch_event.rb +47 -0
- data/lib/duck_test/platforms/windows/base.rb +15 -0
- data/lib/duck_test/platforms/windows/listener.rb +123 -0
- data/lib/duck_test/railtie.rb +29 -0
- data/lib/duck_test/usage.rb +34 -0
- data/lib/duck_test/usage.yml +112 -0
- data/lib/duck_test/version.rb +3 -0
- data/lib/duck_test.rb +6 -0
- data/lib/notes.txt +215 -0
- data/lib/tasks/duck_tests.rake +35 -0
- data/lib/tasks/gem_tasks.rake +18 -0
- metadata +92 -0
data/bin/ducktest
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
version = ">= 0"
|
6
|
+
|
7
|
+
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
|
8
|
+
version = $1
|
9
|
+
ARGV.shift
|
10
|
+
end
|
11
|
+
|
12
|
+
# get a list of all arguments passed on the CLI that DO NOT begin with a hyphen
|
13
|
+
values = ARGV.find_all {|item| !item.match(/^-/)}
|
14
|
+
|
15
|
+
# remove any arguments that DO NOT exist in the args array
|
16
|
+
args = %w(c development production test)
|
17
|
+
values.delete_if {|arg| args.include?(arg)}
|
18
|
+
|
19
|
+
# the remaining arguments should be arguments that are NOT SUPPORTED via the console, however,
|
20
|
+
# are useful for ducktest. Save them for later use.
|
21
|
+
if ENV["DUCK_TEST"].nil? || ENV["DUCK_TEST"].empty?
|
22
|
+
ENV["DUCK_TEST"] = values.first
|
23
|
+
end
|
24
|
+
|
25
|
+
# now, remove them from the CLI args so the console doesn't puke...
|
26
|
+
ARGV.delete_if {|arg| values.include?(arg)}
|
27
|
+
|
28
|
+
gem 'rails', version
|
29
|
+
load Gem.bin_path('rails', 'rails', version)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module DuckTest
|
2
|
+
|
3
|
+
##################################################################################
|
4
|
+
# Helper methods for configuring autoload paths during startup. One of the requirements essential to running tests in the console
|
5
|
+
# is making all of the module and class files visible to the console environment. Typically, this is accomplished via config/application.rb
|
6
|
+
# by adding to the autoload_paths like the following:
|
7
|
+
#
|
8
|
+
# config.autoload_paths += %W(#{Rails.root}/test)
|
9
|
+
#
|
10
|
+
# During startup DuckTest will attempt to take this step for you prior to configuration using a before_configuration block inside
|
11
|
+
# the Railtie class for the gem. You can guide this behavior in a couple of ways using a config file in two locations.
|
12
|
+
#
|
13
|
+
# - In the home directory of your file system: ~/.ducktestrc
|
14
|
+
# - In the root directory of your Rails application: Rails.root/.ducktest
|
15
|
+
#
|
16
|
+
# Notice the slight difference in the file names. One with rc and one without. The default configuration is to load each directory for
|
17
|
+
# each supported testing framework if the directory exists. Currently, testunit and rspec are the two testing frameworks.
|
18
|
+
# The startup process goes something like this:
|
19
|
+
#
|
20
|
+
# 1. load configuration settings from disk
|
21
|
+
# 2. determine the current Rails environment: test, development, production.
|
22
|
+
# 3. loop thru each directory from the config. if the directory is configured to be added to the autoload_path and
|
23
|
+
# the directory actually exists, then, it is added, otherwise, it is ignored.
|
24
|
+
#
|
25
|
+
# The following is a sample config file.
|
26
|
+
# ---
|
27
|
+
# test: # represents the Rails environment
|
28
|
+
# test: true # represents an app directory directly off of the app root
|
29
|
+
# spec: true
|
30
|
+
#
|
31
|
+
# development:
|
32
|
+
# test: true
|
33
|
+
# spec: false
|
34
|
+
#
|
35
|
+
# The default configuration is to add test and spec directories to the autoload_path. You can easily prevent any of them by setting
|
36
|
+
# the boolean value to false. You can add additional directories by adding the directory name and true.
|
37
|
+
#
|
38
|
+
# Load order:
|
39
|
+
# The default config for test and development is to add the test and spec directories if they exist. The config file ~/.ducktestrc
|
40
|
+
# in the home directory is loaded and merged with the default config and will override it's values. Next, the config file .ducktest in the app
|
41
|
+
# directory is loaded and merged with the default config and will override it's values. So, the rule is simple.
|
42
|
+
# - home directory overrides default
|
43
|
+
# - app directory overrides both
|
44
|
+
class AutoloadConfig
|
45
|
+
include LoggerHelper
|
46
|
+
|
47
|
+
attr_accessor :paths
|
48
|
+
|
49
|
+
##################################################################################
|
50
|
+
# Do I really have to say it?
|
51
|
+
def initialize
|
52
|
+
super
|
53
|
+
self.paths = []
|
54
|
+
self.load_config
|
55
|
+
end
|
56
|
+
|
57
|
+
##################################################################################
|
58
|
+
# Loads config settings for autoload paths
|
59
|
+
def load_config
|
60
|
+
config = {test: {test: true, spec: true}, development: {test: false, spec: false}}
|
61
|
+
|
62
|
+
if File.exists?("~/.ducktestrc")
|
63
|
+
config = merge(config, YAML.load_file("~/.ducktestrc"))
|
64
|
+
end
|
65
|
+
|
66
|
+
if File.exists?("#{Rails.root}/.ducktest")
|
67
|
+
config = merge(config, YAML.load_file("#{Rails.root}/.ducktest"))
|
68
|
+
end
|
69
|
+
|
70
|
+
config.each do |item|
|
71
|
+
if Rails.env.eql?(item.first.to_s)
|
72
|
+
item.last.each do |path|
|
73
|
+
if path.last
|
74
|
+
file_spec = "#{Rails.root}/#{path.first}"
|
75
|
+
if File.exist?(file_spec)
|
76
|
+
self.paths.push(file_spec)
|
77
|
+
ducklog.system "Adding path to autoload_paths: #{file_spec}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
break
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
##################################################################################
|
88
|
+
# Loads config settings for autoload paths
|
89
|
+
def merge(config, buffer)
|
90
|
+
buffer = buffer.symbolize_keys
|
91
|
+
config.each do |item|
|
92
|
+
if item.last.kind_of?(Hash)
|
93
|
+
if buffer[item.first]
|
94
|
+
item.last.merge!(buffer[item.first].symbolize_keys)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
return config
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# DuckTest Base module
|
2
|
+
require "duck_test/version"
|
3
|
+
|
4
|
+
module DuckTest
|
5
|
+
|
6
|
+
autoload :AutoloadConfig, 'duck_test/autoload_config'
|
7
|
+
autoload :Config, 'duck_test/config'
|
8
|
+
autoload :ConfigHelper, 'duck_test/config_helper'
|
9
|
+
autoload :Console, 'duck_test/console'
|
10
|
+
autoload :Commands, 'duck_test/commands'
|
11
|
+
autoload :DefaultConfig, 'duck_test/default_config'
|
12
|
+
autoload :FrameWork, 'duck_test/frame_work/base'
|
13
|
+
autoload :Logger, 'duck_test/logger'
|
14
|
+
autoload :LoggerHelper, 'duck_test/logger'
|
15
|
+
autoload :Platforms, 'duck_test/platforms/base'
|
16
|
+
autoload :Usage, 'duck_test/usage'
|
17
|
+
autoload :VersionHelper, 'duck_test/version'
|
18
|
+
|
19
|
+
##################################################################################
|
20
|
+
# Executes a configuration block to define watch lists, etc.
|
21
|
+
#
|
22
|
+
# DuckTest.config do
|
23
|
+
#
|
24
|
+
# runnable "**/*"
|
25
|
+
#
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @return [DuckTest::Config] Returns DuckTest::Config instance if a block is passed.
|
29
|
+
def self.config(&block)
|
30
|
+
config = nil
|
31
|
+
|
32
|
+
if block_given?
|
33
|
+
config = DuckTest::Config.new
|
34
|
+
config.instance_exec(&block)
|
35
|
+
config.class.block_run = true
|
36
|
+
end
|
37
|
+
|
38
|
+
return config
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
module DuckTest
|
2
|
+
|
3
|
+
# Console commands
|
4
|
+
class Commands
|
5
|
+
|
6
|
+
include LoggerHelper
|
7
|
+
include Usage
|
8
|
+
|
9
|
+
##################################################################################
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
##################################################################################
|
15
|
+
# Displays standard usage details
|
16
|
+
def to_s
|
17
|
+
usage(:usage, true)
|
18
|
+
return nil
|
19
|
+
end
|
20
|
+
|
21
|
+
##################################################################################
|
22
|
+
# See {Logger.log_level}
|
23
|
+
# @return [String] The output message
|
24
|
+
def ar(value = nil)
|
25
|
+
if value.blank?
|
26
|
+
usage(:ar, true)
|
27
|
+
msg = "Current log level: #{Logger.to_severity(ActiveRecord::Base.logger.level)}"
|
28
|
+
else
|
29
|
+
# converts from a symbol to a number
|
30
|
+
ActiveRecord::Base.logger.level = Logger.to_severity(value)
|
31
|
+
msg = "Log level set to: #{value}"
|
32
|
+
end
|
33
|
+
return msg
|
34
|
+
end
|
35
|
+
|
36
|
+
##################################################################################
|
37
|
+
# Toggles autorun on/off.
|
38
|
+
# @return [String] The output message
|
39
|
+
def autorun
|
40
|
+
return DuckTest::Config.framework.toggle_autorun
|
41
|
+
end
|
42
|
+
|
43
|
+
##################################################################################
|
44
|
+
# Lists all of the files that have been blacklisted.
|
45
|
+
# @return [String] The output message
|
46
|
+
def blacklist
|
47
|
+
list = []
|
48
|
+
DuckTest::Config.framework.black_list.each {|item| list.push(item.first)}
|
49
|
+
list.sort.each {|item| ducklog.console item}
|
50
|
+
return ""
|
51
|
+
end
|
52
|
+
|
53
|
+
##################################################################################
|
54
|
+
# Lists all of the non-runnable and runnable files that have been loaded into memory during the current session.
|
55
|
+
# @return [String] The output message
|
56
|
+
def history
|
57
|
+
framework = DuckTest::Config.framework
|
58
|
+
|
59
|
+
ducklog.console "================================="
|
60
|
+
|
61
|
+
if framework.non_loadable_history.length > 0 || framework.non_runnable_history.length > 0 || framework.runnable_history.length > 0
|
62
|
+
|
63
|
+
ducklog.console "\r\n Non-loadable file(s)" if framework.non_loadable_history.length > 0
|
64
|
+
|
65
|
+
framework.non_loadable_history.each do |file_spec|
|
66
|
+
ducklog.console " #{file_spec.gsub("#{framework.root}#{File::SEPARATOR}", "")}"
|
67
|
+
end
|
68
|
+
|
69
|
+
ducklog.console "\r\n Non-runnable file(s)" if framework.non_runnable_history.length > 0
|
70
|
+
|
71
|
+
framework.non_runnable_history.each do |file_spec|
|
72
|
+
ducklog.console " #{file_spec.gsub("#{framework.root}#{File::SEPARATOR}", "")}"
|
73
|
+
end
|
74
|
+
|
75
|
+
ducklog.console "\r\n Runnable file(s)" if framework.runnable_history.length > 0
|
76
|
+
|
77
|
+
framework.runnable_history.each do |file_spec|
|
78
|
+
ducklog.console " #{file_spec.gsub("#{framework.root}#{File::SEPARATOR}", "")}"
|
79
|
+
end
|
80
|
+
|
81
|
+
else
|
82
|
+
ducklog.console " Zero files have been changed and run"
|
83
|
+
end
|
84
|
+
|
85
|
+
return ""
|
86
|
+
end
|
87
|
+
|
88
|
+
##################################################################################
|
89
|
+
# Displays information about the current loaded testing framework.
|
90
|
+
# @return [String] The output message
|
91
|
+
def info
|
92
|
+
puts DuckTest::Config.framework.info
|
93
|
+
return ""
|
94
|
+
end
|
95
|
+
|
96
|
+
##################################################################################
|
97
|
+
# See {FrameWork::Queue#latency}
|
98
|
+
# @return [String] The output message
|
99
|
+
def latency(value = nil)
|
100
|
+
unless usage(:latency, value.blank?)
|
101
|
+
DuckTest::Config.framework.set_latency(value.to_f)
|
102
|
+
msg = "Queue latency set to: #{value}"
|
103
|
+
end
|
104
|
+
return msg
|
105
|
+
end
|
106
|
+
|
107
|
+
##################################################################################
|
108
|
+
# See {Platforms::Listener#speed}
|
109
|
+
# @return [String] The output message
|
110
|
+
def listen_speed(value = nil)
|
111
|
+
msg = nil
|
112
|
+
unless usage(:listen_speed, value.blank?)
|
113
|
+
DuckTest::Config.framework.set_listener_speed(value.to_f)
|
114
|
+
msg = "Listener speed set to: #{value}"
|
115
|
+
end
|
116
|
+
return msg
|
117
|
+
end
|
118
|
+
|
119
|
+
##################################################################################
|
120
|
+
# See {Logger.log_level}
|
121
|
+
# @return [String] The output message
|
122
|
+
def ll(value = nil)
|
123
|
+
if value.blank?
|
124
|
+
usage(:ll, true)
|
125
|
+
msg = "Current log level: #{Logger.to_severity(Logger.log_level)}"
|
126
|
+
else
|
127
|
+
Logger.log_level = value
|
128
|
+
msg = "Log level set to: #{value}"
|
129
|
+
end
|
130
|
+
return msg
|
131
|
+
end
|
132
|
+
|
133
|
+
##################################################################################
|
134
|
+
# Lists mappings of non-runnable to runnable files.
|
135
|
+
# @return [String] The output message
|
136
|
+
def maps
|
137
|
+
framework = DuckTest::Config.framework
|
138
|
+
|
139
|
+
framework.watch_configs.each do |watch_config|
|
140
|
+
ducklog.console "================================="
|
141
|
+
ducklog.console " pattern: #{watch_config.pattern}"
|
142
|
+
ducklog.console " runnrable?: #{watch_config.runnable?}"
|
143
|
+
ducklog.console " maps?: #{watch_config.maps.length > 0 ? true : false}"
|
144
|
+
ducklog.console ""
|
145
|
+
|
146
|
+
if watch_config.maps.length > 0
|
147
|
+
framework.white_list.each do |file_object|
|
148
|
+
if file_object.last[:watch_config].eql?(watch_config)
|
149
|
+
unless file_object.last[:is_dir]
|
150
|
+
runnable_files = framework.find_runnable_files(file_object.first, file_object.last[:watch_config])
|
151
|
+
if runnable_files.length > 0
|
152
|
+
ducklog.console " #{file_object.first.gsub("#{framework.root}#{File::SEPARATOR}", "")}"
|
153
|
+
runnable_files.each do |file_spec|
|
154
|
+
ducklog.console " executes ==> #{file_spec.gsub("#{framework.root}#{File::SEPARATOR}", "")}"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
return ""
|
165
|
+
end
|
166
|
+
|
167
|
+
##################################################################################
|
168
|
+
# Runs all tests that have been automagically loaded via the queue as a result of a file change or
|
169
|
+
# loaded manually with the load command.
|
170
|
+
# @return [String] The output message
|
171
|
+
def run(value=nil)
|
172
|
+
unless usage(:run, value.kind_of?(Symbol) && value.eql?(:help))
|
173
|
+
return DuckTest::Config.framework.run_manually(value)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
##################################################################################
|
178
|
+
# Loads all runnable test files from disk and executes the run_tests method.
|
179
|
+
# @return [String] The output message
|
180
|
+
def runall
|
181
|
+
return DuckTest::Config.framework.run_all
|
182
|
+
end
|
183
|
+
|
184
|
+
##################################################################################
|
185
|
+
# See {FrameWork::Queue#speed}
|
186
|
+
# @return [String] The output message
|
187
|
+
def speed(value = nil)
|
188
|
+
msg = nil
|
189
|
+
unless usage(:speed, value.blank?)
|
190
|
+
DuckTest::Config.framework.set_queue_speed(value.to_f)
|
191
|
+
msg = "Queue speed set to: #{value}"
|
192
|
+
end
|
193
|
+
return msg
|
194
|
+
end
|
195
|
+
|
196
|
+
##################################################################################
|
197
|
+
# Lists all of the files that have been whitelisted.
|
198
|
+
# @return [String] The output message
|
199
|
+
def whitelist
|
200
|
+
list = []
|
201
|
+
DuckTest::Config.framework.white_list.each {|item| list.push(item.first)}
|
202
|
+
list.sort.each {|item| ducklog.console item}
|
203
|
+
return ""
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|