bas 1.6.2 → 1.7.1
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +11 -14
- data/README.md +159 -14
- data/lib/bas/orchestrator/manager.rb +94 -0
- data/lib/bas/orchestrator.rb +18 -0
- data/lib/bas/utils/digital_ocean/request.rb +9 -2
- data/lib/bas/utils/github/octokit_client.rb +6 -0
- data/lib/bas/version.rb +1 -1
- metadata +10 -136
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63490ab5165fd3aa1793a7521272869addb0ebd691d65e7e300b757af770b6fe
|
4
|
+
data.tar.gz: 834e5ff6ebe43795ddfd94fa19f7d3435cd6ae99fc24902abdec2a8c3215ce3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97a51249e553a947453084004b2c4701f801bd43a9b14c439721fe1f3e2262813ac541ce0326262997757368eddfc46e08390938f116eef3eb75ecdb80d5e41d
|
7
|
+
data.tar.gz: 2d0d10c08ae2c5a1810e88c624e42d11dbf16ecacc45184185f0ff55caf27a0819b37baeb645991d3eac1ace9595dd1fedba1c4c7939460d824acfaa0fcc1d86
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
# 1.7.1 (11.02.2025)
|
4
|
+
- [Fix absolute_path in order to execute the scripts](https://github.com/kommitters/bas/pull/133)
|
5
|
+
|
6
|
+
# 1.7.0 (10.02.2025)
|
7
|
+
- [Add orchestrator logic into the gem](https://github.com/kommitters/bas/issues/130)
|
8
|
+
- [Improve and update test suite](https://github.com/kommitters/bas/issues/129)
|
9
|
+
- [Cleanup gem dependencies](https://github.com/kommitters/bas/pull/126)
|
10
|
+
- [Update bas in terms of business automation suite](http://github.com/kommitters/bas/pull/125)
|
11
|
+
|
3
12
|
# 1.6.2 (12.12.2024)
|
4
13
|
- [Bots with default shared storage reader are not saving data](https://github.com/kommitters/bas/issues/122)
|
5
14
|
|
data/Gemfile
CHANGED
@@ -5,16 +5,8 @@ source "https://rubygems.org"
|
|
5
5
|
# Specify your gem's dependencies in bas.gemspec
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
gem "jwt", "~> 2.8.1"
|
9
|
-
|
10
8
|
gem "rake", "~> 13.0"
|
11
9
|
|
12
|
-
gem "net-imap", "~> 0.4.10"
|
13
|
-
gem "net-smtp", "~> 0.4.0.1"
|
14
|
-
|
15
|
-
gem "octokit", "~> 8.1.0"
|
16
|
-
gem "openssl", "~> 3.2"
|
17
|
-
|
18
10
|
gem "rspec", "~> 3.0"
|
19
11
|
gem "rubocop", "~> 1.21"
|
20
12
|
gem "simplecov", require: false, group: :test
|
@@ -27,9 +19,14 @@ gem "httparty"
|
|
27
19
|
|
28
20
|
gem "pg", "~> 1.5", ">= 1.5.4"
|
29
21
|
|
30
|
-
|
31
|
-
|
32
|
-
gem "
|
33
|
-
gem "
|
34
|
-
|
35
|
-
gem "md_to_notion", "~> 0.1.4"
|
22
|
+
group :test do
|
23
|
+
gem "faraday-retry"
|
24
|
+
gem "gmail_xoauth", "~> 0.4.1"
|
25
|
+
gem "google-api-client", "~> 0.53"
|
26
|
+
gem "jwt", "~> 2.8.1"
|
27
|
+
gem "md_to_notion", "~> 0.1.4"
|
28
|
+
gem "net-imap", "~> 0.4.10"
|
29
|
+
gem "net-smtp", "~> 0.4.0.1"
|
30
|
+
gem "octokit", "~> 8.1.0"
|
31
|
+
gem "openssl", "~> 3.2"
|
32
|
+
end
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# BAS - Business Automation
|
1
|
+
# BAS - Business Automation Suite
|
2
2
|
|
3
3
|
Many organizations and individuals rely on automation across various contexts in their daily operations. With BAS, we aim to provide an open-source platform that empowers users to create customized automation systems tailored to their unique requirements. BAS consists of a series of abstract components designed to facilitate the creation of diverse bots, regardless of context.
|
4
4
|
|
@@ -31,32 +31,46 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
31
31
|
### BOT
|
32
32
|
A bot is a tool responsible for executing a specific automation task. The bot's pipeline consists of reading from a shared storage (if required), processing a particular task, and then writing the result to a shared storage.
|
33
33
|
|
34
|
-
### Shared Storage
|
35
|
-
Shared storage is a central location where data can be read and written by multiple bots to facilitate coordination in an automation task. It serves as a common data exchange point, allowing each bot to access information generated by others as needed to complete its specific task. Examples of shared storage include a PostgreSQL database, an S3 bucket, or other types of storage systems that support concurrent access and data persistence.
|
36
|
-
|
37
34
|
### Use case
|
38
35
|
A use case refers to an automation problem larger than what a single bot can manage. It typically involves a set of bots, each solving a specific part of the overall problem independently. To enable these bots to interact, shared storage is used. This shared storage could be a PostgreSQL database, an S3 bucket, or another shared storage type, allowing bots to read and write data that other bots can access to complete their tasks.
|
39
36
|
|
40
|
-
##
|
41
|
-
|
42
|
-
The gem provides essential interfaces, types, and methods to help you easily create your own bot. For instance, two base classes are provided: one for handling shared storage read-write operations and another for defining the bot’s specific task logic.
|
37
|
+
## Shared Storage
|
38
|
+
Shared storage is a central location where data can be read and written by multiple bots to facilitate coordination in an automation task. It serves as a common data exchange point, allowing each bot to access information generated by others as needed to complete its specific task. Examples of shared storage include a PostgreSQL database, an S3 bucket, or other types of storage systems that support concurrent access and data persistence.
|
43
39
|
|
44
|
-
###
|
40
|
+
### Read and Write data
|
45
41
|
|
46
42
|
The `SharedStorage` class abstracts the process of reading from and writing to shared storage. This class specification is available in `bas/shared_storage/base.rb`, from which custom implementations can be built.
|
47
43
|
|
48
44
|
Currently, the gem supports: `PostgreSQL`.
|
49
45
|
|
50
|
-
###
|
51
|
-
The bot executes the logic required to complete a specific task. For this, an instance of shared storage (for reading and for writing) must be provided to the bot.
|
46
|
+
### Configurations
|
52
47
|
|
53
|
-
|
48
|
+
This configuration provides an example of the structure a PostgreSQL shared storage would require for this purpose. The exact structure should be tailored to the nature of the implemented use cases.
|
54
49
|
|
55
|
-
|
50
|
+
### Optional Dependencies
|
51
|
+
|
52
|
+
BAS supports integrations with various external services like GitHub, Notion, OpenAI, and more. To use these integrations, you need to install the required gems manually.
|
53
|
+
|
54
|
+
**Installing Optional Dependencies**
|
55
|
+
|
56
|
+
The following gems are needed to use the following optional dependencies, add to your Gemfile or install them individually:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
- GitHub Integration: gem 'octokit', '~> 8.1.0'
|
60
|
+
gem 'jwt", "~> 2.8.1'
|
61
|
+
gem 'openssl', '~> 3.2'
|
62
|
+
|
63
|
+
- Notion Integration: gem 'md_to_notion', '~> 0.1.4'
|
56
64
|
|
57
|
-
|
65
|
+
- Google Integration: gem 'google-api-client', '~> 0.53'
|
66
|
+
gem 'googleauth', '~> 1.11'
|
67
|
+
|
68
|
+
- IMAP/SMTP Email: gem 'net-imap', '~> 0.4.10'
|
69
|
+
gem 'net-smtp', '~> 0.4.0.1'
|
70
|
+
|
71
|
+
- Gmail OAuth: gem 'gmail_xoauth', '~> 0.4.1'
|
72
|
+
```
|
58
73
|
|
59
|
-
The current implementation of the PostgreSQL shared storage expect a table with the following structure:
|
60
74
|
|
61
75
|
```sql
|
62
76
|
CREATE TABLE api_data(
|
@@ -74,6 +88,137 @@ CREATE TABLE api_data(
|
|
74
88
|
);
|
75
89
|
```
|
76
90
|
|
91
|
+
## Orchestrator: Manager for Scheduling and Running Scripts ##
|
92
|
+
|
93
|
+
This module manages the execution of scheduled bots based on time intervals, specific times, or days. It uses a **ThreadPool** to run the scripts concurrently, ensuring efficient execution.
|
94
|
+
|
95
|
+
### Adding Schedules to Your Repository
|
96
|
+
|
97
|
+
To use the Orchestrator for scheduling and executing your bots, you need to define a `schedules` array in your repository. This array should include the paths to your scripts and the schedules for execution.
|
98
|
+
|
99
|
+
### Example of the `schedules` defintion
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
BIRTHDAY_SCHEDULES = [
|
103
|
+
# Execute every 1000ms (1 second)
|
104
|
+
{ path: '/birthday/fetch_birthday_from_notion.rb', interval: 1000 },
|
105
|
+
{ path: '/birthday/format_birthday.rb', interval: 1000 },
|
106
|
+
{ path: '/birthday/notify_birthday_in_discord.rb', interval: 1000 },
|
107
|
+
{ path: '/birthday/garbage_collector.rb', interval: 1000 },
|
108
|
+
].freeze
|
109
|
+
|
110
|
+
# With days and hours
|
111
|
+
# Execute at 08:00 AM on Mondays
|
112
|
+
{ path: '/birthday/notify_birthday_in_email.rb', day: ['Monday'], time: ['08:00'] }
|
113
|
+
|
114
|
+
```
|
115
|
+
|
116
|
+
### How to Use the Orchestrator
|
117
|
+
|
118
|
+
Once you've defined your schedules, you can initialize and run the Orchestrator to begin executing your scripts based on their schedules.
|
119
|
+
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
|
123
|
+
# Initialize the orchestrator with the defined schedules
|
124
|
+
manager = Bas::Orchestrator::Manager.new(BIRTHDAY_SCHEDULES)
|
125
|
+
|
126
|
+
# Run the orchestrator
|
127
|
+
manager.run
|
128
|
+
|
129
|
+
```
|
130
|
+
### Folder structure example:
|
131
|
+
|
132
|
+
```bash
|
133
|
+
src/use_cases_execution/
|
134
|
+
├── birthday/
|
135
|
+
│ ├── fetch_birthday_from_notion.rb
|
136
|
+
│ ├── format_birthday.rb
|
137
|
+
│ ├── notify_birthday_in_discord.rb
|
138
|
+
│ └── garbage_collector.rb
|
139
|
+
└── schedules.rb
|
140
|
+
```
|
141
|
+
|
142
|
+
### Implementation examples
|
143
|
+
|
144
|
+
#### Example 1: Using the Same Shared Storage for Reading and Writing
|
145
|
+
|
146
|
+
In some cases, a bot may need to both read from and write to the same shared storage. Here is an example implementation using a PostgreSQL database as shared storage:
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
connection = {
|
150
|
+
host: "localhost",
|
151
|
+
port: 5432,
|
152
|
+
dbname: "bas",
|
153
|
+
user: "postgres",
|
154
|
+
password: "postgres"
|
155
|
+
}
|
156
|
+
|
157
|
+
read_options = {
|
158
|
+
connection: connection,
|
159
|
+
db_table: "api_data",
|
160
|
+
tag: "AnotherBot"
|
161
|
+
}
|
162
|
+
|
163
|
+
write_options = {
|
164
|
+
connection: connection,
|
165
|
+
db_table: "api_data",
|
166
|
+
tag: "FetchFromAPi"
|
167
|
+
}
|
168
|
+
|
169
|
+
options = {
|
170
|
+
token: "api_token"
|
171
|
+
}
|
172
|
+
|
173
|
+
shared_storage = SharedStorage.new(read_options: read_options, write_options: write_options)
|
174
|
+
|
175
|
+
bot = Bas::Bot::FetchFromAPi.new(options, shared_storage)
|
176
|
+
bot.execute
|
177
|
+
```
|
178
|
+
|
179
|
+
#### Example 2: Using Different Shared Storage Instances for Reading and Writing
|
180
|
+
|
181
|
+
In some situations, it may be beneficial to use separate shared storage instances for reading and writing. For example, a bot might read from a default shared storage implementation and write to a PostgreSQL database:
|
182
|
+
|
183
|
+
```ruby
|
184
|
+
connection = {
|
185
|
+
host: "localhost",
|
186
|
+
port: 5432,
|
187
|
+
dbname: "bas",
|
188
|
+
user: "postgres",
|
189
|
+
password: "postgres"
|
190
|
+
}
|
191
|
+
|
192
|
+
write_options = {
|
193
|
+
connection: connection,
|
194
|
+
db_table: "api_data",
|
195
|
+
tag: "FetchFromAPi"
|
196
|
+
}
|
197
|
+
|
198
|
+
options = {
|
199
|
+
token: "api_token"
|
200
|
+
}
|
201
|
+
|
202
|
+
shared_storage_reader = Bas::SharedStorage::Default.new
|
203
|
+
shared_storage_writer = Bas::SharedStorage::Postgres.new(write_options: write_options)
|
204
|
+
|
205
|
+
bot = Bas::Bot::FetchFromAPi.new(options, shared_storage_reader, shared_storage_writer)
|
206
|
+
bot.execute
|
207
|
+
```
|
208
|
+
|
209
|
+
In this example, the shared_storage_reader is a default implementation that does not perform actual reading operations, while shared_storage_writer writes to a PostgreSQL database.
|
210
|
+
|
211
|
+
## Building my own BOT
|
212
|
+
|
213
|
+
The gem provides essential interfaces, types, and methods to help you easily create your own bot. For instance, two base classes are provided: one for handling shared storage read-write operations and another for defining the bot’s specific task logic.
|
214
|
+
|
215
|
+
### Bot - Solve a specific automation task
|
216
|
+
The bot executes the logic required to complete a specific task. For this, an instance of shared storage (for reading and for writing) must be provided to the bot.
|
217
|
+
|
218
|
+
The base interface for a bot is available in the `bas/bot/base.rb class`.
|
219
|
+
|
220
|
+
## Examples
|
221
|
+
|
77
222
|
### Define the bot
|
78
223
|
|
79
224
|
In this example, we demonstrate how to configure a bot to fetch data from an API and save it in a postgres database.
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "concurrent-ruby"
|
4
|
+
|
5
|
+
module Bas
|
6
|
+
module Orchestrator
|
7
|
+
##
|
8
|
+
# Manager class responsible for scheduling and executing scripts concurrently.
|
9
|
+
#
|
10
|
+
# This class initializes a thread pool and processes scheduled scripts based on
|
11
|
+
# time intervals, specific days, or exact times.
|
12
|
+
#
|
13
|
+
class Manager
|
14
|
+
def initialize(schedules)
|
15
|
+
@last_executions = Hash.new(0.0)
|
16
|
+
@schedules = schedules
|
17
|
+
@pool = Concurrent::FixedThreadPool.new(@schedules.size)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
@schedules.each { |script| @pool.post { process_script(script) } }
|
22
|
+
|
23
|
+
@pool.shutdown
|
24
|
+
@pool.wait_for_termination
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def process_script(script)
|
30
|
+
loop do
|
31
|
+
@actual_time = Time.new
|
32
|
+
|
33
|
+
execute_interval(script) if interval?(script)
|
34
|
+
execute_day(script) if day?(script) && time?(script)
|
35
|
+
execute_time(script) if time?(script) && !day?(script)
|
36
|
+
|
37
|
+
sleep 0.1
|
38
|
+
rescue StandardError => e
|
39
|
+
puts "Error in thread: #{e.message}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def execute_interval(script)
|
44
|
+
return unless time_in_milliseconds - @last_executions[script[:path]] >= script[:interval]
|
45
|
+
|
46
|
+
execute(script)
|
47
|
+
@last_executions[script[:path]] = time_in_milliseconds
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute_day(script)
|
51
|
+
return unless script[:day].include?(current_day) && script[:time].include?(current_time)
|
52
|
+
|
53
|
+
execute(script) unless @last_executions[script[:path]].eql?(current_time)
|
54
|
+
@last_executions[script[:path]] = current_time
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute_time(script)
|
58
|
+
execute(script) if script[:time].include?(current_time) && !@last_executions[script[:path]].eql?(current_time)
|
59
|
+
@last_executions[script[:path]] = current_time
|
60
|
+
end
|
61
|
+
|
62
|
+
def interval?(script)
|
63
|
+
script[:interval]
|
64
|
+
end
|
65
|
+
|
66
|
+
def time?(script)
|
67
|
+
script[:time]
|
68
|
+
end
|
69
|
+
|
70
|
+
def day?(script)
|
71
|
+
script[:day]
|
72
|
+
end
|
73
|
+
|
74
|
+
def time_in_milliseconds
|
75
|
+
@actual_time.to_f * 1000
|
76
|
+
end
|
77
|
+
|
78
|
+
def current_time
|
79
|
+
@actual_time.strftime("%H:%M")
|
80
|
+
end
|
81
|
+
|
82
|
+
def current_day
|
83
|
+
@actual_time.strftime("%A")
|
84
|
+
end
|
85
|
+
|
86
|
+
def execute(script)
|
87
|
+
puts "Executing #{script[:path]} at #{current_time}"
|
88
|
+
absolute_path = File.expand_path(script[:path], __dir__)
|
89
|
+
|
90
|
+
system("ruby", absolute_path)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bas/orchestrator/manager"
|
4
|
+
module Bas
|
5
|
+
# The Orchestrator module is responsible for managing the scheduling and execution
|
6
|
+
# of scripts within the business automation services. It provides a high-level
|
7
|
+
# interface to start the orchestration process using the `Manager` class.
|
8
|
+
#
|
9
|
+
module Orchestrator
|
10
|
+
# Starts the orchestration process with the given schedules.
|
11
|
+
#
|
12
|
+
# @param schedules [Array<Hash>] A list of scripts with execution details.
|
13
|
+
def self.start(schedules)
|
14
|
+
manager = Manager.new(schedules)
|
15
|
+
manager.run
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -25,11 +25,13 @@ module Utils
|
|
25
25
|
# <b>returns</b> <tt>HTTParty::Response</tt>
|
26
26
|
#
|
27
27
|
def self.execute(params)
|
28
|
-
|
28
|
+
validate_params(params)
|
29
29
|
|
30
|
+
url = "#{DIGITAL_OCEAN_BASE_URL}/#{params[:endpoint]}"
|
30
31
|
headers = headers(params[:secret])
|
32
|
+
body = params[:body]&.to_json
|
31
33
|
|
32
|
-
HTTParty.send(params[:method], url, { body:
|
34
|
+
HTTParty.send(params[:method], url, { body: body, headers: headers })
|
33
35
|
end
|
34
36
|
|
35
37
|
def self.headers(secret)
|
@@ -38,6 +40,11 @@ module Utils
|
|
38
40
|
"Content-Type" => "application/json"
|
39
41
|
}
|
40
42
|
end
|
43
|
+
|
44
|
+
def self.validate_params(params)
|
45
|
+
raise ArgumentError, "Secret is required" unless params[:secret]
|
46
|
+
raise ArgumentError, "Endpoint is required" unless params[:endpoint]
|
47
|
+
end
|
41
48
|
end
|
42
49
|
end
|
43
50
|
end
|
data/lib/bas/version.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kommitters Open Source
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-02-11 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: gmail_xoauth
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.4.1
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.4.1
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: google-api-client
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.53'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.53'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: googleauth
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.11'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.11'
|
55
12
|
- !ruby/object:Gem::Dependency
|
56
13
|
name: httparty
|
57
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,90 +23,6 @@ dependencies:
|
|
66
23
|
- - "~>"
|
67
24
|
- !ruby/object:Gem::Version
|
68
25
|
version: 0.22.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: jwt
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 2.8.1
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 2.8.1
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: md_to_notion
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.1.4
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.1.4
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: net-imap
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 0.4.10
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 0.4.10
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: net-smtp
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.4.0.1
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 0.4.0.1
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: octokit
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: 8.1.0
|
132
|
-
type: :runtime
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: 8.1.0
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: openssl
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '3.2'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '3.2'
|
153
26
|
- !ruby/object:Gem::Dependency
|
154
27
|
name: pg
|
155
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,9 +37,10 @@ dependencies:
|
|
164
37
|
- - "~>"
|
165
38
|
- !ruby/object:Gem::Version
|
166
39
|
version: '1.5'
|
167
|
-
description: A versatile business automation
|
168
|
-
|
169
|
-
workflows without excessive complexity. Formerly
|
40
|
+
description: A versatile business automation suite offering key components for building
|
41
|
+
and automating a wide variety of use cases. It provides an easy-to-use tool
|
42
|
+
for implementing automation workflows without excessive complexity. Formerly
|
43
|
+
known as 'bns'.
|
170
44
|
email:
|
171
45
|
- oss@kommit.co
|
172
46
|
executables: []
|
@@ -187,6 +61,8 @@ files:
|
|
187
61
|
- examples/serverless_example.md
|
188
62
|
- lib/bas.rb
|
189
63
|
- lib/bas/bot/base.rb
|
64
|
+
- lib/bas/orchestrator.rb
|
65
|
+
- lib/bas/orchestrator/manager.rb
|
190
66
|
- lib/bas/shared_storage/base.rb
|
191
67
|
- lib/bas/shared_storage/default.rb
|
192
68
|
- lib/bas/shared_storage/postgres.rb
|
@@ -216,7 +92,6 @@ licenses:
|
|
216
92
|
metadata:
|
217
93
|
homepage_uri: https://github.com/kommitters/bas
|
218
94
|
source_code_uri: https://github.com/kommitters/bas
|
219
|
-
post_install_message:
|
220
95
|
rdoc_options: []
|
221
96
|
require_paths:
|
222
97
|
- lib
|
@@ -231,8 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
106
|
- !ruby/object:Gem::Version
|
232
107
|
version: '0'
|
233
108
|
requirements: []
|
234
|
-
rubygems_version: 3.
|
235
|
-
signing_key:
|
109
|
+
rubygems_version: 3.6.2
|
236
110
|
specification_version: 4
|
237
|
-
summary: BAS - Business automation
|
111
|
+
summary: BAS - Business automation suite
|
238
112
|
test_files: []
|