claiss 1.1.3 → 1.1.4

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: 0717123d37af9bf85c7fb958ec88949a9a4b9275eb703e8e38dd7940705e59d0
4
- data.tar.gz: ac451a336575e5832c26532db241cce0fe8a74eaf01a43ae2fff294b666e1461
3
+ metadata.gz: 444c32b0586f427d677d4c6adc09d9f0843044e17bdca20bcf9743436b61b925
4
+ data.tar.gz: 40cc9ba8569e33ce34aab0f77d53e56fed7bbae7d5229fb01619d3850b74115a
5
5
  SHA512:
6
- metadata.gz: d753b2af4c9ce85474b0a1bb66d35d0b0ae5e6aa1601dcd81484571155beae2daae314a545122b39f6928e5c97aadd4c60d7221a29fb8563d5feb7b578c8665a
7
- data.tar.gz: bc58050fe555a8b8af015dc5efa50716168b642dfb4fe3b682edc8847aefdacefef5d0b3bef581169750ab2efcedded9c66880aec29683cce77a179d16e11d9f
6
+ metadata.gz: 9afca82efd4a0a3da21f403d1a2108ef6ef97d742874f9190688f4eec4e51c8bfed4a9a4cdeca469b1f2dc5e5472182f72ecccf94d14466ff7bf79b447414ea8
7
+ data.tar.gz: adf058a7d49f3b966c8e7e21e5670c8017f02e37606a380809f035ce1d49060059c847c03e5559ec43f96bd77dfccfce0fd2900c7707e909132977bf79df5c03
data/README.md CHANGED
@@ -1,126 +1,183 @@
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. 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!
3
+ [English](#english) | [Português](#português)
4
+
5
+ # English
6
+
7
+ **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!
4
8
 
5
9
  ## Installation
6
10
 
7
11
  Install the CLAISS gem by running the following command in your terminal:
8
12
 
9
- ```sh
13
+ ´´´sh
10
14
  $ gem install claiss
11
- ```
15
+ ´´´
12
16
 
13
17
  ## Usage
14
18
 
19
+ ### Version
20
+
21
+ To check the CLAISS version:
22
+
23
+ ´´´sh
24
+ $ claiss version
25
+ ´´´
26
+
27
+ or use the shortcuts:
28
+
29
+ ´´´sh
30
+ $ claiss v
31
+ $ claiss -v
32
+ $ claiss --version
33
+ ´´´
34
+
15
35
  ### Refactor
16
36
 
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".
37
+ 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.
18
38
 
19
39
  **Note:** The `refactor` command ignores the `.git/` and `node_modules/` directories to avoid modifying critical or third-party files.
20
40
 
21
41
  Basic usage:
22
42
 
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)
43
+ ´´´sh
44
+ $ claiss refactor <project_path> <json_file>
45
+ ´´´
30
46
 
31
- Examples:
47
+ Example:
32
48
 
33
- ```sh
34
- $ claiss refactor path/to/project my_project
35
- $ claiss refactor path/to/project my_project --destination path/to/output
36
- ```
49
+ ´´´sh
50
+ $ claiss refactor llama_index laiss_labs.json
51
+ ´´´
37
52
 
38
53
  #### Using a JSON Dictionary
39
54
 
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.
55
+ 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.
41
56
 
42
- The JSON file should be placed in the `~/.claiss/` directory by default.
57
+ Example `laiss_labs.json`:
43
58
 
44
- Example `~/.claiss/my_project.json`:
45
-
46
- ```json
59
+ ´´´json
47
60
  {
48
- "old_term": "new_term",
49
- "OldClassName": "NewClassName",
50
- "OLD_CONSTANT": "NEW_CONSTANT"
61
+ "system pro": "system b2b",
62
+ "System Pro": "System B2b",
63
+ "System": "Laiss",
64
+ "system": "laiss"
51
65
  }
52
- ```
66
+ ´´´
53
67
 
54
- #### New Features and Improvements
68
+ **Important:** After refactoring, any empty directories left behind will be automatically removed to keep your project structure clean.
55
69
 
56
- 1. **Progress Bar**: The refactoring process now displays a progress bar, giving you a visual indication of the operation's status.
70
+ ### Fix Ruby Permissions
57
71
 
58
- 2. **Parallel Processing**: Large projects are now processed using parallel execution, significantly improving performance on multi-core systems.
72
+ The `fix_ruby_permissions` command adjusts file permissions for a Ruby or Rails project.
59
73
 
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.
74
+ ´´´sh
75
+ $ claiss fix_ruby_permissions <project_path>
76
+ ´´´
61
77
 
62
- 4. **Truncated Logging**: Log messages now show truncated file paths for improved readability, especially in projects with deep directory structures.
78
+ ## Future Features
63
79
 
64
- 5. **Automatic Cleanup**: After refactoring, any empty directories left behind are automatically removed to keep your project structure clean.
80
+ We are continuously working to improve CLAISS and add new functionalities. Stay tuned for updates!
65
81
 
66
- ### Fix Ruby Permissions
82
+ ## Contributing
67
83
 
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.
84
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/JulioPapel/claiss](https://github.com/JulioPapel/claiss).
69
85
 
70
- ```sh
71
- $ claiss fix_ruby_permissions [path]
72
- ```
86
+ ## License
73
87
 
74
- - `[path]`: Path to the Ruby project (optional, default: current directory)
88
+ This gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
75
89
 
76
- Example:
90
+ ## Author
77
91
 
78
- ```sh
79
- $ claiss fix_ruby_permissions
80
- $ claiss fix_ruby_permissions path/to/ruby/project
81
- ```
92
+ Júlio Papel
82
93
 
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.
94
+ ---
84
95
 
85
- ### Generate JSON
96
+ # Português
86
97
 
87
- The `generate_json` command helps create a new JSON file with an empty key-value pair for refactoring:
98
+ **CLAISS** é uma aplicação CLI e caixa de ferramentas em Ruby projetada para gerenciar aplicações e implantações CLAISS Refactored. Por favor, note que algumas funcionalidades podem ter compatibilidade limitada dependendo do ambiente. Use com cuidado!
88
99
 
89
- ```sh
90
- $ claiss generate_json [options]
91
- ```
100
+ ## Instalação
92
101
 
93
- Options:
94
- - `--output`: Name of the output JSON file (default: rules)
95
- - `--path`: Path to save the JSON file (default: ~/.claiss/)
102
+ Instale a gem CLAISS executando o seguinte comando no seu terminal:
96
103
 
97
- Examples:
104
+ ´´´sh
105
+ $ gem install claiss
106
+ ´´´
98
107
 
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
- ```
108
+ ## Uso
104
109
 
105
- This command generates a new JSON file that can be used as a template for creating refactoring rules.
110
+ ### Versão
106
111
 
107
- ## Upcoming Features
112
+ Para verificar a versão do CLAISS:
108
113
 
109
- We are continuously working to improve CLAISS and add new functionalities. Some planned features include:
114
+ ´´´sh
115
+ $ claiss version
116
+ ´´´
110
117
 
111
- 1. Enhanced error handling and reporting
112
- 2. Support for more complex refactoring rules
118
+ ou use os atalhos:
113
119
 
114
- Stay tuned for updates!
120
+ ´´´sh
121
+ $ claiss v
122
+ $ claiss -v
123
+ $ claiss --version
124
+ ´´´
115
125
 
116
- ## Contributing
126
+ ### Refactor
117
127
 
118
- Bug reports and pull requests are welcome on GitHub at [https://github.com/JulioPapel/claiss](https://github.com/JulioPapel/claiss).
128
+ O comando `refactor` permite que você renomeie e substitua termos de texto dentro de arquivos e nomes de arquivos em um diretório especificado. Este comando irá refatorar todas as ocorrências exatas dos termos especificados, incluindo nomes de arquivos.
119
129
 
120
- ## License
130
+ **Nota:** O comando `refactor` ignora os diretórios `.git/` e `node_modules/` para evitar modificar arquivos críticos ou de terceiros.
121
131
 
122
- This gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
132
+ Uso básico:
123
133
 
124
- ## Author
134
+ ´´´sh
135
+ $ claiss refactor <caminho_do_projeto> <arquivo_json>
136
+ ´´´
137
+
138
+ Exemplo:
139
+
140
+ ´´´sh
141
+ $ claiss refactor llama_index laiss_labs.json
142
+ ´´´
143
+
144
+ #### Usando um Dicionário JSON
145
+
146
+ Você pode criar um arquivo JSON que especifica os termos que deseja refatorar. Este arquivo JSON deve ser estruturado como um objeto de pares chave-valor simples, onde cada chave é o termo a ser substituído e o valor é o termo de substituição.
147
+
148
+ Exemplo `laiss_labs.json`:
149
+
150
+ ´´´json
151
+ {
152
+ "system pro": "system b2b",
153
+ "System Pro": "System B2b",
154
+ "System": "Laiss",
155
+ "system": "laiss"
156
+ }
157
+ ´´´
158
+
159
+ **Importante:** Após a refatoração, quaisquer diretórios vazios deixados para trás serão automaticamente removidos para manter a estrutura do seu projeto limpa.
160
+
161
+ ### Fix Ruby Permissions
162
+
163
+ O comando `fix_ruby_permissions` ajusta as permissões de arquivos para um projeto Ruby ou Rails.
164
+
165
+ ´´´sh
166
+ $ claiss fix_ruby_permissions <caminho_do_projeto>
167
+ ´´´
168
+
169
+ ## Recursos Futuros
170
+
171
+ Estamos continuamente trabalhando para melhorar o CLAISS e adicionar novas funcionalidades. Fique atento para atualizações!
172
+
173
+ ## Contribuindo
174
+
175
+ Relatórios de bugs e pull requests são bem-vindos no GitHub em [https://github.com/JulioPapel/claiss](https://github.com/JulioPapel/claiss).
176
+
177
+ ## Licença
178
+
179
+ Esta gem está disponível como código aberto sob os termos da [Licença MIT](https://opensource.org/licenses/MIT).
180
+
181
+ ## Autor
125
182
 
126
183
  Júlio Papel
@@ -1,10 +1,9 @@
1
1
  module CLAISS
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
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
@@ -1,3 +1,3 @@
1
1
  module CLAISS
2
- VERSION = "1.1.3"
3
- end
2
+ VERSION = "1.1.4"
3
+ end
data/lib/claiss.rb CHANGED
@@ -1,21 +1,9 @@
1
- require "dry/cli"
2
1
  require "bundler/setup"
3
- require 'pathname'
4
- require 'json'
2
+ require "dry/cli"
5
3
  require "fileutils"
6
- require 'logger'
7
- require 'parallel'
8
- require 'ruby-progressbar'
4
+ require "json"
9
5
 
10
- # CLAISS module provides CLI commands for refactoring and managing Ruby projects
11
6
  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
-
19
7
  class Error < StandardError; end
20
8
 
21
9
  class Version < Dry::CLI::Command
@@ -27,230 +15,130 @@ module CLAISS
27
15
  end
28
16
 
29
17
  class Refactor < Dry::CLI::Command
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, **)
42
- origin_path = File.expand_path(path)
43
- destination_path = destination ? File.expand_path(destination) : nil
44
-
45
- json_file = File.join(DEFAULT_JSON_DIR, "#{rules}.json")
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, **)
46
23
  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
24
+ origin_path = File.expand_path(path)
54
25
 
55
- private
26
+ process_files(origin_path, dict)
27
+ remove_empty_directories(origin_path)
56
28
 
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
29
+ puts "Done! Files have been refactored in place."
61
30
  end
62
31
 
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
32
+ private
76
33
 
77
34
  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")
35
+ if json_file
36
+ # Procura o arquivo no diretório atual e no ~/.claiss
37
+ possible_paths = [
38
+ json_file,
39
+ File.expand_path(json_file),
40
+ File.expand_path("~/.claiss/#{json_file}"),
41
+ ]
42
+
43
+ found_file = possible_paths.find { |path| File.exist?(path) }
44
+
45
+ if found_file
46
+ begin
47
+ dict = JSON.parse(File.read(found_file))
48
+ puts "Oba! Encontrei o arquivo em: #{found_file}"
49
+ return dict
50
+ rescue JSON::ParserError => e
51
+ puts "Ops! O arquivo JSON não está no formato correto. Erro: #{e.message}"
52
+ end
95
53
  else
96
- LOGGER.info("Loaded dictionary with #{parsed_content.size} key-value pairs")
54
+ puts "Hmm, não consegui encontrar o arquivo. Procurei nesses lugares:"
55
+ possible_paths.each { |path| puts " - #{path}" }
97
56
  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
57
+
58
+ puts "Vamos usar o dicionário interativo em vez disso, tá bom?"
59
+ interactive_dictionary
60
+ else
61
+ interactive_dictionary
110
62
  end
111
63
  end
112
64
 
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)
65
+ def interactive_dictionary
66
+ dict = {}
67
+ loop do
68
+ print "Term to search (or press Enter to finish): "
69
+ search = STDIN.gets.chomp
70
+ break if search.empty?
71
+ print "Term to replace: "
72
+ replace = STDIN.gets.chomp
73
+ dict[search] = replace
118
74
  end
75
+ dict
119
76
  end
120
77
 
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: '')
78
+ def process_files(origin_path, dict)
79
+ Dir.glob(File.join(origin_path, "**", "*"), File::FNM_DOTMATCH).each do |file_name|
80
+ next if File.directory?(file_name)
81
+ next if file_name.include?(".git/") || file_name.include?("node_modules/") # Ignore .git and node_modules folders
82
+ process_file(file_name, dict)
134
83
  end
135
-
136
- text_changed = false
84
+ end
85
+
86
+ def process_file(file_name, dict)
87
+ text = File.read(file_name)
88
+
137
89
  dict.each do |search, replace|
138
- if text.gsub!(/#{Regexp.escape(search)}/, replace)
139
- text_changed = true
140
- end
90
+ text.gsub!(search, replace)
141
91
  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)
92
+
93
+ new_file_name = file_name.dup
94
+
95
+ dict.each do |search, replace|
96
+ new_file_name.gsub!(search, replace)
150
97
  end
151
-
98
+
99
+ # Create the directory for the new file if it doesn't exist
152
100
  new_dir = File.dirname(new_file_name)
153
101
  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
172
102
 
173
- def replace_in_path(path, dict)
174
- dict.reduce(path) do |s, (search, replace)|
175
- s.gsub(/#{Regexp.escape(search)}/, replace)
103
+ # Write the changes to the new file name
104
+ File.write(new_file_name, text)
105
+
106
+ # If the filename has changed, delete the original file
107
+ unless new_file_name == file_name
108
+ File.delete(file_name) # Delete the original file
109
+ puts "File renamed from #{file_name} to #{new_file_name}, OK"
110
+ else
111
+ puts "File: #{file_name}, OK"
176
112
  end
177
113
  end
178
114
 
179
- def remove_empty_directories(path)
180
- Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH).reverse_each do |dir_name|
115
+ def remove_empty_directories(origin_path)
116
+ Dir.glob(File.join(origin_path, "**", "*"), File::FNM_DOTMATCH).reverse_each do |dir_name|
181
117
  next unless File.directory?(dir_name)
182
- next if IGNORED_DIRECTORIES.any? { |ignored_dir| dir_name.include?(ignored_dir) }
118
+ next if dir_name.include?(".git/") || dir_name.include?("node_modules/") # Ignorar pastas .git e node_modules
119
+ next if dir_name == "." || dir_name == ".." # Ignorar diretórios especiais . e ..
183
120
  if (Dir.entries(dir_name) - %w[. ..]).empty?
184
- Dir.rmdir(dir_name)
185
- puts "Removed empty directory: #{dir_name}"
121
+ begin
122
+ Dir.rmdir(dir_name)
123
+ puts "Diretório vazio removido: #{dir_name}"
124
+ rescue Errno::ENOTEMPTY, Errno::EINVAL => e
125
+ puts "Não foi possível remover o diretório: #{dir_name}. Erro: #{e.message}"
126
+ end
186
127
  end
187
128
  end
188
129
  end
189
130
  end
190
131
 
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
238
-
239
132
  class FixRubyPermissions < Dry::CLI::Command
240
133
  desc "Fix permissions for a Ruby project"
134
+ argument :path, required: true, desc: "The path of your Ruby project"
241
135
 
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: ".", **)
136
+ def call(path: nil, **)
137
+ path ||= Dir.getwd
250
138
  path = File.expand_path(path)
251
139
 
252
- Dir.glob(File.join(path, '**', '*'), File::FNM_DOTMATCH) do |item|
253
- next if item == '.' || item == '..'
140
+ Dir.glob(File.join(path, "**", "*"), File::FNM_DOTMATCH) do |item|
141
+ next if item == "." || item == ".."
254
142
  next if item.include?("node_modules/") # Ignore node_modules folder
255
143
  if File.directory?(item)
256
144
  File.chmod(0755, item)
@@ -259,25 +147,28 @@ module CLAISS
259
147
  end
260
148
  end
261
149
 
262
- executable_files = ['bundle', 'rails', 'rake', 'spring']
150
+ executable_files = ["bundle", "rails", "rake", "spring"]
263
151
  executable_files.each do |file|
264
- file_path = File.join(path, 'bin', file)
265
- if File.exist?(file_path)
266
- File.chmod(0755, file_path)
267
- puts "Made #{file_path} executable"
268
- end
152
+ file_path = File.join(path, "bin", file)
153
+ File.chmod(0755, file_path) if File.exist?(file_path)
269
154
  end
270
155
 
271
- puts "Permissions fixed for Ruby project at #{path}"
156
+ puts "Permissions fixed for #{path}"
272
157
  end
273
158
 
274
159
  private
275
160
 
276
161
  def fix_file_permissions(file)
277
- if File.extname(file) == '.rb' || file.include?('/bin/')
278
- File.chmod(0755, file)
162
+ current_permissions = File.stat(file).mode
163
+
164
+ if current_permissions & 0o100 != 0 # Check if the owner has execute permission
165
+ File.chmod(0755, file) # Maintain execution permission for owner, group, and others
166
+ elsif current_permissions & 0o010 != 0 # Check if the group has execute permission
167
+ File.chmod(0755, file) # Maintain execution permission for group and others
168
+ elsif current_permissions & 0o001 != 0 # Check if others have execute permission
169
+ File.chmod(0755, file) # Maintain execution permission for others
279
170
  else
280
- File.chmod(0644, file)
171
+ File.chmod(0644, file) # Otherwise, apply standard read/write permissions
281
172
  end
282
173
  end
283
174
  end
@@ -285,4 +176,4 @@ end
285
176
 
286
177
  require_relative "claiss/version"
287
178
  require_relative "claiss/commands"
288
- require_relative "claiss/cli"
179
+ require_relative "claiss/cli"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claiss
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Júlio Papel
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-11-07 00:00:00.000000000 Z
10
+ date: 2025-02-08 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: dry-cli
@@ -52,34 +51,6 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  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
83
54
  description: CLI application Toolbox to manage CLAISS AI applications and deployments.
84
55
  Some features may not work in all environments. Use with caution!
85
56
  email:
@@ -102,7 +73,6 @@ licenses:
102
73
  metadata:
103
74
  source_code_uri: https://github.com/JulioPapel/claiss.git
104
75
  documentation_uri: https://github.com/JulioPapel/claiss/blob/main/readme.md
105
- post_install_message:
106
76
  rdoc_options: []
107
77
  require_paths:
108
78
  - lib
@@ -117,8 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
87
  - !ruby/object:Gem::Version
118
88
  version: '0'
119
89
  requirements: []
120
- rubygems_version: 3.1.2
121
- signing_key:
90
+ rubygems_version: 3.6.3
122
91
  specification_version: 4
123
92
  summary: CLAISS AI CLI application Toolbox
124
93
  test_files: []