seam 1.1.3 → 2.0.0a1

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,197 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seam
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 2.0.0a1
5
5
  platform: ruby
6
6
  authors:
7
- - Darren Cauthon
7
+ - Seam Labs, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-12 00:00:00.000000000 Z
11
+ date: 2024-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '>='
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: i18n
14
+ name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - '>='
17
+ - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
19
+ version: '2.0'
20
+ type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - '>='
24
+ - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0'
26
+ version: '2.0'
41
27
  - !ruby/object:Gem::Dependency
42
- name: json
28
+ name: gem-release
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - '>='
31
+ - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
33
+ version: '2.2'
34
+ type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - '>='
38
+ - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '0'
40
+ version: '2.2'
55
41
  - !ruby/object:Gem::Dependency
56
- name: bundler
42
+ name: parse_gemspec-cli
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - ~>
45
+ - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '1.3'
47
+ version: '1.0'
62
48
  type: :development
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - ~>
52
+ - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '1.3'
54
+ version: '1.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - '>='
59
+ - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '0'
61
+ version: '13.0'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - '>='
66
+ - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '0'
68
+ version: '13.0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: subtle
70
+ name: rspec
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - '>='
73
+ - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: '0'
75
+ version: '3.0'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
- - - '>='
80
+ - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '0'
82
+ version: '3.0'
97
83
  - !ruby/object:Gem::Dependency
98
- name: mocha
84
+ name: simplecov
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - '>='
87
+ - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '0'
89
+ version: '0.21'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - '>='
94
+ - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '0'
96
+ version: '0.21'
111
97
  - !ruby/object:Gem::Dependency
112
- name: contrast
98
+ name: simplecov-console
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - '>='
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '0.9'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - '>='
108
+ - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '0'
110
+ version: '0.9'
125
111
  - !ruby/object:Gem::Dependency
126
- name: timecop
112
+ name: standard
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - '>='
115
+ - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: '0'
117
+ version: '1.3'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
- - - '>='
122
+ - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: '0'
139
- description: Simple workflows
140
- email:
141
- - darren@cauthon.com
124
+ version: '1.3'
125
+ description: SDK for the Seam API written in Ruby.
126
+ email: engineering@getseam.com
142
127
  executables: []
143
128
  extensions: []
144
129
  extra_rdoc_files: []
145
130
  files:
146
- - .gitignore
147
131
  - Gemfile
132
+ - Gemfile.lock
148
133
  - LICENSE.txt
149
134
  - README.md
150
135
  - Rakefile
151
136
  - lib/seam.rb
152
- - lib/seam/effort.rb
153
- - lib/seam/flow.rb
154
- - lib/seam/in_memory.rb
155
- - lib/seam/persistence.rb
156
- - lib/seam/step.rb
137
+ - lib/seam/todo.rb
157
138
  - lib/seam/version.rb
158
- - lib/seam/wait_worker.rb
159
- - lib/seam/worker.rb
160
- - seam.gemspec
161
- - spec/seam/effort_spec.rb
162
- - spec/seam/flow_spec.rb
163
- - spec/seam/step_spec.rb
164
- - spec/seam/wait_worker_spec.rb
165
- - spec/seam/worker_spec.rb
166
- - spec/spec_helper.rb
167
- homepage: ''
139
+ homepage: https://github.com/seamapi/ruby-next
168
140
  licenses:
169
141
  - MIT
170
- metadata: {}
142
+ metadata:
143
+ homepage_uri: https://github.com/seamapi/ruby-next
144
+ source_code_uri: https://github.com/seamapi/ruby-next
145
+ bug_tracker_uri: https://github.com/seamapi/ruby-next/issues
146
+ changelog_uri: https://github.com/seamapi/ruby-next/blob/main/CHANGELOG.md
147
+ github_repo: git@github.com:seamapi/ruby-next.git
171
148
  post_install_message:
172
149
  rdoc_options: []
173
150
  require_paths:
174
151
  - lib
175
152
  required_ruby_version: !ruby/object:Gem::Requirement
176
153
  requirements:
177
- - - '>='
154
+ - - ">="
178
155
  - !ruby/object:Gem::Version
179
- version: '0'
156
+ version: 3.1.0
180
157
  required_rubygems_version: !ruby/object:Gem::Requirement
181
158
  requirements:
182
- - - '>='
159
+ - - ">="
183
160
  - !ruby/object:Gem::Version
184
161
  version: '0'
185
162
  requirements: []
186
- rubyforge_project:
187
- rubygems_version: 2.2.2
163
+ rubygems_version: 3.5.3
188
164
  signing_key:
189
165
  specification_version: 4
190
- summary: Simple workflows
191
- test_files:
192
- - spec/seam/effort_spec.rb
193
- - spec/seam/flow_spec.rb
194
- - spec/seam/step_spec.rb
195
- - spec/seam/wait_worker_spec.rb
196
- - spec/seam/worker_spec.rb
197
- - spec/spec_helper.rb
166
+ summary: Seam Ruby SDK
167
+ test_files: []
data/.gitignore DELETED
@@ -1,18 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- .DS_Store
data/lib/seam/effort.rb DELETED
@@ -1,86 +0,0 @@
1
- module Seam
2
- class Effort
3
- attr_accessor :completed_steps
4
- attr_accessor :created_at
5
- attr_accessor :complete
6
- attr_accessor :completed_at
7
- attr_accessor :id
8
- attr_accessor :next_execute_at
9
- attr_accessor :next_step
10
- attr_accessor :flow
11
- attr_accessor :data
12
- attr_accessor :history
13
-
14
- class << self
15
-
16
- def find effort_id
17
- Seam::Persistence.find_by_effort_id effort_id
18
- end
19
-
20
- def find_all_by_step step
21
- Seam::Persistence.find_all_pending_executions_by_step step
22
- end
23
-
24
- def parse document
25
- Effort.new( {
26
- id: document['id'],
27
- created_at: Time.parse(document['created_at'].to_s),
28
- next_execute_at: document['next_execute_at'],
29
- next_step: document['next_step'],
30
- flow: HashWithIndifferentAccess.new(document['flow']),
31
- data: HashWithIndifferentAccess.new(document['data']),
32
- history: document['history'].map { |x| HashWithIndifferentAccess.new x },
33
- completed_steps: document['completed_steps'],
34
- complete: document['complete'],
35
- completed_at: document['completed_at']
36
- } )
37
- end
38
-
39
- end
40
-
41
- def initialize(args = {})
42
- @completed_steps = []
43
- @history = []
44
- @complete = false
45
- args.each { |k, v| self.send "#{k}=".to_sym, v }
46
- end
47
-
48
- def self.create args
49
- effort = Seam::Effort.new args
50
- effort.save
51
- effort
52
- end
53
-
54
- def save
55
- existing_record = Seam::Effort.find self.id
56
- if existing_record
57
- Seam::Persistence.save self
58
- else
59
- Seam::Persistence.create self
60
- end
61
- end
62
-
63
- def complete?
64
- complete
65
- end
66
-
67
- def to_hash
68
- {
69
- id: self.id,
70
- created_at: self.created_at,
71
- completed_steps: self.completed_steps,
72
- completed_at: self.completed_at,
73
- next_execute_at: self.next_execute_at,
74
- next_step: self.next_step,
75
- flow: self.flow,
76
- data: self.data,
77
- history: self.history,
78
- complete: self.complete,
79
- }
80
- end
81
-
82
- def clone
83
- Seam::Effort.parse HashWithIndifferentAccess.new(self.to_hash)
84
- end
85
- end
86
- end
data/lib/seam/flow.rb DELETED
@@ -1,53 +0,0 @@
1
- module Seam
2
- class Flow
3
-
4
- attr_accessor :stamp_data_history
5
-
6
- def initialize
7
- @steps = []
8
- @stamp_data_history = false
9
- end
10
-
11
- def method_missing(meth, *args, &blk)
12
- meth = meth.to_s
13
- @steps << { name: meth, arguments: args }
14
- true
15
- end
16
-
17
- def start(data = {})
18
- Seam::Effort.create( {
19
- id: SecureRandom.uuid.to_s,
20
- created_at: Time.parse(Time.now.to_s),
21
- next_execute_at: Time.parse(Time.now.to_s),
22
- next_step: self.steps.first.name.to_s,
23
- flow: the_flow_from,
24
- data: ActiveSupport::HashWithIndifferentAccess.new(data)
25
- } )
26
- end
27
-
28
- def the_flow_from
29
- hash = self.to_hash
30
- flow = ActiveSupport::HashWithIndifferentAccess.new hash
31
- flow['steps'].each do |step|
32
- step['id'] = SecureRandom.uuid.to_s
33
- end
34
- flow
35
- end
36
-
37
- def to_hash
38
- {
39
- steps: self.steps.map { |x| x.to_hash },
40
- stamp_data_history: @stamp_data_history
41
- }
42
- end
43
-
44
- def steps
45
- @steps.each.map do |step|
46
- Seam::Step.new( { name: step[:name],
47
- type: 'do',
48
- arguments: step[:arguments] } )
49
-
50
- end
51
- end
52
- end
53
- end
@@ -1,13 +0,0 @@
1
- module Seam
2
- module InMemory
3
- class << self
4
- def records
5
- @records ||= []
6
- end
7
-
8
- def records=(records)
9
- @records = records
10
- end
11
- end
12
- end
13
- end
@@ -1,43 +0,0 @@
1
- module Seam
2
- module Persistence
3
- def self.find_by_effort_id effort_id
4
- effort = Seam::InMemory.records.select { |x| x.id == effort_id }.first
5
- return nil unless effort
6
- effort.clone
7
- end
8
-
9
- def self.find_all_pending_executions_by_step step
10
- Seam::InMemory.records
11
- .select { |x| x.next_step == step && x.next_execute_at <= Time.now }
12
- .map { |x| x.clone }
13
- end
14
-
15
- def self.find_something_to_do
16
- Seam::InMemory.records
17
- .select { |x| x.complete.nil? || x.complete == false }
18
- .select { |x| x.next_execute_at <= Time.now }
19
- .select { |x| x.next_step != nil }
20
- .map { |x| x.clone }
21
- end
22
-
23
- def self.save effort
24
- old_record = find_by_effort_id effort.id
25
- if old_record
26
- Seam::InMemory.records = Seam::InMemory.records.select { |x| x.id != effort.id }.to_a
27
- end
28
- create effort
29
- end
30
-
31
- def self.create effort
32
- Seam::InMemory.records = [Seam::InMemory.records, effort].flatten
33
- end
34
-
35
- def self.all
36
- Seam::InMemory.records.to_a
37
- end
38
-
39
- def self.destroy
40
- Seam::InMemory.records = []
41
- end
42
- end
43
- end
data/lib/seam/step.rb DELETED
@@ -1,33 +0,0 @@
1
- module Seam
2
- class Step
3
- attr_accessor :id
4
- attr_accessor :name
5
- attr_accessor :type
6
- attr_accessor :arguments
7
-
8
- def initialize(args = {})
9
- args.each { |k, v| self.send "#{k}=".to_sym, v }
10
- end
11
-
12
- def to_hash
13
- {
14
- id: id,
15
- name: name,
16
- type: type,
17
- arguments: get_arguments
18
- }
19
- end
20
-
21
- private
22
-
23
- def get_arguments
24
- arguments.map do |x|
25
- if x.is_a? Hash
26
- HashWithIndifferentAccess.new(x)
27
- else
28
- x
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,30 +0,0 @@
1
- module Seam
2
-
3
- class WaitWorker < ::Seam::Worker
4
-
5
- def initialize
6
- handles :wait
7
- end
8
-
9
- def process
10
- move_to_next_step( { on: the_time_to_move_on } )
11
- end
12
-
13
- private
14
-
15
- def the_time_to_move_on
16
- time_of_last_execution + the_amount_of_time_to_wait
17
- end
18
-
19
- def the_amount_of_time_to_wait
20
- current_step[:arguments][0]
21
- end
22
-
23
- def time_of_last_execution
24
- return effort.created_at if effort.history.count == 0
25
- effort.history.last[:stopped_at]
26
- end
27
-
28
- end
29
-
30
- end
data/lib/seam/worker.rb DELETED
@@ -1,166 +0,0 @@
1
- module Seam
2
-
3
- class Worker
4
-
5
- def handles step
6
- @step = step
7
- end
8
-
9
- def execute effort
10
- set_current_effort effort
11
- before_process
12
- process
13
- after_process
14
- end
15
-
16
- def self.inherited handler
17
- @handlers ||= []
18
- @handlers << handler
19
- end
20
-
21
- def self.handler_for step
22
- @handlers.each do |handler|
23
- instance = handler.new
24
- return instance if instance.step == step
25
- end
26
- nil
27
- end
28
-
29
- def self.all
30
- (@handlers || []).map { |x| x.new }
31
- end
32
-
33
- def execute_all
34
- efforts_to_execute.each { |e| execute e }
35
- end
36
-
37
- def eject
38
- @operation_to_execute = :eject
39
- end
40
-
41
- def move_to_next_step(options = {})
42
- @operation_to_execute = :move_to_next_step
43
- operation_args[:next_execute_at] = (options[:on] || Time.now)
44
- end
45
-
46
- def try_again_in seconds
47
- @operation_to_execute = :try_again_in
48
- operation_args[:seconds] = seconds
49
- end
50
-
51
- def try_again_on time
52
- @operation_to_execute = :try_again_on
53
- operation_args[:time] = time
54
- end
55
-
56
- attr_accessor :operation_args
57
- def operation_args
58
- @operation_args ||= {}
59
- end
60
-
61
- def operations
62
- {
63
- try_again_in: -> do
64
- seconds = operation_args[:seconds]
65
- try_again_on = Time.now + seconds
66
-
67
- history[:try_again_on] = try_again_on
68
-
69
- effort.next_execute_at = try_again_on
70
- end,
71
- try_again_on: -> do
72
- history[:try_again_on] = operation_args[:time]
73
- effort.next_execute_at = operation_args[:time]
74
- end,
75
- move_to_next_step: -> do
76
- effort.next_execute_at = operation_args[:next_execute_at] if operation_args[:next_execute_at]
77
-
78
- effort.completed_steps << effort.next_step
79
-
80
- steps = effort.flow['steps'].map { |x| x['name'] }
81
- next_step = steps[effort.completed_steps.count]
82
-
83
- effort.next_step = next_step
84
- mark_effort_as_complete if next_step.nil?
85
-
86
- end,
87
- eject: -> { mark_effort_as_complete }
88
- }
89
- end
90
-
91
- def effort
92
- @current_effort
93
- end
94
-
95
- def history
96
- @current_run
97
- end
98
-
99
- def step
100
- s = @step || self.class.name.underscore.gsub('_worker', '').split('/')[-1]
101
- s.to_s
102
- end
103
-
104
- def current_step
105
- effort.flow["steps"][effort.completed_steps.count]
106
- end
107
-
108
- private
109
-
110
- def mark_effort_as_complete
111
- effort.next_step = nil
112
- effort.complete = true
113
- effort.completed_at = Time.now
114
- end
115
-
116
- def set_current_effort effort
117
- @current_effort = effort
118
- end
119
-
120
- def before_process
121
- run = {
122
- started_at: Time.now,
123
- step: step,
124
- step_id: current_step['id'],
125
- data_before: stamping_the_history? ? effort.data.clone : nil
126
- }
127
- @current_run = HashWithIndifferentAccess.new run
128
- end
129
-
130
- def after_process
131
- execute_the_appropriate_operation
132
- stamp_the_new_history_record
133
- save_the_effort
134
- end
135
-
136
- def efforts_to_execute
137
- Seam::Effort.find_all_by_step step
138
- end
139
-
140
- def execute_the_appropriate_operation
141
- @operation_to_execute ||= :move_to_next_step
142
- operations[@operation_to_execute].call
143
- end
144
-
145
- def stamp_the_new_history_record
146
- history[:result] = @operation_to_execute
147
- history[:stopped_at] = Time.now
148
-
149
- if stamping_the_history?
150
- history[:data_after] = effort.data.clone
151
- end
152
-
153
- effort.history << history
154
- end
155
-
156
- def stamping_the_history?
157
- effort.flow['stamp_data_history']
158
- end
159
-
160
- def save_the_effort
161
- effort.save
162
- end
163
-
164
- end
165
-
166
- end