insist 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.batcave/manifest +5 -0
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/Makefile +46 -0
- data/README +0 -0
- data/insist.gemspec +20 -0
- data/lib/insist.rb +53 -0
- data/lib/insist/assert.rb +10 -0
- data/lib/insist/comparators.rb +45 -0
- data/lib/insist/failure.rb +4 -0
- data/lib/insist/namespace.rb +1 -0
- data/lib/insist/nil.rb +7 -0
- data/lib/insist/raises.rb +14 -0
- data/notify-failure.sh +15 -0
- data/spec/insist/comparators_spec.rb +42 -0
- data/spec/insist/nil_spec.rb +16 -0
- data/spec/insist_spec.rb +14 -0
- data/spec/spec_setup.rb +1 -0
- data/test/all.rb +24 -0
- data/test/docs.rb +40 -0
- data/test/testing.rb +14 -0
- metadata +80 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
source :rubygems
|
data/Makefile
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
GEMSPEC=$(shell ls *.gemspec)
|
2
|
+
VERSION=$(shell awk -F\" '/spec.version/ { print $$2 }' $(GEMSPEC))
|
3
|
+
NAME=$(shell awk -F\" '/spec.name/ { print $$2 }' $(GEMSPEC))
|
4
|
+
GEM=$(NAME)-$(VERSION).gem
|
5
|
+
|
6
|
+
.PHONY: test
|
7
|
+
test:
|
8
|
+
sh notify-failure.sh ruby test/all.rb
|
9
|
+
|
10
|
+
.PHONY: testloop
|
11
|
+
testloop:
|
12
|
+
while true; do \
|
13
|
+
$(MAKE) test; \
|
14
|
+
$(MAKE) wait-for-changes; \
|
15
|
+
done
|
16
|
+
|
17
|
+
.PHONY: serve-coverage
|
18
|
+
serve-coverage:
|
19
|
+
cd coverage; python -mSimpleHTTPServer
|
20
|
+
|
21
|
+
.PHONY: wait-for-changes
|
22
|
+
wait-for-changes:
|
23
|
+
-inotifywait --exclude '\.swp' -e modify $$(find $(DIRS) -name '*.rb'; find $(DIRS) -type d)
|
24
|
+
|
25
|
+
.PHONY: package
|
26
|
+
package: | $(GEM)
|
27
|
+
|
28
|
+
.PHONY: gem
|
29
|
+
gem: $(GEM)
|
30
|
+
|
31
|
+
$(GEM):
|
32
|
+
gem build $(GEMSPEC)
|
33
|
+
|
34
|
+
.PHONY: test-package
|
35
|
+
test-package: $(GEM)
|
36
|
+
# Sometimes 'gem build' makes a faulty gem.
|
37
|
+
gem unpack $(GEM)
|
38
|
+
rm -rf ftw-$(VERSION)/
|
39
|
+
|
40
|
+
.PHONY: publish
|
41
|
+
publish: test-package
|
42
|
+
gem push $(GEM)
|
43
|
+
|
44
|
+
.PHONY: install
|
45
|
+
install: $(GEM)
|
46
|
+
gem install $(GEM)
|
data/README
ADDED
File without changes
|
data/insist.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
files = %x{git ls-files}.split("\n")
|
3
|
+
|
4
|
+
spec.name = "insist"
|
5
|
+
spec.version = "0.0.1"
|
6
|
+
spec.summary = "insist"
|
7
|
+
spec.description = "insist"
|
8
|
+
spec.license = "none chosen yet"
|
9
|
+
|
10
|
+
# Note: You should set the version explicitly.
|
11
|
+
spec.add_dependency "cabin", ">0" # for logging. apache 2 license
|
12
|
+
spec.files = files
|
13
|
+
spec.require_paths << "lib"
|
14
|
+
spec.bindir = "bin"
|
15
|
+
|
16
|
+
spec.authors = ["Jordan Sissel"]
|
17
|
+
spec.email = ["jls@semicomplete.com"]
|
18
|
+
#spec.homepage = "..."
|
19
|
+
end
|
20
|
+
|
data/lib/insist.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require "insist/namespace"
|
2
|
+
|
3
|
+
require "insist/assert"
|
4
|
+
require "insist/comparators"
|
5
|
+
require "insist/raises"
|
6
|
+
require "insist/failure"
|
7
|
+
require "insist/nil"
|
8
|
+
|
9
|
+
# Insist on correctness.
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# data = { "hello" => "world" }
|
15
|
+
# insist { data["hello"] } == "world"
|
16
|
+
#
|
17
|
+
# This class aims to work similarly to how rspec's "should" stuff does, but
|
18
|
+
# instead of molesting Object allows you to neatly wrap values with blocks
|
19
|
+
# while still checking for expected values.
|
20
|
+
class Insist
|
21
|
+
class Failure < StandardError; end
|
22
|
+
|
23
|
+
include Insist::Comparators
|
24
|
+
include Insist::Nil
|
25
|
+
include Insist::Assert
|
26
|
+
include Insist::Raises
|
27
|
+
|
28
|
+
# Create a new insist with a block.
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
#
|
32
|
+
# Insist.new { value }
|
33
|
+
#
|
34
|
+
# Better:
|
35
|
+
#
|
36
|
+
# insist { value }
|
37
|
+
def initialize(&block)
|
38
|
+
@callback = block
|
39
|
+
end
|
40
|
+
|
41
|
+
def value
|
42
|
+
# TODO(sissel): make caching the value optional
|
43
|
+
@value ||= @callback.call
|
44
|
+
return @value
|
45
|
+
end
|
46
|
+
end # class Insist
|
47
|
+
|
48
|
+
module Kernel
|
49
|
+
# A shortcut to 'Insist.new'
|
50
|
+
def insist(&block)
|
51
|
+
return Insist.new(&block)
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
module Insist::Assert
|
3
|
+
# Assert something is true.
|
4
|
+
#
|
5
|
+
# This will raise Insist::Failure with the given message if the 'truthy'
|
6
|
+
# value is false.
|
7
|
+
def assert(truthy, message)
|
8
|
+
raise Insist::Failure.new(message) if !truthy
|
9
|
+
end # def assert
|
10
|
+
end # module Insist::Assert
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
# Provides the '==' assertion method.
|
3
|
+
#
|
4
|
+
# Example:
|
5
|
+
#
|
6
|
+
# insist { "foo" } == "foo"
|
7
|
+
module Insist::Comparators
|
8
|
+
include Insist::Assert
|
9
|
+
|
10
|
+
# value == expected
|
11
|
+
def ==(expected)
|
12
|
+
assert(value == expected,
|
13
|
+
"Expected #{expected.inspect}, but got #{value.inspect}")
|
14
|
+
end # def ==
|
15
|
+
|
16
|
+
# value <= expected
|
17
|
+
def <=(expected)
|
18
|
+
assert(value <= expected,
|
19
|
+
"Expected #{value.inspect} <= #{expected.inspect}")
|
20
|
+
end # def <=
|
21
|
+
|
22
|
+
# value >= expected
|
23
|
+
def >=(expected)
|
24
|
+
assert(value >= expected,
|
25
|
+
"Expected #{value.inspect} >= #{expected.inspect}")
|
26
|
+
end # def >=
|
27
|
+
|
28
|
+
# value > expected
|
29
|
+
def >(expected)
|
30
|
+
assert(value > expected,
|
31
|
+
"Expected #{value.inspect} > #{expected.inspect}")
|
32
|
+
end # def >
|
33
|
+
|
34
|
+
# value < expected
|
35
|
+
def <(expected)
|
36
|
+
assert(value < expected,
|
37
|
+
"Expected #{value.inspect} < #{expected.inspect}")
|
38
|
+
end # def <
|
39
|
+
|
40
|
+
# value != expected
|
41
|
+
def !=(expected)
|
42
|
+
assert(value != expected,
|
43
|
+
"Expected #{value.inspect} != #{expected.inspect}")
|
44
|
+
end # def !=
|
45
|
+
end # module Insist::Comparators
|
@@ -0,0 +1 @@
|
|
1
|
+
class Insist; end
|
data/lib/insist/nil.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Insist::Raises
|
3
|
+
# Assert raises
|
4
|
+
def raises(exception_class)
|
5
|
+
begin
|
6
|
+
value
|
7
|
+
rescue exception_class => e
|
8
|
+
return # We're OK
|
9
|
+
end
|
10
|
+
|
11
|
+
assert(false,
|
12
|
+
"Expected exception '#{exception_class}' but none was raised")
|
13
|
+
end # def raises
|
14
|
+
end # module Insist::Raises
|
data/notify-failure.sh
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require "spec_setup"
|
2
|
+
require "insist"
|
3
|
+
|
4
|
+
describe Insist::Comparators do
|
5
|
+
subject do
|
6
|
+
Insist.new { 30 }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#==" do
|
10
|
+
it "should be OK if the #value is equal" do
|
11
|
+
subject == 30
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should fail if the #value is not equal" do
|
15
|
+
insist { subject == 0 }.raises(Insist::Failure)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#<=" do
|
20
|
+
it "should be OK if the #value is less than or equal" do
|
21
|
+
larger = subject.value + 1
|
22
|
+
subject <= larger
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should fail if the #value is greater" do
|
26
|
+
smaller = subject.value - 1
|
27
|
+
insist { subject <= smaller }.raises(Insist::Failure)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#>=" do
|
32
|
+
it "should be OK if the #value is greater than or equal" do
|
33
|
+
smaller = subject.value - 1
|
34
|
+
subject >= smaller
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should fail if the #value is lesser" do
|
38
|
+
larger = subject.value + 1
|
39
|
+
insist { subject >= larger }.raises(Insist::Failure)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "spec_setup"
|
2
|
+
require "insist"
|
3
|
+
|
4
|
+
describe Insist::Nil do
|
5
|
+
describe "#nil?" do
|
6
|
+
it "should be OK if the #value is nil" do
|
7
|
+
insist { nil }.nil?
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should fail if the #value is not nil" do
|
11
|
+
insist do
|
12
|
+
insist { "not nil" }.nil?
|
13
|
+
end.raises(Insist::Failure)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/insist_spec.rb
ADDED
data/spec/spec_setup.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
$: << File.join(File.dirname(File.dirname(__FILE__)), "lib")
|
data/test/all.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "minitest/spec"
|
3
|
+
require "minitest/autorun"
|
4
|
+
|
5
|
+
# Get coverage report
|
6
|
+
require "simplecov"
|
7
|
+
SimpleCov.start
|
8
|
+
|
9
|
+
# Add '../lib' to the require path.
|
10
|
+
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
11
|
+
|
12
|
+
def use(path)
|
13
|
+
puts "Loading tests from #{path}"
|
14
|
+
require File.expand_path(path)
|
15
|
+
end
|
16
|
+
|
17
|
+
dirname = File.dirname(__FILE__)
|
18
|
+
use File.join(dirname, "docs.rb")
|
19
|
+
|
20
|
+
# Load tests from ./*/**/*.rb (usually ./libraryname/....)
|
21
|
+
glob = File.join(dirname, "*", "**", "*.rb")
|
22
|
+
Dir.glob(glob).each do |path|
|
23
|
+
use path
|
24
|
+
end
|
data/test/docs.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "yard"
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "testing")
|
4
|
+
|
5
|
+
describe "documentation tests" do
|
6
|
+
before do
|
7
|
+
# Use YARD to parse all ruby files found in '../lib'
|
8
|
+
libdir = File.join(File.dirname(__FILE__), "..", "lib")
|
9
|
+
YARD::Registry.load(Dir.glob(File.join(libdir, "**", "*.rb")))
|
10
|
+
@registry = YARD::Registry.all
|
11
|
+
end
|
12
|
+
|
13
|
+
test "All classes, methods, modules, and constants must be documented" do
|
14
|
+
# Note, the 'find the undocumented things' code here is
|
15
|
+
# copied mostly from: YARD 0.7.5's lib/yard/cli/stats.rb
|
16
|
+
#
|
17
|
+
# Find all undocumented classes, modules, and constants
|
18
|
+
undocumented = @registry.select do |o|
|
19
|
+
[:class, :module, :constant].include?(o.type) && o.docstring.blank?
|
20
|
+
end
|
21
|
+
|
22
|
+
# Find all undocumented methods
|
23
|
+
methods = @registry.select { |m| m.type == :method }
|
24
|
+
methods.reject! { |m| m.is_alias? || !m.is_explicit? }
|
25
|
+
undocumented += methods.select do |m|
|
26
|
+
m.docstring.blank? && !m.overridden_method
|
27
|
+
end
|
28
|
+
|
29
|
+
if (undocumented.length > 0)
|
30
|
+
message = ["The following are not documented"]
|
31
|
+
undocumented.each do |o|
|
32
|
+
message << "* #{o.type.to_s} #{o.to_s} <#{o.file}:#{o.line}>"
|
33
|
+
end
|
34
|
+
|
35
|
+
flunk(message.join("\n"))
|
36
|
+
else
|
37
|
+
pass
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/test/testing.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "minitest/spec"
|
3
|
+
|
4
|
+
# Add '../lib' to the require path.
|
5
|
+
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
6
|
+
|
7
|
+
# I don't really like monkeypatching, but whatever, this is probably better
|
8
|
+
# than overriding the 'describe' method.
|
9
|
+
class MiniTest::Spec
|
10
|
+
class << self
|
11
|
+
# 'it' sounds wrong, call it 'test'
|
12
|
+
alias :test :it
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: insist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jordan Sissel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-08 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cabin
|
16
|
+
requirement: &13980620 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>'
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *13980620
|
25
|
+
description: insist
|
26
|
+
email:
|
27
|
+
- jls@semicomplete.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .batcave/manifest
|
33
|
+
- .gitignore
|
34
|
+
- Gemfile
|
35
|
+
- Makefile
|
36
|
+
- README
|
37
|
+
- insist.gemspec
|
38
|
+
- lib/insist.rb
|
39
|
+
- lib/insist/assert.rb
|
40
|
+
- lib/insist/comparators.rb
|
41
|
+
- lib/insist/failure.rb
|
42
|
+
- lib/insist/namespace.rb
|
43
|
+
- lib/insist/nil.rb
|
44
|
+
- lib/insist/raises.rb
|
45
|
+
- notify-failure.sh
|
46
|
+
- spec/insist/comparators_spec.rb
|
47
|
+
- spec/insist/nil_spec.rb
|
48
|
+
- spec/insist_spec.rb
|
49
|
+
- spec/spec_setup.rb
|
50
|
+
- test/all.rb
|
51
|
+
- test/docs.rb
|
52
|
+
- test/testing.rb
|
53
|
+
homepage:
|
54
|
+
licenses:
|
55
|
+
- none chosen yet
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.8.10
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: insist
|
79
|
+
test_files: []
|
80
|
+
has_rdoc:
|