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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5128c22f8ba67518e5171077718313c0f540655f1a83b3954adc18613fe6863d
4
- data.tar.gz: 71a7085f7dc92004aaf6271601d2d83a0e35f19c2e053f8050a959839347c87a
3
+ metadata.gz: 63490ab5165fd3aa1793a7521272869addb0ebd691d65e7e300b757af770b6fe
4
+ data.tar.gz: 834e5ff6ebe43795ddfd94fa19f7d3435cd6ae99fc24902abdec2a8c3215ce3d
5
5
  SHA512:
6
- metadata.gz: 80d344d73476474246f4f3020ccd3adeac789f4e9d76dcf16aa5f872f3030f58c9b193f8b22bc5dbdf5dede180c6bcc42a63c403dfa42135837474f52f2fd777
7
- data.tar.gz: 508c9b6ec55f0f5a28029a09f830fc4ce1284df19a05892e6f35ab3f21aefc3519583103e76ab44c37db529d1912801251d34688177d91b8ed3b01aca7cad2aa
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
- gem "gmail_xoauth"
31
-
32
- gem "google-api-client"
33
- gem "googleauth"
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 System
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
- ## Building my own BOT
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
- ### 1. SharedStorage - Read and Write data.
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
- ### 2. Bot - Solve a specific automation task
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
- The base interface for a bot is available in the `bas/bot/base.rb class`.
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
- ## Examples
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
- ### Preparing the configurations
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
- url = "#{DIGITAL_OCEAN_BASE_URL}/#{params[:endpoint]}"
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: params[:body].to_json, headers: })
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
@@ -22,6 +22,12 @@ module Utils
22
22
  { error: e.to_s }
23
23
  end
24
24
 
25
+ def repository_info(repo)
26
+ octokit.repository(repo)
27
+ rescue StandardError => e
28
+ { error: e.to_s }
29
+ end
30
+
25
31
  private
26
32
 
27
33
  def octokit
data/lib/bas/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bas
4
4
  # Gem version
5
- VERSION = "1.6.2"
5
+ VERSION = "1.7.1"
6
6
  end
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.6.2
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: 2024-12-12 00:00:00.000000000 Z
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 system offering key components for building
168
- various use cases. It provides an easy-to-use tool for implementing automation
169
- workflows without excessive complexity. Formerly known as 'bns'.
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.5.22
235
- signing_key:
109
+ rubygems_version: 3.6.2
236
110
  specification_version: 4
237
- summary: BAS - Business automation system
111
+ summary: BAS - Business automation suite
238
112
  test_files: []