totally-awesome-tests 0.1.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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +35 -0
- data/Rakefile +1 -0
- data/bin/totes +6 -0
- data/lib/totally-awesome-tests.rb +2 -0
- data/lib/totes.rb +18 -0
- data/lib/totes/autorun.rb +5 -0
- data/lib/totes/backtrace.rb +14 -0
- data/lib/totes/cli.rb +40 -0
- data/lib/totes/error.rb +5 -0
- data/lib/totes/kernel.rb +6 -0
- data/lib/totes/matcher.rb +75 -0
- data/lib/totes/matcher/be.rb +10 -0
- data/lib/totes/matcher/be_a.rb +10 -0
- data/lib/totes/matcher/be_anything.rb +16 -0
- data/lib/totes/matcher/eql.rb +11 -0
- data/lib/totes/matcher/respond_to.rb +10 -0
- data/lib/totes/noop.rb +12 -0
- data/lib/totes/query.rb +55 -0
- data/lib/totes/reporter.rb +47 -0
- data/lib/totes/resolver.rb +41 -0
- data/lib/totes/runner.rb +40 -0
- data/lib/totes/spec.rb +66 -0
- data/lib/totes/subject.rb +15 -0
- data/lib/totes/version.rb +3 -0
- data/totally-awesome-tests.gemspec +23 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a9def027932d8353e3fee64c8eff9abd74c5d485
|
4
|
+
data.tar.gz: 33a7b447b9b847d0ae3da6d24fd257b216887891
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 74420050ea6ded62946cfa13bd56f7d382e7cf689d29018cebf47ee2fe96dce51f71b1ffb6b0c3bd5f8908e77065d85e7b527161f868f11e9ec3b08f07cd9938
|
7
|
+
data.tar.gz: d57d4b5c084fb63a2ed63f3ddd5d1eeb9501b90c415d2e54403acb080a0c3e3881893051c418315ec811b6967bdc1e09854438c14a42240e059d889b8e8d8794
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Totess
|
2
|
+
|
3
|
+
Like \*Test but totally awesome.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'totally-awesome-tests'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install totally-awesome-tests
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Development
|
26
|
+
|
27
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
28
|
+
|
29
|
+
## Contributing
|
30
|
+
|
31
|
+
1. Fork it ( https://github.com/MadRabbit/totally-awesome-tests/fork )
|
32
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
33
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
34
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
35
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/totes
ADDED
data/lib/totes.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Totes
|
2
|
+
dir = File.dirname(__FILE__)
|
3
|
+
|
4
|
+
autoload :VERSION, "#{dir}/totes/version"
|
5
|
+
autoload :Cli, "#{dir}/totes/cli"
|
6
|
+
autoload :Resolver, "#{dir}/totes/resolver"
|
7
|
+
autoload :Runner, "#{dir}/totes/runner"
|
8
|
+
autoload :Spec, "#{dir}/totes/spec"
|
9
|
+
autoload :Noop, "#{dir}/totes/noop"
|
10
|
+
autoload :Subject, "#{dir}/totes/subject"
|
11
|
+
autoload :Matcher, "#{dir}/totes/matcher"
|
12
|
+
autoload :Query, "#{dir}/totes/query"
|
13
|
+
autoload :Error, "#{dir}/totes/error"
|
14
|
+
autoload :Reporter, "#{dir}/totes/reporter"
|
15
|
+
autoload :Backtrace, "#{dir}/totes/backtrace"
|
16
|
+
end
|
17
|
+
|
18
|
+
require_relative "./totes/kernel"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Totes
|
2
|
+
module Backtrace
|
3
|
+
#
|
4
|
+
# Filters the backtrace on an error
|
5
|
+
#
|
6
|
+
def self.filter(error)
|
7
|
+
error.set_backtrace error.backtrace.map { |line|
|
8
|
+
unless line =~ /totally-awesome-tests\/lib\/totes\/[a-z_]+\.rb/
|
9
|
+
line.gsub! /:in `block.+?$/, ""
|
10
|
+
end
|
11
|
+
}.compact
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/totes/cli.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Totes
|
2
|
+
class Cli
|
3
|
+
def initialize(args)
|
4
|
+
sources = parse_args(args)
|
5
|
+
|
6
|
+
require_relative "./autorun"
|
7
|
+
Totes::Resolver.new(sources).require_all
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def parse_args(args)
|
13
|
+
[].tap do |sources|
|
14
|
+
while arg = args.shift
|
15
|
+
case arg
|
16
|
+
when '-h', '--help' then print_help
|
17
|
+
else sources << arg
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def print_help
|
24
|
+
print_nicely_and_exit %Q{
|
25
|
+
Totally awesome tests usage:
|
26
|
+
|
27
|
+
totes [path ...] [OPTIONS]
|
28
|
+
|
29
|
+
OPTIONS:
|
30
|
+
-h, --help # show this help
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def print_nicely_and_exit(string)
|
35
|
+
print string.gsub(string[/\A(\n +)/], "\n").strip + "\n\n"
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/totes/error.rb
ADDED
data/lib/totes/kernel.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
module Totes
|
2
|
+
class Matcher
|
3
|
+
dir = File.dirname(__FILE__)
|
4
|
+
|
5
|
+
autoload :Be, "#{dir}/matcher/be"
|
6
|
+
autoload :BeA, "#{dir}/matcher/be_a"
|
7
|
+
autoload :Eql, "#{dir}/matcher/eql"
|
8
|
+
autoload :RespondTo, "#{dir}/matcher/respond_to"
|
9
|
+
autoload :BeAnything, "#{dir}/matcher/be_anything"
|
10
|
+
|
11
|
+
ALIASES = {
|
12
|
+
eq: "eql",
|
13
|
+
be_an: "be_a",
|
14
|
+
:== => "eql"
|
15
|
+
}
|
16
|
+
|
17
|
+
def self.build(name, *args, &block)
|
18
|
+
name = ALIASES[name.to_sym] || name.to_s
|
19
|
+
klass = name.gsub(/(\A|_)([a-z])/){ $2.upcase }
|
20
|
+
klass = const_get(klass) rescue nil
|
21
|
+
|
22
|
+
if !klass && name =~ /^be_[a-z]/
|
23
|
+
klass = BeAnything
|
24
|
+
args.unshift name.gsub(/^be_/, "")
|
25
|
+
end
|
26
|
+
|
27
|
+
klass && klass.new(*args, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.error_must(template=nil)
|
31
|
+
template ? (@error_must = template) : @error_must
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.error_wont(template=nil)
|
35
|
+
template ? (@error_wont = template) : @error_wont
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(value)
|
39
|
+
@value = value
|
40
|
+
end
|
41
|
+
|
42
|
+
def test(subject, fail_on: false)
|
43
|
+
if likes(subject) == fail_on
|
44
|
+
fail(subject, positive: !fail_on)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def likes(subject)
|
49
|
+
raise "#{self.class.name}#likes(subject) is not implemented yet"
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def fail(subject, positive: true)
|
55
|
+
super Totes::Error, build_error(subject, positive)
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_error(subject, positive)
|
59
|
+
template = positive ? self.class.error_must : self.class.error_wont
|
60
|
+
template % {subject: subject.inspect}.merge(find_params_in(template))
|
61
|
+
end
|
62
|
+
|
63
|
+
def find_params_in(template)
|
64
|
+
{}.tap do |params|
|
65
|
+
template.scan(/%\{(.+?)\}/).each do |match|
|
66
|
+
var_name = match[0].to_sym
|
67
|
+
|
68
|
+
if instance_variable_defined?("@#{var_name}")
|
69
|
+
params[var_name] = instance_variable_get("@#{var_name}").inspect
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Totes
|
2
|
+
class Totes::Matcher::BeAnything < Totes::Matcher
|
3
|
+
error_must "expected %{subject}#%{method} to be true, instead have %{result}"
|
4
|
+
error_wont "expected %{subject}#%{method} to be false, instead have %{result}"
|
5
|
+
|
6
|
+
def initialize(method_name, *args, &block)
|
7
|
+
@method = method_name =~ /\?$/ ? method_name : "#{method_name}?"
|
8
|
+
@args = args
|
9
|
+
@block = block
|
10
|
+
end
|
11
|
+
|
12
|
+
def likes(subject)
|
13
|
+
@result = subject.__send__ @method, *@args, &@block
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Totes
|
2
|
+
class Matcher::Eql < Totes::Matcher
|
3
|
+
error_must "expected %{subject} to be equal %{value}"
|
4
|
+
error_wont "expected %{subject} not to be equal %{value}"
|
5
|
+
|
6
|
+
def likes(subject)
|
7
|
+
# TODO make a deep matching thing work
|
8
|
+
subject == @value
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Totes
|
2
|
+
class Totes::Matcher::RespondTo < Totes::Matcher
|
3
|
+
error_must "expected %{subject} to have method '%{value}', but it ain't have one"
|
4
|
+
error_wont "expected %{subject} not to have method '%{value}', but it got one"
|
5
|
+
|
6
|
+
def likes(subject)
|
7
|
+
subject.respond_to?(@value)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/totes/noop.rb
ADDED
data/lib/totes/query.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#
|
2
|
+
# Represents the subject query (the left side of the assertions)
|
3
|
+
#
|
4
|
+
module Totes
|
5
|
+
class Query < Noop
|
6
|
+
def initialize(subject)
|
7
|
+
@subject = Totes::Subject.new(subject)
|
8
|
+
end
|
9
|
+
|
10
|
+
def must(*args, &block)
|
11
|
+
if matcher = args[0]
|
12
|
+
__try__ { matcher.test(@subject, fail_on: false) }
|
13
|
+
else
|
14
|
+
OperationsWrapper.new(self, :must)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def wont(*args, &block)
|
19
|
+
if matcher = args[0]
|
20
|
+
__try__ { matcher.test(@subject, fail_on: true) }
|
21
|
+
else
|
22
|
+
OperationsWrapper.new(self, :wont)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(name, *args, &block)
|
27
|
+
Totes::Query.new(@subject.__send__ name, *args, &block)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def __try__(&block)
|
33
|
+
yield
|
34
|
+
|
35
|
+
Totes::Reporter.inst.passed self
|
36
|
+
rescue Totes::Error => e
|
37
|
+
Totes::Backtrace.filter e
|
38
|
+
Totes::Reporter.inst.failed e
|
39
|
+
end
|
40
|
+
|
41
|
+
# the naughty operations matchers wrapper
|
42
|
+
class OperationsWrapper
|
43
|
+
def initialize(query, method)
|
44
|
+
@query = query
|
45
|
+
@method = method
|
46
|
+
end
|
47
|
+
|
48
|
+
[:==, :"!=", :=~, :<=, :>=, :<, :>].each do |operation|
|
49
|
+
define_method operation do |*args, &block|
|
50
|
+
@query.__send__ @method, Totes::Matcher.build(operation, *args, &block)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Totes
|
2
|
+
class Reporter
|
3
|
+
def self.inst
|
4
|
+
@inst ||= new
|
5
|
+
end
|
6
|
+
|
7
|
+
def reset
|
8
|
+
@tests = 0
|
9
|
+
@fails = []
|
10
|
+
@time = Time.new
|
11
|
+
puts "Testing\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
def passed(query)
|
15
|
+
@tests += 1
|
16
|
+
print "\e[32m.\e[0m"
|
17
|
+
end
|
18
|
+
|
19
|
+
def failed(error)
|
20
|
+
@tests += 1
|
21
|
+
@fails << error
|
22
|
+
print "\e[31mF\e[0m"
|
23
|
+
end
|
24
|
+
|
25
|
+
def summary
|
26
|
+
seconds = Time.new - @time
|
27
|
+
prefix = @fails.size == 0 ? "\e[32m✔︎ " : "\e[31m✖︎ "
|
28
|
+
|
29
|
+
puts "\n\n#{prefix}Tests: %d, Failed: %d \e[0m\e[;2m(%.1f seconds, %.1f tests/sec)\e[0m\n" % [
|
30
|
+
@tests, @fails.size, seconds, @tests / seconds
|
31
|
+
]
|
32
|
+
|
33
|
+
print_failures
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def print_failures
|
39
|
+
@fails.each do |error|
|
40
|
+
puts "\n\e[31mERROR: #{error.message}\e[0m"
|
41
|
+
error.backtrace.each do |line|
|
42
|
+
puts " \e[;2m#{line.gsub Dir.pwd+"/", ""}\e[0m"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Finds all the test files and requires all everything
|
2
|
+
module Totes
|
3
|
+
class Resolver
|
4
|
+
def initialize(sources)
|
5
|
+
@sources = sources
|
6
|
+
end
|
7
|
+
|
8
|
+
def require_all
|
9
|
+
add_to_load_path('lib', 'test')
|
10
|
+
require_spec_helpers
|
11
|
+
|
12
|
+
Dir[*clean_dirs_list].each do |filename|
|
13
|
+
require "#{Dir.pwd}/#{filename}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def add_to_load_path(*dirs)
|
20
|
+
dirs.each do |dir|
|
21
|
+
if File.exists?(dir) && File.directory?(dir)
|
22
|
+
$LOAD_PATH << "#{Dir.pwd}/#{dir}/"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def require_spec_helpers
|
28
|
+
test_helper_file = File.join(Dir.pwd, "test/test_helper.rb")
|
29
|
+
require test_helper_file if File.exists?(test_helper_file)
|
30
|
+
end
|
31
|
+
|
32
|
+
def clean_dirs_list
|
33
|
+
@sources = ['test'] if @sources.empty?
|
34
|
+
|
35
|
+
@sources.map do |name|
|
36
|
+
name = name.slice(0, name.size - 1) if name[name.size-1] == '/'
|
37
|
+
File.exists?(name) && File.directory?(name) ? "#{name}/**/*_test.rb" : name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/totes/runner.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Totes
|
2
|
+
class Runner
|
3
|
+
def self.specs
|
4
|
+
@specs ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.start
|
8
|
+
new(specs).run
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(specs)
|
12
|
+
@specs = specs
|
13
|
+
Totes::Reporter.inst.reset
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
@specs.each { |spec| loop_through spec }
|
18
|
+
Totes::Reporter.inst.summary
|
19
|
+
rescue StandardError => e
|
20
|
+
Totes::Backtrace.filter e
|
21
|
+
raise e
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def loop_through(spec)
|
27
|
+
exec [spec]
|
28
|
+
rescue Totes::Spec::StartOver => e
|
29
|
+
spec.instance_eval { @__count[:queries] = 0; @__specs = [] } # resetting the state
|
30
|
+
loop_through(spec)
|
31
|
+
end
|
32
|
+
|
33
|
+
def exec(specs)
|
34
|
+
specs.each do |spec|
|
35
|
+
spec.instance_eval &spec.instance_variable_get("@__block")
|
36
|
+
exec spec.instance_variable_get("@__specs")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/totes/spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
module Totes
|
2
|
+
class Spec
|
3
|
+
attr_reader :subject
|
4
|
+
|
5
|
+
StartOver = Class.new(StandardError)
|
6
|
+
|
7
|
+
def initialize(*args, &block)
|
8
|
+
@subject = __get_subject__(*args)
|
9
|
+
@__block = block
|
10
|
+
@__specs = [] # inner specs list
|
11
|
+
@__count = {
|
12
|
+
queries: 0, # global queries counter
|
13
|
+
current: 0 # the current query marker
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def describe(*args, &block)
|
18
|
+
@__specs << self.class.new(*args, &block).tap do |spec|
|
19
|
+
spec.instance_variable_set("@__count", @__count)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# returns the _subject_ query object
|
24
|
+
def it
|
25
|
+
if @__count[:current] == @__count[:queries]
|
26
|
+
@__count[:queries] += 1
|
27
|
+
Totes::Query.new(@subject) # going in for real
|
28
|
+
elsif @__count[:current] > @__count[:queries]
|
29
|
+
@__count[:queries] += 1
|
30
|
+
SkipQuery.new # rerunning through a previous query, skipping
|
31
|
+
else
|
32
|
+
@__count[:current] += 1 # switching to the next query
|
33
|
+
raise StartOver
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
alias :its :it # more readable on subqueries
|
38
|
+
|
39
|
+
# builds the matchers
|
40
|
+
def method_missing(*args, &block)
|
41
|
+
Totes::Matcher.build(*args, &block) || super(*args, &block)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def __get_subject__(*args)
|
47
|
+
return args[0] # TODO make it smarter
|
48
|
+
end
|
49
|
+
|
50
|
+
class SkipQuery
|
51
|
+
def must(*args); end # don't trigger the matchers
|
52
|
+
def wont(*args); end # don't trigger the matchers
|
53
|
+
|
54
|
+
def method_missing(*args, &block)
|
55
|
+
self # endlessly return self
|
56
|
+
end
|
57
|
+
|
58
|
+
# passing core methods (like :to_s and so on onto the subject as well)
|
59
|
+
(Class.new.instance_methods - [:__send__, :__id__, :object_id]).each do |core_method|
|
60
|
+
define_method core_method do |*args, &block|
|
61
|
+
method_missing core_method, *args, &block
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#
|
2
|
+
# This is a smarty pants wrapper around the subject values
|
3
|
+
#
|
4
|
+
module Totes
|
5
|
+
class Subject < Noop
|
6
|
+
def initialize(subject)
|
7
|
+
@subject = subject
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing(name, *args, &block)
|
11
|
+
# puts "#{name.inspect}(#{args.map(&:inspect).join(",")})"
|
12
|
+
@subject.__send__ name, *args, &block
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'totes/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "totally-awesome-tests"
|
8
|
+
spec.version = Totes::VERSION
|
9
|
+
spec.authors = ["Nikolay Nemshilov"]
|
10
|
+
spec.email = ["nemshilov@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Like totally awesome testing framework}
|
13
|
+
spec.description = %q{Like totally awesome testing framework. Did I mention "totally" already?}
|
14
|
+
spec.homepage = "https://github.com/MadRabbit/totally-awesome-tests"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "bin"
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: totally-awesome-tests
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nikolay Nemshilov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
description: Like totally awesome testing framework. Did I mention "totally" already?
|
28
|
+
email:
|
29
|
+
- nemshilov@gmail.com
|
30
|
+
executables:
|
31
|
+
- totes
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- ".gitignore"
|
36
|
+
- ".travis.yml"
|
37
|
+
- Gemfile
|
38
|
+
- README.md
|
39
|
+
- Rakefile
|
40
|
+
- bin/totes
|
41
|
+
- lib/totally-awesome-tests.rb
|
42
|
+
- lib/totes.rb
|
43
|
+
- lib/totes/autorun.rb
|
44
|
+
- lib/totes/backtrace.rb
|
45
|
+
- lib/totes/cli.rb
|
46
|
+
- lib/totes/error.rb
|
47
|
+
- lib/totes/kernel.rb
|
48
|
+
- lib/totes/matcher.rb
|
49
|
+
- lib/totes/matcher/be.rb
|
50
|
+
- lib/totes/matcher/be_a.rb
|
51
|
+
- lib/totes/matcher/be_anything.rb
|
52
|
+
- lib/totes/matcher/eql.rb
|
53
|
+
- lib/totes/matcher/respond_to.rb
|
54
|
+
- lib/totes/noop.rb
|
55
|
+
- lib/totes/query.rb
|
56
|
+
- lib/totes/reporter.rb
|
57
|
+
- lib/totes/resolver.rb
|
58
|
+
- lib/totes/runner.rb
|
59
|
+
- lib/totes/spec.rb
|
60
|
+
- lib/totes/subject.rb
|
61
|
+
- lib/totes/version.rb
|
62
|
+
- totally-awesome-tests.gemspec
|
63
|
+
homepage: https://github.com/MadRabbit/totally-awesome-tests
|
64
|
+
licenses:
|
65
|
+
- MIT
|
66
|
+
metadata: {}
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 2.4.5
|
84
|
+
signing_key:
|
85
|
+
specification_version: 4
|
86
|
+
summary: Like totally awesome testing framework
|
87
|
+
test_files: []
|