urist 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/lib/urist.rb +37 -0
- data/lib/urist/base.rb +24 -0
- data/lib/urist/runner.rb +62 -0
- data/lib/urist/scenario.rb +22 -0
- data/lib/urist/uber_waffel.rb +30 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1b8370d9d15bd2a284febc8530d2d7cba7c7f69e
|
4
|
+
data.tar.gz: f97e9d3dd1264f92c978fc45ca05678e5aa7194d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6f58af7ef728c2c8e9a456ca84ca3fdf963b68117938ce726859f0e12ca61194ce5ba30cc7af3adfb424193fb63f13078021a413a7a7d000654b62632b0dc044
|
7
|
+
data.tar.gz: 7df39f3102906aa1574d4787e0402688c357274286629559b5e63609f3b7c6a4e186bc95d19fefe8c578dee81545c2300849d6624de19ae9167748ce159a576f
|
data/lib/urist.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'urist/base'
|
2
|
+
require 'urist/uber_waffel'
|
3
|
+
require 'urist/runner'
|
4
|
+
require 'urist/scenario'
|
5
|
+
|
6
|
+
# == How to use: ==
|
7
|
+
#
|
8
|
+
# A. Fetch all the data you need:
|
9
|
+
# client = Client.needed_now # instance of some class
|
10
|
+
# price = 10000.65 # numbers
|
11
|
+
# products = client.products # arrays
|
12
|
+
#
|
13
|
+
# B. Assemble them into hash:
|
14
|
+
# information = {:client => client, :price => price, :products => products}
|
15
|
+
#
|
16
|
+
# C. Create new runner and, well, run it:
|
17
|
+
# runner = Urist.new(:startup_scenario => NewAndLongScenario, :information => information)
|
18
|
+
# result = runner.go!
|
19
|
+
#
|
20
|
+
# D. Extract the decision and other parameters from result:
|
21
|
+
# decision = result[:decision]
|
22
|
+
# description = result[:description]
|
23
|
+
# limit = result[:limit]
|
24
|
+
#
|
25
|
+
# E. Capture all execution logs
|
26
|
+
# log = runner.logs # array with all results
|
27
|
+
#
|
28
|
+
# F. Summarize all executed scenarios
|
29
|
+
# scenarios = runner.scenarios # array with all executed scenarios
|
30
|
+
#
|
31
|
+
# G. You're done!
|
32
|
+
|
33
|
+
module Urist
|
34
|
+
def self.new options={}
|
35
|
+
Base.new options
|
36
|
+
end
|
37
|
+
end
|
data/lib/urist/base.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Urist
|
2
|
+
class Base
|
3
|
+
attr_accessor :runner
|
4
|
+
|
5
|
+
def initialize options={}
|
6
|
+
@runner = Runner.new options
|
7
|
+
end
|
8
|
+
|
9
|
+
# starts script execution
|
10
|
+
def go!
|
11
|
+
@runner.go!
|
12
|
+
end
|
13
|
+
|
14
|
+
# returns all performed scenarios
|
15
|
+
def scenarios
|
16
|
+
@runner.done_scenarios
|
17
|
+
end
|
18
|
+
|
19
|
+
# returns all results from all performed scenarios
|
20
|
+
def logs
|
21
|
+
@runner.log
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/urist/runner.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Urist
|
2
|
+
class Runner
|
3
|
+
attr_accessor :information, :result, :log
|
4
|
+
attr_accessor :active_scenario, :done_scenarios
|
5
|
+
|
6
|
+
def initialize options={}
|
7
|
+
@information = options[:information] || {}
|
8
|
+
@active_scenario = options[:startup_scenario]
|
9
|
+
@done_scenarios = []
|
10
|
+
@log = []
|
11
|
+
|
12
|
+
validate!
|
13
|
+
end
|
14
|
+
|
15
|
+
def go!
|
16
|
+
run_active_scenario while @active_scenario
|
17
|
+
|
18
|
+
return @result
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def run_active_scenario
|
23
|
+
check_for_duplicate_scenario!
|
24
|
+
execute_active_scenario!
|
25
|
+
validate_result!
|
26
|
+
log_result!
|
27
|
+
assign_next_scenario!
|
28
|
+
end
|
29
|
+
|
30
|
+
def assign_next_scenario!
|
31
|
+
decision = @result[:decision]
|
32
|
+
@active_scenario = @active_scenario.links[decision]
|
33
|
+
end
|
34
|
+
|
35
|
+
def log_result!
|
36
|
+
@log << @result
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_result!
|
40
|
+
raise ArgumentError, "Incorrect 'result' in #{@active_scenario.inspect}. Result must be returned as Hash." unless @result.is_a? Hash
|
41
|
+
raise ArgumentError, "Incorrect 'result' in #{@active_scenario.inspect}. Result must include ':decision' key." unless @result.has_key? :decision
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute_active_scenario!
|
45
|
+
@result = @active_scenario.new(:information => @information).logic
|
46
|
+
end
|
47
|
+
|
48
|
+
# raise an exception if detected that scripts start looping
|
49
|
+
def check_for_duplicate_scenario!
|
50
|
+
if @done_scenarios.include? @active_scenario
|
51
|
+
raise RuntimeError, "Current scenario has already been passed. Current #{@active_scenario.inspect}. Previous #{@done_scenarios.last}"
|
52
|
+
else
|
53
|
+
@done_scenarios << @active_scenario
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate!
|
58
|
+
raise ArgumentError, ":information should be assigned. #{@information.inspect} given." if @information.nil?
|
59
|
+
raise ArgumentError, ":startup_scenario should be assigned. #{@active_scenario.inspect} given." if @active_scenario.nil?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Urist
|
2
|
+
class Scenario
|
3
|
+
attr_accessor :information
|
4
|
+
|
5
|
+
# more candies and sugar for scenarios
|
6
|
+
include UberWaffel
|
7
|
+
inheritable_attributes :links
|
8
|
+
@links = {}
|
9
|
+
|
10
|
+
def initialize options={}
|
11
|
+
@information = options[:information]
|
12
|
+
|
13
|
+
validate!
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def validate!
|
18
|
+
raise ArgumentError, ":information should be assigned to #{self.class}. #{@information.inspect} given." if @information.nil?
|
19
|
+
raise ArgumentError, "@links should be a Hash in #{self.class}. #{self.class.links.inspect} given." unless self.class.links.is_a? Hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Urist
|
2
|
+
module UberWaffel
|
3
|
+
# adds some metaprogramming magic:
|
4
|
+
# - removes the need for :attr_accessor for @links in every scenario
|
5
|
+
# since it's an inheritable attribute (with default value already set)
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def inheritable_attributes(*args)
|
12
|
+
@inheritable_attributes ||= [:inheritable_attributes]
|
13
|
+
@inheritable_attributes += args
|
14
|
+
args.each do |arg|
|
15
|
+
class_eval %(
|
16
|
+
class << self; attr_accessor :#{arg} end
|
17
|
+
)
|
18
|
+
end
|
19
|
+
@inheritable_attributes
|
20
|
+
end
|
21
|
+
|
22
|
+
def inherited(subclass)
|
23
|
+
@inheritable_attributes.each do |inheritable_attribute|
|
24
|
+
instance_var = "@#{inheritable_attribute}"
|
25
|
+
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: urist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Artem Kornienko
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Library for creating of scenarios of business logic
|
14
|
+
email: send.this.to.moff@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/urist.rb
|
20
|
+
- lib/urist/base.rb
|
21
|
+
- lib/urist/runner.rb
|
22
|
+
- lib/urist/scenario.rb
|
23
|
+
- lib/urist/uber_waffel.rb
|
24
|
+
homepage:
|
25
|
+
licenses:
|
26
|
+
- MIT
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.0.6
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: Scenario logic library
|
48
|
+
test_files: []
|