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 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: []