claiss 1.1.1 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4676e0b9c189aef43c1e7fc47b8335e6b06326a7037b8c5c8bc43d546fec9e03
4
- data.tar.gz: 1b0aced8f24d95a68a9b3b378d70562020d9c1b0f32be955e5d7b98f291e4fe9
3
+ metadata.gz: 0717123d37af9bf85c7fb958ec88949a9a4b9275eb703e8e38dd7940705e59d0
4
+ data.tar.gz: ac451a336575e5832c26532db241cce0fe8a74eaf01a43ae2fff294b666e1461
5
5
  SHA512:
6
- metadata.gz: daaec06de788e6d5710b17094fcb7948365fdec7099fff35da7a89dfe4aba78bff7ef9b1114836196eddfba7b490bb7d42177248d39778006516b0879c5ef55d
7
- data.tar.gz: b8f1c356aa5f6d8b1b94bed86c085b8f6035fa1fd324d945c1879a0cd2de29141c36854b1ca4a13cfc89b9b04f6a3b1107373a21ad0b7a496ba3fdb1ad12c61e
6
+ metadata.gz: d753b2af4c9ce85474b0a1bb66d35d0b0ae5e6aa1601dcd81484571155beae2daae314a545122b39f6928e5c97aadd4c60d7221a29fb8563d5feb7b578c8665a
7
+ data.tar.gz: bc58050fe555a8b8af015dc5efa50716168b642dfb4fe3b682edc8847aefdacefef5d0b3bef581169750ab2efcedded9c66880aec29683cce77a179d16e11d9f
data/README.md CHANGED
@@ -1,56 +1,117 @@
1
- # CLAISS AI CLI Application Toolbox
1
+ # CLAISS CLI Refactor Application Toolbox
2
2
 
3
- CLAISS is a Ruby CLI application & Toolbox to manage CLAISS AI applications and deployments. Please note that some features may not work in all environments. Use with caution!
3
+ **CLAISS** is a Ruby-based CLI application and toolbox designed to manage CLAISS Refactored applications and deployments. It provides powerful refactoring capabilities with improved performance and safety features. Please note that some features may have limited compatibility depending on the environment. Use with caution!
4
4
 
5
5
  ## Installation
6
6
 
7
- Install the gem by running the following command in your terminal:
7
+ Install the CLAISS gem by running the following command in your terminal:
8
8
 
9
- Copy
10
-
11
- `$ gem install claiss`
9
+ ```sh
10
+ $ gem install claiss
11
+ ```
12
12
 
13
13
  ## Usage
14
14
 
15
15
  ### Refactor
16
16
 
17
- The `refactor` command changes text terms in files within a folder, creating a new "refactored-..." folder with the modified files. Note that this command will change all exact occurrences of the specified terms. For example, "Abc" is treated differently from "AbC " or " ABc" or "abc" or "ABC".
17
+ The `refactor` command allows you to rename and replace text terms within files and filenames in a specified directory. This command will refactor all exact occurrences of specified terms, including filenames. For example, "Abc" is treated differently from "AbC", "ABc", or "abc".
18
+
19
+ **Note:** The `refactor` command ignores the `.git/` and `node_modules/` directories to avoid modifying critical or third-party files.
18
20
 
19
21
  Basic usage:
20
22
 
21
- Copy
23
+ ```sh
24
+ $ claiss refactor <path> <rules>
25
+ ```
26
+
27
+ - `<path>`: Path to the directory to refactor (required)
28
+ - `<rules>`: Name of the rules file (without .json extension) (required)
29
+ - `--destination`: Destination path for refactored files (optional)
22
30
 
23
- `$ claiss refactor ./project/`
31
+ Examples:
32
+
33
+ ```sh
34
+ $ claiss refactor path/to/project my_project
35
+ $ claiss refactor path/to/project my_project --destination path/to/output
36
+ ```
24
37
 
25
38
  #### Using a JSON Dictionary
26
39
 
27
- You can create a JSON file with a list of terms to refactor. This file should be formatted as a one-level JSON object. The terms are processed in order from top to bottom.
40
+ You can create a JSON file that specifies the terms you want to refactor. This JSON file should be structured as a simple key-value pair object, where each key is the term to be replaced and the value is the replacement term. The terms are processed in the order they appear in the file.
41
+
42
+ The JSON file should be placed in the `~/.claiss/` directory by default.
28
43
 
29
- Example `myapp.json` file:
44
+ Example `~/.claiss/my_project.json`:
30
45
 
31
- Copy
46
+ ```json
47
+ {
48
+ "old_term": "new_term",
49
+ "OldClassName": "NewClassName",
50
+ "OLD_CONSTANT": "NEW_CONSTANT"
51
+ }
52
+ ```
32
53
 
33
- `{ "system pro": "system b2b", "System Pro": "System B2b", "System": "Laiss", "system": "laiss", "2010 Moevo Silver": "2023 Júlio Papel", "Jared Moevo": "Júlio Papel", "3dtester@gmail.com": "info@mynewsite.pt", "https://somelivesite.com": "https://api.mynewsite.pt", "This is your Rails project.": "Multi Layered Software Services.", "This is your Rails project for your business.": "A Multi Layered Software Services ready to be deployed for any business.", "MIT-LICENSE": "LICENSE", "https://somesite.com": "https://api.mynewsite.pt" }`
54
+ #### New Features and Improvements
34
55
 
35
- To use this dictionary file:
56
+ 1. **Progress Bar**: The refactoring process now displays a progress bar, giving you a visual indication of the operation's status.
36
57
 
37
- Copy
58
+ 2. **Parallel Processing**: Large projects are now processed using parallel execution, significantly improving performance on multi-core systems.
38
59
 
39
- `$ claiss refactor ./project/ ./myapp.json`
60
+ 3. **Improved Encoding Handling**: The tool now better handles files with different encodings, falling back to binary reading for files with invalid UTF-8 sequences.
61
+
62
+ 4. **Truncated Logging**: Log messages now show truncated file paths for improved readability, especially in projects with deep directory structures.
63
+
64
+ 5. **Automatic Cleanup**: After refactoring, any empty directories left behind are automatically removed to keep your project structure clean.
40
65
 
41
66
  ### Fix Ruby Permissions
42
67
 
43
- The `fix_ruby_permissions` command adjusts file permissions for a Ruby & Rails project:
68
+ The `fix_ruby_permissions` command adjusts file permissions for a Ruby or Rails project. It ensures that directories have the correct execute permissions and that files retain their appropriate read/write/execute permissions.
69
+
70
+ ```sh
71
+ $ claiss fix_ruby_permissions [path]
72
+ ```
73
+
74
+ - `[path]`: Path to the Ruby project (optional, default: current directory)
44
75
 
45
- Copy
76
+ Example:
46
77
 
47
- `$ claiss fix_ruby_permissions ./refactored-1688375056/`
78
+ ```sh
79
+ $ claiss fix_ruby_permissions
80
+ $ claiss fix_ruby_permissions path/to/ruby/project
81
+ ```
48
82
 
49
- **Note:** This command uses `chmod` and may not work correctly on systems that support filename spaces and ignore capitals (like some end-user operating systems). For example, a file called 'MyImage copy.svg' may cause errors. In such cases, manually fix the permissions for problematic files and then re-run the command.
83
+ **Note:** This command uses `chmod` and may encounter issues on systems that do not distinguish between uppercase and lowercase filenames or support spaces in filenames (e.g., certain end-user operating systems). If you encounter errors, particularly with filenames like `MyImage copy.svg`, manually fix those file permissions and re-run the command.
84
+
85
+ ### Generate JSON
86
+
87
+ The `generate_json` command helps create a new JSON file with an empty key-value pair for refactoring:
88
+
89
+ ```sh
90
+ $ claiss generate_json [options]
91
+ ```
92
+
93
+ Options:
94
+ - `--output`: Name of the output JSON file (default: rules)
95
+ - `--path`: Path to save the JSON file (default: ~/.claiss/)
96
+
97
+ Examples:
98
+
99
+ ```sh
100
+ $ claiss generate_json
101
+ $ claiss generate_json --output my_custom_rules
102
+ $ claiss generate_json --path /custom/path/ --output my_rules
103
+ ```
104
+
105
+ This command generates a new JSON file that can be used as a template for creating refactoring rules.
50
106
 
51
107
  ## Upcoming Features
52
108
 
53
- We're continually working to improve CLAISS and add new functionalities. Stay tuned for updates!
109
+ We are continuously working to improve CLAISS and add new functionalities. Some planned features include:
110
+
111
+ 1. Enhanced error handling and reporting
112
+ 2. Support for more complex refactoring rules
113
+
114
+ Stay tuned for updates!
54
115
 
55
116
  ## Contributing
56
117
 
@@ -58,7 +119,7 @@ Bug reports and pull requests are welcome on GitHub at [https://github.com/Julio
58
119
 
59
120
  ## License
60
121
 
61
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
122
+ This gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
62
123
 
63
124
  ## Author
64
125
 
@@ -1,9 +1,10 @@
1
1
  module CLAISS
2
- module Commands
3
- extend Dry::CLI::Registry
4
-
5
- register "version", Version, aliases: ["v", "-v", "--version"]
6
- register "refactor", Refactor
7
- register "fix_ruby_permissions", FixRubyPermissions
8
- end
9
- end
2
+ module Commands
3
+ extend Dry::CLI::Registry
4
+
5
+ register "version", CLAISS::Version, aliases: ["v", "-v", "--version"]
6
+ register "refactor", CLAISS::Refactor
7
+ register "fix_ruby_permissions", CLAISS::FixRubyPermissions
8
+ register "generate_json", CLAISS::GenerateJson
9
+ end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module CLAISS
2
- VERSION = "1.1.1"
3
- end
2
+ VERSION = "1.1.3"
3
+ end
data/lib/claiss.rb CHANGED
@@ -1,9 +1,21 @@
1
- require "bundler/setup"
2
1
  require "dry/cli"
3
- require "fileutils"
2
+ require "bundler/setup"
3
+ require 'pathname'
4
4
  require 'json'
5
+ require "fileutils"
6
+ require 'logger'
7
+ require 'parallel'
8
+ require 'ruby-progressbar'
5
9
 
10
+ # CLAISS module provides CLI commands for refactoring and managing Ruby projects
6
11
  module CLAISS
12
+ IGNORED_DIRECTORIES = [".git/", "node_modules/"]
13
+ DEFAULT_JSON_DIR = File.join(Dir.home, '.claiss')
14
+
15
+ # Initialize logger
16
+ LOGGER = Logger.new(STDOUT)
17
+ LOGGER.level = Logger::INFO # Set to Logger::DEBUG for more verbose output
18
+
7
19
  class Error < StandardError; end
8
20
 
9
21
  class Version < Dry::CLI::Command
@@ -15,90 +27,258 @@ module CLAISS
15
27
  end
16
28
 
17
29
  class Refactor < Dry::CLI::Command
18
- desc "Refactors terms and files on directories"
19
- argument :path, type: :string, required: true, desc: "Relative path directory"
20
- argument :json_file, type: :string, desc: "Provide a JSON file with replacement rules"
21
-
22
- def call(path:, json_file: nil, **)
23
- dict = load_dictionary(json_file)
30
+ desc "Refactor files and filenames"
31
+
32
+ argument :path, type: :string, required: true, desc: "Path to the directory to refactor"
33
+ argument :rules, type: :string, required: true, desc: "Name of the rules file (without .json extension)"
34
+ option :destination, type: :string, desc: "Destination path for refactored files"
35
+
36
+ example [
37
+ "path/to/project autokeras",
38
+ "path/to/project autokeras --destination path/to/output"
39
+ ]
40
+
41
+ def call(path:, rules:, destination: nil, **)
24
42
  origin_path = File.expand_path(path)
25
- destination_path = File.expand_path("./refactored-#{Time.now.to_i}")
43
+ destination_path = destination ? File.expand_path(destination) : nil
44
+
45
+ json_file = File.join(DEFAULT_JSON_DIR, "#{rules}.json")
46
+ dict = load_dictionary(json_file)
47
+
48
+ files = get_files_to_process(origin_path)
49
+ process_files_in_parallel(files, dict, origin_path, destination_path)
50
+ remove_empty_directories(destination_path || origin_path)
51
+
52
+ puts "Done! Files have been refactored#{destination_path ? ' to the destination' : ' in place'}."
53
+ end
26
54
 
27
- dict[origin_path] = destination_path
28
- process_files(origin_path, dict)
55
+ private
29
56
 
30
- puts "Done! Your project is in the #{destination_path} folder"
57
+ def get_files_to_process(origin_path)
58
+ Dir.glob(File.join(origin_path, '**', '*'), File::FNM_DOTMATCH).reject do |file_name|
59
+ File.directory?(file_name) || IGNORED_DIRECTORIES.any? { |dir| file_name.include?(dir) }
60
+ end
31
61
  end
32
62
 
33
- private
63
+ def process_files_in_parallel(files, dict, origin_path, destination_path)
64
+ progress_bar = ProgressBar.create(
65
+ total: files.size,
66
+ format: "%a %b\u{15E7}%i %p%% %t",
67
+ progress_mark: ' ',
68
+ remainder_mark: "\u{FF65}"
69
+ )
70
+
71
+ Parallel.each(files, in_threads: Parallel.processor_count) do |file_name|
72
+ refactor_file(file_name, dict, origin_path, destination_path)
73
+ progress_bar.increment
74
+ end
75
+ end
34
76
 
35
77
  def load_dictionary(json_file)
36
- if json_file
37
- JSON.parse(File.read(json_file))
38
- else
39
- interactive_dictionary
78
+ LOGGER.info("Attempting to load dictionary from: #{json_file}")
79
+
80
+ unless File.exist?(json_file)
81
+ error_message = "JSON file not found: #{json_file}"
82
+ LOGGER.error(error_message)
83
+ raise Errno::ENOENT, error_message
84
+ end
85
+
86
+ begin
87
+ file_content = File.read(json_file)
88
+ LOGGER.debug("File content: #{file_content}")
89
+
90
+ parsed_content = JSON.parse(file_content)
91
+ LOGGER.info("Successfully parsed JSON file")
92
+
93
+ if parsed_content.empty?
94
+ LOGGER.warn("The loaded dictionary is empty")
95
+ else
96
+ LOGGER.info("Loaded dictionary with #{parsed_content.size} key-value pairs")
97
+ end
98
+
99
+ parsed_content
100
+ rescue JSON::ParserError => e
101
+ error_message = "Error parsing JSON file '#{json_file}': #{e.message}"
102
+ LOGGER.error(error_message)
103
+ LOGGER.debug("JSON content that failed to parse: #{file_content}")
104
+ raise JSON::ParserError, error_message
105
+ rescue StandardError => e
106
+ error_message = "Unexpected error while loading dictionary from '#{json_file}': #{e.message}"
107
+ LOGGER.error(error_message)
108
+ LOGGER.debug(e.backtrace.join("\n"))
109
+ raise
40
110
  end
41
111
  end
42
112
 
43
- def interactive_dictionary
44
- dict = {}
45
- loop do
46
- print "Term to search (or press Enter to finish): "
47
- search = STDIN.gets.chomp
48
- break if search.empty?
49
- print "Term to replace: "
50
- replace = STDIN.gets.chomp
51
- dict[search] = replace
113
+ def process_files(origin_path, dict, destination_path)
114
+ Dir.glob(File.join(origin_path, '**', '*'), File::FNM_DOTMATCH) do |file_name|
115
+ next if File.directory?(file_name)
116
+ next if IGNORED_DIRECTORIES.any? { |dir| file_name.include?(dir) }
117
+ refactor_file(file_name, dict, origin_path, destination_path)
52
118
  end
53
- dict
54
119
  end
55
120
 
56
- def process_files(origin_path, dict)
57
- Dir.glob(File.join(origin_path, "**", "*"), File::FNM_DOTMATCH).each do |file_name|
58
- next if File.directory?(file_name)
59
- process_file(file_name, dict)
121
+ def refactor_file(file_name, dict, origin_path, destination_path)
122
+ begin
123
+ # First, try to read the file as UTF-8
124
+ text = File.read(file_name, encoding: 'UTF-8')
125
+ rescue Encoding::InvalidByteSequenceError
126
+ # If UTF-8 reading fails, fall back to binary reading and force UTF-8 encoding
127
+ # This approach helps handle files with mixed or unknown encodings
128
+ truncated_file_name = File.basename(file_name)
129
+ LOGGER.warn("Invalid UTF-8 byte sequence in ...#{truncated_file_name}. Falling back to binary reading.")
130
+ text = File.read(file_name, encoding: 'BINARY')
131
+ text.force_encoding('UTF-8')
132
+ # Replace any invalid or undefined characters with empty string
133
+ text.encode!('UTF-8', invalid: :replace, undef: :replace, replace: '')
134
+ end
135
+
136
+ text_changed = false
137
+ dict.each do |search, replace|
138
+ if text.gsub!(/#{Regexp.escape(search)}/, replace)
139
+ text_changed = true
140
+ end
141
+ end
142
+
143
+ relative_path = Pathname.new(file_name).relative_path_from(Pathname.new(origin_path))
144
+ new_relative_path = replace_in_path(relative_path.to_s, dict)
145
+
146
+ if destination_path
147
+ new_file_name = File.join(destination_path, new_relative_path)
148
+ else
149
+ new_file_name = File.join(origin_path, new_relative_path)
150
+ end
151
+
152
+ new_dir = File.dirname(new_file_name)
153
+ FileUtils.mkdir_p(new_dir) unless File.directory?(new_dir)
154
+
155
+ if text_changed || new_file_name != file_name
156
+ File.write(new_file_name, text)
157
+ if destination_path || new_file_name != file_name
158
+ truncated_old = "...#{File.basename(file_name)}"
159
+ truncated_new = "...#{File.basename(new_file_name)}"
160
+ LOGGER.info("File #{destination_path ? 'copied' : 'renamed'} from #{truncated_old} to #{truncated_new}")
161
+ else
162
+ truncated_file = "...#{File.basename(file_name)}"
163
+ LOGGER.info("File contents updated: #{truncated_file}")
164
+ end
165
+ File.delete(file_name) if !destination_path && new_file_name != file_name
60
166
  end
167
+ rescue => e
168
+ truncated_file = "...#{File.basename(file_name)}"
169
+ LOGGER.error("Error processing file #{truncated_file}: #{e.message}")
170
+ LOGGER.debug(e.backtrace.join("\n"))
61
171
  end
62
172
 
63
- def process_file(file_name, dict)
64
- destination = file_name.gsub(dict.keys.first, dict.values.first)
65
- text = File.read(file_name)
173
+ def replace_in_path(path, dict)
174
+ dict.reduce(path) do |s, (search, replace)|
175
+ s.gsub(/#{Regexp.escape(search)}/, replace)
176
+ end
177
+ end
66
178
 
67
- dict.each do |search, replace|
68
- destination.gsub!(search, replace)
69
- text.gsub!(search, replace)
179
+ def remove_empty_directories(path)
180
+ Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH).reverse_each do |dir_name|
181
+ next unless File.directory?(dir_name)
182
+ next if IGNORED_DIRECTORIES.any? { |ignored_dir| dir_name.include?(ignored_dir) }
183
+ if (Dir.entries(dir_name) - %w[. ..]).empty?
184
+ Dir.rmdir(dir_name)
185
+ puts "Removed empty directory: #{dir_name}"
186
+ end
70
187
  end
188
+ end
189
+ end
71
190
 
72
- FileUtils.mkdir_p(File.dirname(destination))
73
- File.write(destination, text)
74
- puts "File: #{destination}, OK"
191
+ class GenerateJson < Dry::CLI::Command
192
+ desc "Generate a new JSON file with an empty key-value pair"
193
+
194
+ option :output, type: :string, default: "rules", desc: "Name of the output JSON file (default: rules)"
195
+ option :path, type: :string, desc: "Path to save the JSON file (default: ~/.claiss/)"
196
+
197
+ example [
198
+ "",
199
+ "--output my_custom_rules",
200
+ "--path /custom/path/ --output my_rules"
201
+ ]
202
+
203
+ def call(path:, rules:, destination: nil, **)
204
+ origin_path = File.expand_path(path)
205
+ destination_path = destination ? File.expand_path(destination) : nil
206
+
207
+ json_file = File.join(DEFAULT_JSON_DIR, "#{rules}.json")
208
+
209
+ begin
210
+ dict = load_dictionary(json_file)
211
+ rescue Errno::ENOENT => e
212
+ puts e.message
213
+ puts "Please make sure the JSON file exists in the ~/.claiss directory."
214
+ exit(1)
215
+ rescue JSON::ParserError => e
216
+ puts e.message
217
+ puts "Please check the JSON file for syntax errors."
218
+ exit(1)
219
+ rescue StandardError => e
220
+ puts "An unexpected error occurred: #{e.message}"
221
+ puts "Please check the log for more details."
222
+ exit(1)
223
+ end
224
+
225
+ process_files(origin_path, dict, destination_path)
226
+ remove_empty_directories(destination_path || origin_path)
227
+
228
+ puts "Done! Files have been refactored#{destination_path ? ' to the destination' : ' in place'}."
229
+ end
230
+
231
+ private
232
+
233
+ def ensure_json_extension(filename)
234
+ return filename if filename.end_with?('.json')
235
+ "#{filename}.json"
75
236
  end
76
237
  end
77
238
 
78
239
  class FixRubyPermissions < Dry::CLI::Command
79
240
  desc "Fix permissions for a Ruby project"
80
- argument :path, required: true, desc: "The path of your Ruby project"
81
241
 
82
- def call(path: nil, **)
83
- path ||= Dir.getwd
242
+ argument :path, type: :string, required: false, default: ".", desc: "Path to the Ruby project (default: current directory)"
243
+
244
+ example [
245
+ "",
246
+ "path/to/ruby/project"
247
+ ]
248
+
249
+ def call(path: ".", **)
84
250
  path = File.expand_path(path)
85
251
 
86
252
  Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH) do |item|
87
253
  next if item == '.' || item == '..'
254
+ next if item.include?("node_modules/") # Ignore node_modules folder
88
255
  if File.directory?(item)
89
256
  File.chmod(0755, item)
90
257
  else
91
- File.chmod(0644, item)
258
+ fix_file_permissions(item)
92
259
  end
93
260
  end
94
261
 
95
262
  executable_files = ['bundle', 'rails', 'rake', 'spring']
96
263
  executable_files.each do |file|
97
264
  file_path = File.join(path, 'bin', file)
98
- File.chmod(0755, file_path) if File.exist?(file_path)
265
+ if File.exist?(file_path)
266
+ File.chmod(0755, file_path)
267
+ puts "Made #{file_path} executable"
268
+ end
99
269
  end
100
270
 
101
- puts "Permissions fixed for #{path}"
271
+ puts "Permissions fixed for Ruby project at #{path}"
272
+ end
273
+
274
+ private
275
+
276
+ def fix_file_permissions(file)
277
+ if File.extname(file) == '.rb' || file.include?('/bin/')
278
+ File.chmod(0755, file)
279
+ else
280
+ File.chmod(0644, file)
281
+ end
102
282
  end
103
283
  end
104
284
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claiss
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Júlio Papel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-25 00:00:00.000000000 Z
11
+ date: 2024-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-cli
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.6.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: parallel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.26.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.26.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: ruby-progressbar
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.13.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.13.0
55
83
  description: CLI application Toolbox to manage CLAISS AI applications and deployments.
56
84
  Some features may not work in all environments. Use with caution!
57
85
  email:
@@ -74,7 +102,7 @@ licenses:
74
102
  metadata:
75
103
  source_code_uri: https://github.com/JulioPapel/claiss.git
76
104
  documentation_uri: https://github.com/JulioPapel/claiss/blob/main/readme.md
77
- post_install_message:
105
+ post_install_message:
78
106
  rdoc_options: []
79
107
  require_paths:
80
108
  - lib
@@ -90,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
118
  version: '0'
91
119
  requirements: []
92
120
  rubygems_version: 3.1.2
93
- signing_key:
121
+ signing_key:
94
122
  specification_version: 4
95
123
  summary: CLAISS AI CLI application Toolbox
96
124
  test_files: []