diddy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,16 @@
1
+ module Diddy
2
+ module Helpers
3
+ def try(max_times, delay = 1, &block)
4
+ index = 0
5
+ result = false
6
+
7
+ while !result && index < max_times do
8
+ result = yield
9
+ sleep(delay) unless result
10
+ index += 1
11
+ end
12
+
13
+ result
14
+ end
15
+ end
16
+ end
@@ -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
@@ -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
@@ -0,0 +1,10 @@
1
+ include Term::ANSIColor
2
+
3
+ module Diddy
4
+ end
5
+
6
+ require 'diddy/helpers'
7
+ require 'diddy/script'
8
+ require 'diddy/step'
9
+ require 'diddy/steps'
10
+ require 'diddy/shared_scope'
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: []