diddy 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.
- data/.rvmrc +1 -0
- data/diddy.gemspec +20 -0
- data/lib/diddy/helpers.rb +16 -0
- data/lib/diddy/script.rb +144 -0
- data/lib/diddy/shared_scope.rb +18 -0
- data/lib/diddy/step.rb +37 -0
- data/lib/diddy/steps.rb +53 -0
- data/lib/diddy.rb +10 -0
- metadata +69 -0
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3-p194@diddy --create
|
data/diddy.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "diddy"
|
7
|
+
gem.version = '0.1.0'
|
8
|
+
gem.authors = ["Diederick Lawson:"]
|
9
|
+
gem.email = ["diederick@altovista.nl"]
|
10
|
+
gem.description = %q{Diddy script runner}
|
11
|
+
gem.summary = %q{}
|
12
|
+
gem.homepage = "http://github.com/wakoopa/diddy"
|
13
|
+
|
14
|
+
gem.files = `git ls-files`.split($/)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
|
19
|
+
gem.add_development_dependency "term/aniscolor"
|
20
|
+
end
|
data/lib/diddy/script.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
module Diddy
|
2
|
+
class Script
|
3
|
+
attr_accessor :steps, :scenario
|
4
|
+
|
5
|
+
#
|
6
|
+
# Creates a script
|
7
|
+
#
|
8
|
+
def initialize(scenario)
|
9
|
+
@scenario = scenario
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# Determines which step classes should be used
|
14
|
+
#
|
15
|
+
def uses(klass)
|
16
|
+
@steps_instances ||= []
|
17
|
+
@steps_instances << klass.new(shared_scope)
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Describes which step should be run
|
22
|
+
#
|
23
|
+
def step(description)
|
24
|
+
@steps ||= []
|
25
|
+
|
26
|
+
# find step klass
|
27
|
+
steps_instance = find_steps_instance_for(description)
|
28
|
+
|
29
|
+
# check if step exists
|
30
|
+
if steps_instance.class.has_step?(description)
|
31
|
+
@steps << Diddy::Step.new(
|
32
|
+
description: description,
|
33
|
+
steps_instance: steps_instance,
|
34
|
+
definition: steps_instance.class.definition(description)
|
35
|
+
)
|
36
|
+
else
|
37
|
+
raise "Step '#{description}' not defined"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Runs all the steps in the script
|
43
|
+
#
|
44
|
+
def run
|
45
|
+
begin
|
46
|
+
puts scenario
|
47
|
+
|
48
|
+
@steps.each do |step|
|
49
|
+
run_step(step)
|
50
|
+
end
|
51
|
+
rescue ScriptAborted
|
52
|
+
puts "Aborted"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Defines a script
|
58
|
+
#
|
59
|
+
# Diddy::Script.define('Test API') do
|
60
|
+
# uses ApiSteps
|
61
|
+
# uses LoginSteps
|
62
|
+
#
|
63
|
+
# step 'Do something'
|
64
|
+
# step 'Do something else'
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
def self.define(scenario, &block)
|
68
|
+
@scripts ||= []
|
69
|
+
|
70
|
+
script = self.new(scenario)
|
71
|
+
script.instance_eval(&block)
|
72
|
+
|
73
|
+
@scripts << script
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Runs all defined scripts
|
78
|
+
#
|
79
|
+
def self.run_all
|
80
|
+
@scripts.each { |script| script.run }
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# Only runs given script
|
85
|
+
#
|
86
|
+
def self.only_run(scenario)
|
87
|
+
@scripts.select { |script| script.scenario == scenario }.first.run
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
#
|
93
|
+
# Runs one step
|
94
|
+
#
|
95
|
+
def run_step(step)
|
96
|
+
# run proc on this instance as scope
|
97
|
+
begin
|
98
|
+
result = step.run
|
99
|
+
|
100
|
+
rescue Exception => exception
|
101
|
+
step.log(Diddy::Step::STATE_EXCEPTION)
|
102
|
+
print_exception(step, exception)
|
103
|
+
raise ScriptAborted.new
|
104
|
+
end
|
105
|
+
|
106
|
+
if result
|
107
|
+
step.log(Diddy::Step::STATE_OK)
|
108
|
+
else
|
109
|
+
step.log(Diddy::Step::STATE_EXCEPTION)
|
110
|
+
raise ScriptAborted.new
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
#
|
115
|
+
# Prints exception thrown by step, on screen
|
116
|
+
#
|
117
|
+
def print_exception(current_step, exception)
|
118
|
+
# print backtrace
|
119
|
+
puts "- #{exception.message}"
|
120
|
+
puts " #{exception.backtrace.join("\n ")}"
|
121
|
+
puts "\n"
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Finds the instance of the steps definition by step name
|
126
|
+
#
|
127
|
+
def find_steps_instance_for(description)
|
128
|
+
@steps_instances.each do |instance|
|
129
|
+
if instance.class.steps && instance.class.steps.has_key?(description)
|
130
|
+
return instance
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
|
137
|
+
def shared_scope
|
138
|
+
@shared_scope ||= SharedScope.new
|
139
|
+
end
|
140
|
+
|
141
|
+
class ScriptAborted < Exception; end
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Diddy
|
2
|
+
class SharedScope
|
3
|
+
def method_missing(method, *args)
|
4
|
+
if method =~ /=$/
|
5
|
+
vars[method.to_s[0..-2]] = args.first
|
6
|
+
elsif args.size == 0
|
7
|
+
vars[method.to_s]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def vars
|
14
|
+
@vars ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/diddy/step.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Diddy
|
3
|
+
class Step
|
4
|
+
STATE_OK = 1
|
5
|
+
STATE_FAILED = 2
|
6
|
+
STATE_EXCEPTION = 3
|
7
|
+
|
8
|
+
attr_accessor :description, :definition, :steps_instance
|
9
|
+
|
10
|
+
#
|
11
|
+
# Initializes step
|
12
|
+
#
|
13
|
+
def initialize(attrs)
|
14
|
+
attrs.each { |k,v| send("#{k}=", v) }
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Runs the step
|
19
|
+
#
|
20
|
+
def run
|
21
|
+
steps_instance.instance_eval(&definition)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Logs state of step to screen
|
26
|
+
#
|
27
|
+
def log(state)
|
28
|
+
if state == STATE_FAILED || state == STATE_EXCEPTION
|
29
|
+
print red(bold("✕ #{description}"))
|
30
|
+
print " [EXCEPTION]" if state == STATE_EXCEPTION
|
31
|
+
print "\n\n"
|
32
|
+
else
|
33
|
+
print green("✓ #{description}"), "\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/diddy/steps.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Diddy
|
2
|
+
class Steps
|
3
|
+
include Helpers
|
4
|
+
|
5
|
+
def initialize(shared_scope)
|
6
|
+
@shared_scope = shared_scope
|
7
|
+
end
|
8
|
+
|
9
|
+
#
|
10
|
+
# Describes a step
|
11
|
+
#
|
12
|
+
# step('Do something crazy') do
|
13
|
+
# ...
|
14
|
+
# a == true
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# Steps must return TRUE to keep the script running.
|
18
|
+
# When a step returns a FALSE, it will stop the script.
|
19
|
+
#
|
20
|
+
def self.step(description, &block)
|
21
|
+
@steps ||= {}
|
22
|
+
@steps[description] = block
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Returns the defined steps
|
27
|
+
#
|
28
|
+
def self.steps
|
29
|
+
@steps
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Checks if a step is defined
|
34
|
+
#
|
35
|
+
def self.has_step?(description)
|
36
|
+
@steps && @steps.has_key?(description)
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Returns proc for step
|
41
|
+
#
|
42
|
+
def self.definition(description)
|
43
|
+
@steps[description]
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Returns shared scope
|
48
|
+
#
|
49
|
+
def shared
|
50
|
+
@shared_scope
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/diddy.rb
ADDED
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: diddy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- ! 'Diederick Lawson:'
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: term/aniscolor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Diddy script runner
|
31
|
+
email:
|
32
|
+
- diederick@altovista.nl
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .rvmrc
|
38
|
+
- diddy.gemspec
|
39
|
+
- lib/diddy.rb
|
40
|
+
- lib/diddy/helpers.rb
|
41
|
+
- lib/diddy/script.rb
|
42
|
+
- lib/diddy/shared_scope.rb
|
43
|
+
- lib/diddy/step.rb
|
44
|
+
- lib/diddy/steps.rb
|
45
|
+
homepage: http://github.com/wakoopa/diddy
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.8.24
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: ''
|
69
|
+
test_files: []
|