claiss 1.1.2 → 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: b196fd14a391ce3804f055af6109513aa11d3b9555a31bcd0cdfcd99aebf4e3d
4
- data.tar.gz: 7dd699a7ea98feeb55c974a726ff0d40a8b239d960e21bd3ebc6d994883c29cf
3
+ metadata.gz: 0717123d37af9bf85c7fb958ec88949a9a4b9275eb703e8e38dd7940705e59d0
4
+ data.tar.gz: ac451a336575e5832c26532db241cce0fe8a74eaf01a43ae2fff294b666e1461
5
5
  SHA512:
6
- metadata.gz: 3886071f8e207af613f1e9da94e29fc72f6d95e7f3ca3e79e2e9e3f19b72b2f37c59c3375625feed9440329d07387d1fb1dea7cf4f4f1a98a16c8d3ce5307748
7
- data.tar.gz: 44cafb7662557876102c52385966d4712b1cd58448c77bc5228ff60ed18263072682055eb64a438cdd3cce8f59b59fb58f506380f3f7048570d14c6c49651680
6
+ metadata.gz: d753b2af4c9ce85474b0a1bb66d35d0b0ae5e6aa1601dcd81484571155beae2daae314a545122b39f6928e5c97aadd4c60d7221a29fb8563d5feb7b578c8665a
7
+ data.tar.gz: bc58050fe555a8b8af015dc5efa50716168b642dfb4fe3b682edc8847aefdacefef5d0b3bef581169750ab2efcedded9c66880aec29683cce77a179d16e11d9f
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CLAISS CLI Refactor Application Toolbox
2
2
 
3
- **CLAISS** is a Ruby-based CLI application and toolbox designed to manage CLAISS Refactored applications and deployments. Please note that some features may have limited compatibility depending on the environment. 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
 
@@ -21,53 +21,97 @@ The `refactor` command allows you to rename and replace text terms within files
21
21
  Basic usage:
22
22
 
23
23
  ```sh
24
- $ claiss refactor ./project/ ./my_changes.json
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)
30
+
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
25
36
  ```
26
37
 
27
38
  #### Using a JSON Dictionary
28
39
 
29
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.
30
41
 
31
- Example `my_changes.json`:
42
+ The JSON file should be placed in the `~/.claiss/` directory by default.
43
+
44
+ Example `~/.claiss/my_project.json`:
32
45
 
33
46
  ```json
34
47
  {
35
- "system pro": "system b2b",
36
- "System Pro": "System B2b",
37
- "System": "Laiss",
38
- "system": "laiss",
39
- "2010 Moevo Silver": "2023 Júlio Papel",
40
- "Jared Moevo": "Júlio Papel",
41
- "3dtester@gmail.com": "info@mynewsite.pt",
42
- "https://somelivesite.com": "https://api.mynewsite.pt",
43
- "This is your Rails project.": "Multi Layered Software Services.",
44
- "This is your Rails project for your business.": "A Multi Layered Software Services ready to be deployed for any business.",
45
- "MIT-LICENSE": "LICENSE",
46
- "https://somesite.com": "https://api.mynewsite.pt"
48
+ "old_term": "new_term",
49
+ "OldClassName": "NewClassName",
50
+ "OLD_CONSTANT": "NEW_CONSTANT"
47
51
  }
48
52
  ```
49
53
 
50
- To apply the changes using the dictionary file:
54
+ #### New Features and Improvements
51
55
 
52
- ```sh
53
- $ claiss refactor ./project/ ./my_changes.json
54
- ```
56
+ 1. **Progress Bar**: The refactoring process now displays a progress bar, giving you a visual indication of the operation's status.
55
57
 
56
- **Important:** After refactoring, any empty directories left behind will be automatically removed to keep your project structure clean.
58
+ 2. **Parallel Processing**: Large projects are now processed using parallel execution, significantly improving performance on multi-core systems.
59
+
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.
57
65
 
58
66
  ### Fix Ruby Permissions
59
67
 
60
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.
61
69
 
62
70
  ```sh
63
- $ claiss fix_ruby_permissions ./project/
71
+ $ claiss fix_ruby_permissions [path]
72
+ ```
73
+
74
+ - `[path]`: Path to the Ruby project (optional, default: current directory)
75
+
76
+ Example:
77
+
78
+ ```sh
79
+ $ claiss fix_ruby_permissions
80
+ $ claiss fix_ruby_permissions path/to/ruby/project
64
81
  ```
65
82
 
66
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.
67
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.
106
+
68
107
  ## Upcoming Features
69
108
 
70
- We are continuously 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!
71
115
 
72
116
  ## Contributing
73
117
 
@@ -79,4 +123,4 @@ This gem is available as open source under the terms of the [MIT License](https:
79
123
 
80
124
  ## Author
81
125
 
82
- Júlio Papel
126
+ Júlio Papel
@@ -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.2"
2
+ VERSION = "1.1.3"
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,84 +27,159 @@ 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
-
26
- process_files(origin_path, dict)
27
- remove_empty_directories(origin_path)
28
-
29
- puts "Done! Files have been refactored in place."
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'}."
30
53
  end
31
54
 
32
55
  private
33
56
 
34
- def load_dictionary(json_file)
35
- if json_file
36
- JSON.parse(File.read(json_file))
37
- else
38
- interactive_dictionary
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) }
39
60
  end
40
61
  end
41
62
 
42
- def interactive_dictionary
43
- dict = {}
44
- loop do
45
- print "Term to search (or press Enter to finish): "
46
- search = STDIN.gets.chomp
47
- break if search.empty?
48
- print "Term to replace: "
49
- replace = STDIN.gets.chomp
50
- dict[search] = replace
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
51
74
  end
52
- dict
53
75
  end
54
76
 
55
- def process_files(origin_path, dict)
56
- Dir.glob(File.join(origin_path, "**", "*"), File::FNM_DOTMATCH).each do |file_name|
57
- next if File.directory?(file_name)
58
- next if file_name.include?(".git/") || file_name.include?("node_modules/") # Ignore .git and node_modules folders
59
- process_file(file_name, dict)
77
+ def load_dictionary(json_file)
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
60
110
  end
61
111
  end
62
112
 
63
- def process_file(file_name, dict)
64
- text = File.read(file_name)
65
-
66
- dict.each do |search, replace|
67
- text.gsub!(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)
68
118
  end
119
+ end
69
120
 
70
- new_file_name = file_name.dup
71
-
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
72
137
  dict.each do |search, replace|
73
- new_file_name.gsub!(search, replace)
138
+ if text.gsub!(/#{Regexp.escape(search)}/, replace)
139
+ text_changed = true
140
+ end
74
141
  end
75
-
76
- # Create the directory for the new file if it doesn't exist
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
+
77
152
  new_dir = File.dirname(new_file_name)
78
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
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"))
171
+ end
79
172
 
80
- # Write the changes to the new file name
81
- File.write(new_file_name, text)
82
-
83
- # If the filename has changed, delete the original file
84
- unless new_file_name == file_name
85
- File.delete(file_name) # Delete the original file
86
- puts "File renamed from #{file_name} to #{new_file_name}, OK"
87
- else
88
- puts "File: #{file_name}, OK"
173
+ def replace_in_path(path, dict)
174
+ dict.reduce(path) do |s, (search, replace)|
175
+ s.gsub(/#{Regexp.escape(search)}/, replace)
89
176
  end
90
177
  end
91
178
 
92
- def remove_empty_directories(origin_path)
93
- Dir.glob(File.join(origin_path, '**', '*'), File::FNM_DOTMATCH).reverse_each do |dir_name|
179
+ def remove_empty_directories(path)
180
+ Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH).reverse_each do |dir_name|
94
181
  next unless File.directory?(dir_name)
95
- next if dir_name.include?(".git/") || dir_name.include?("node_modules/") # Ignore .git and node_modules folders
182
+ next if IGNORED_DIRECTORIES.any? { |ignored_dir| dir_name.include?(ignored_dir) }
96
183
  if (Dir.entries(dir_name) - %w[. ..]).empty?
97
184
  Dir.rmdir(dir_name)
98
185
  puts "Removed empty directory: #{dir_name}"
@@ -101,13 +188,65 @@ module CLAISS
101
188
  end
102
189
  end
103
190
 
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"
236
+ end
237
+ end
104
238
 
105
239
  class FixRubyPermissions < Dry::CLI::Command
106
240
  desc "Fix permissions for a Ruby project"
107
- argument :path, required: true, desc: "The path of your Ruby project"
108
241
 
109
- def call(path: nil, **)
110
- 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: ".", **)
111
250
  path = File.expand_path(path)
112
251
 
113
252
  Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH) do |item|
@@ -123,31 +262,27 @@ module CLAISS
123
262
  executable_files = ['bundle', 'rails', 'rake', 'spring']
124
263
  executable_files.each do |file|
125
264
  file_path = File.join(path, 'bin', file)
126
- 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
127
269
  end
128
270
 
129
- puts "Permissions fixed for #{path}"
271
+ puts "Permissions fixed for Ruby project at #{path}"
130
272
  end
131
273
 
132
274
  private
133
275
 
134
276
  def fix_file_permissions(file)
135
- current_permissions = File.stat(file).mode
136
-
137
- if current_permissions & 0o100 != 0 # Check if the owner has execute permission
138
- File.chmod(0755, file) # Maintain execution permission for owner, group, and others
139
- elsif current_permissions & 0o010 != 0 # Check if the group has execute permission
140
- File.chmod(0755, file) # Maintain execution permission for group and others
141
- elsif current_permissions & 0o001 != 0 # Check if others have execute permission
142
- File.chmod(0755, file) # Maintain execution permission for others
277
+ if File.extname(file) == '.rb' || file.include?('/bin/')
278
+ File.chmod(0755, file)
143
279
  else
144
- File.chmod(0644, file) # Otherwise, apply standard read/write permissions
280
+ File.chmod(0644, file)
145
281
  end
146
282
  end
147
283
  end
148
-
149
284
  end
150
285
 
151
286
  require_relative "claiss/version"
152
287
  require_relative "claiss/commands"
153
- require_relative "claiss/cli"
288
+ require_relative "claiss/cli"
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.2
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-08-09 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
@@ -89,8 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
117
  - !ruby/object:Gem::Version
90
118
  version: '0'
91
119
  requirements: []
92
- rubygems_version: 3.5.3
93
- signing_key:
120
+ rubygems_version: 3.1.2
121
+ signing_key:
94
122
  specification_version: 4
95
123
  summary: CLAISS AI CLI application Toolbox
96
124
  test_files: []