readlines 1.0

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.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/gem-push.yml +45 -0
  3. data/.gitignore +46 -0
  4. data/.rspec +0 -0
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +0 -0
  7. data/Gemfile +5 -0
  8. data/Gemfile.lock +30 -0
  9. data/LICENSE +21 -0
  10. data/README.md +349 -0
  11. data/Rakefile +9 -0
  12. data/examples/example1.rb +13 -0
  13. data/examples/example10.rb +13 -0
  14. data/examples/example11.rb +13 -0
  15. data/examples/example12.rb +13 -0
  16. data/examples/example13.rb +13 -0
  17. data/examples/example14.rb +13 -0
  18. data/examples/example15.rb +13 -0
  19. data/examples/example16.rb +13 -0
  20. data/examples/example17.rb +13 -0
  21. data/examples/example18.rb +13 -0
  22. data/examples/example19.rb +13 -0
  23. data/examples/example2.rb +13 -0
  24. data/examples/example20.rb +13 -0
  25. data/examples/example21.rb +13 -0
  26. data/examples/example22.rb +13 -0
  27. data/examples/example23.rb +13 -0
  28. data/examples/example24.rb +13 -0
  29. data/examples/example25.rb +13 -0
  30. data/examples/example26.rb +13 -0
  31. data/examples/example27.rb +13 -0
  32. data/examples/example28.rb +13 -0
  33. data/examples/example29.rb +13 -0
  34. data/examples/example3.rb +13 -0
  35. data/examples/example30.rb +13 -0
  36. data/examples/example31.rb +13 -0
  37. data/examples/example32.rb +13 -0
  38. data/examples/example33.rb +13 -0
  39. data/examples/example34.rb +13 -0
  40. data/examples/example35.rb +13 -0
  41. data/examples/example36.rb +13 -0
  42. data/examples/example37.rb +13 -0
  43. data/examples/example38.rb +13 -0
  44. data/examples/example4.rb +13 -0
  45. data/examples/example5.rb +13 -0
  46. data/examples/example6.rb +13 -0
  47. data/examples/example7.rb +13 -0
  48. data/examples/example8.rb +13 -0
  49. data/examples/example9.rb +13 -0
  50. data/lib/read.rb +9 -0
  51. data/lib/readlines/read.rb +263 -0
  52. data/lib/readlines/readlines/check.rb +16 -0
  53. data/lib/readlines/readlines/content.rb +45 -0
  54. data/lib/readlines/readlines/convert.rb +43 -0
  55. data/lib/readlines/readlines/count.rb +58 -0
  56. data/lib/readlines/readlines/delete.rb +89 -0
  57. data/lib/readlines/readlines/error.rb +13 -0
  58. data/lib/readlines/readlines/file.rb +20 -0
  59. data/lib/readlines/readlines/info.rb +48 -0
  60. data/lib/readlines/readlines/merge.rb +38 -0
  61. data/lib/readlines/readlines/pattern.rb +22 -0
  62. data/lib/readlines/readlines/replace.rb +50 -0
  63. data/lib/readlines/readlines/search.rb +62 -0
  64. data/lib/readlines/readlines/sort.rb +18 -0
  65. data/lib/readlines/readlines/split.rb +79 -0
  66. data/lib/readlines/readlines/version.rb +7 -0
  67. data/readlines.gemspec +25 -0
  68. metadata +182 -0
@@ -0,0 +1,263 @@
1
+ # readlines/lib/readlines/read.rb
2
+ require_relative 'readlines/check'
3
+ require_relative 'readlines/content'
4
+ require_relative 'readlines/convert'
5
+ require_relative 'readlines/count'
6
+ require_relative 'readlines/delete'
7
+ require_relative 'readlines/error'
8
+ require_relative 'readlines/file'
9
+ require_relative 'readlines/info'
10
+ require_relative 'readlines/merge'
11
+ require_relative 'readlines/pattern'
12
+ require_relative 'readlines/replace'
13
+ require_relative 'readlines/search'
14
+ require_relative 'readlines/sort'
15
+ require_relative 'readlines/split'
16
+ require 'fileutils'
17
+ require 'json'
18
+
19
+ module Readlines
20
+ class ReadDuc
21
+ include Readlines::Count
22
+ include Readlines::Delete
23
+ include Readlines::Convert
24
+ include Readlines::Search
25
+ include Readlines::Replace
26
+ include Readlines::File
27
+ include Readlines::Merge
28
+ include Readlines::Info
29
+ include Readlines::Pattern
30
+ include Readlines::Sort
31
+ include Readlines::Split
32
+ include Readlines::Content
33
+ attr_reader :file_path
34
+
35
+ def initialize(file_path, count: nil, split: nil)
36
+ raise Readlines::Error::MissingFilePathError, 'You should provide a file path, e.g., "/path/to/file.txt"' if file_path.nil? || file_path.empty?
37
+
38
+ @file_path = file_path
39
+ @count_keyword = count
40
+ @split_delimiter = split
41
+ end
42
+
43
+ include Readlines::Count
44
+ include Readlines::Delete
45
+ include Readlines::Convert
46
+ include Readlines::Search
47
+ include Readlines::Replace
48
+ include Readlines::File
49
+ include Readlines::Merge
50
+ include Readlines::Info
51
+ include Readlines::Pattern
52
+ include Readlines::Sort
53
+ include Readlines::Split
54
+ include Readlines::Content
55
+
56
+ # Count operations
57
+ def line_count
58
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
59
+ line_count_now()
60
+ end
61
+
62
+ def character_count(line_specific: false)
63
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
64
+ character_count_now(line_specific: line_specific)
65
+ end
66
+
67
+ def word_count(line_specific: false)
68
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
69
+ word_count_now(line_specific: line_specific)
70
+ end
71
+
72
+ # Read operations
73
+ def read_lines
74
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
75
+ read_lines_now()
76
+ end
77
+
78
+ def info
79
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
80
+ info_now()
81
+ end
82
+
83
+ # Search operations
84
+ def search_about(value, show_lines: false)
85
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
86
+ search_about_now(value, show_lines: show_lines)
87
+ end
88
+
89
+ def search_multiple_patterns(patterns)
90
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
91
+ search_multiple_patterns_now(patterns)
92
+ end
93
+
94
+ def search_in_range(start_line, end_line, pattern)
95
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
96
+ search_in_range_now(start_line, end_line, pattern)
97
+ end
98
+
99
+ def search_logical_patterns(patterns, operator)
100
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
101
+ raise ArgumentError, "Invalid logical operator: #{operator}" unless %w[AND OR].include?(operator)
102
+ search_logical_patterns_now(patterns, operator)
103
+ end
104
+
105
+ # Replace operations
106
+ def replace(pattern, replacement)
107
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
108
+ replace_now(pattern, replacement)
109
+ end
110
+
111
+ def replace_special_characters(replacement)
112
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
113
+ replace_special_characters_now(replacement)
114
+ end
115
+
116
+ def replace_multiple_patterns(pattern_replacement_hash)
117
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
118
+ replace_multiple_patterns_now(pattern_replacement_hash)
119
+ end
120
+
121
+ def replace_csv_value(column_index, old_value, new_value)
122
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
123
+ replace_csv_value_now(column_index, old_value, new_value)
124
+ end
125
+
126
+ # Delete operations
127
+ def delete_empty_lines
128
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
129
+ delete_empty_lines_now()
130
+ end
131
+
132
+ def delete_unwanted_characters(characters)
133
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
134
+ delete_unwanted_characters_now(characters)
135
+ end
136
+
137
+ def delete_lines(line_numbers, delete_space: false)
138
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
139
+ delete_lines_now(line_numbers, delete_space: delete_space)
140
+ end
141
+
142
+ def delete_duplicate_lines
143
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
144
+ delete_duplicate_lines_now()
145
+ end
146
+
147
+ def delete_csv_columns(column_indices)
148
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
149
+ delete_csv_columns_now(column_indices)
150
+ end
151
+
152
+ def delete_right_left_separator(separator, delete_right: false, delete_left: false, keep_separator: false)
153
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
154
+ delete_right_left_separator_now(separator, delete_right: delete_right, delete_left: delete_left, keep_separator: keep_separator)
155
+ end
156
+
157
+ # Sort operations
158
+ def sort_alphabetically
159
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
160
+ sort_alphabetically_now()
161
+ end
162
+
163
+ # Split operations
164
+ def split_file(num_parts)
165
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
166
+ raise ArgumentError, "Number of parts must be greater than 0" if num_parts <= 0
167
+ split_file_now(num_parts)
168
+ end
169
+
170
+ def split_file_by_size(part_size)
171
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
172
+ raise ArgumentError, "Part size must be greater than 0" if part_size <= 0
173
+ split_file_by_size_now(part_size)
174
+ end
175
+
176
+ def split_by_delimiter(delimiter)
177
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
178
+ split_by_delimiter_now(delimiter)
179
+ end
180
+
181
+ def split_by_pattern(pattern)
182
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
183
+ split_by_pattern_now(pattern)
184
+ end
185
+
186
+ # Merge operations
187
+ def merge_files(file_paths)
188
+ raise ArgumentError, "File paths array is empty" if file_paths.empty?
189
+ merge_files_now(file_paths)
190
+ end
191
+
192
+ def merge_files_with_specific_line(file_paths, separator: "\n")
193
+ raise ArgumentError, "File paths array is empty" if file_paths.empty?
194
+ merge_files_with_specific_line_now(file_paths, separator: separator)
195
+ end
196
+
197
+ # Convert operations
198
+ def convert_encoding(from_encoding, to_encoding)
199
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
200
+ convert_encoding_now(from_encoding, to_encoding)
201
+ end
202
+
203
+ def convert_to_format(format)
204
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
205
+ convert_to_format_now(format)
206
+ end
207
+
208
+ def convert_to_array
209
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
210
+ convert_to_array_now()
211
+ end
212
+
213
+ # File operations
214
+ def file_size(unit = nil)
215
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
216
+ file_size_now(unit)
217
+ end
218
+
219
+ def file_statistics
220
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
221
+ file_statistics_now()
222
+ end
223
+
224
+ # Pattern operations
225
+ def pattern_exists?(pattern)
226
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
227
+ pattern_exists_now?(pattern)
228
+ end
229
+
230
+ def extract_patterns(patterns)
231
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
232
+ extract_patterns_now(patterns)
233
+ end
234
+
235
+ # Content operations
236
+ def reverse_content
237
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
238
+ reverse_content_now()
239
+ end
240
+
241
+ def validate_content(rules)
242
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
243
+ validate_content_now(rules)
244
+ end
245
+
246
+ # Spelling operations
247
+ def check_spelling(dictionary)
248
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
249
+ check_spelling_now(dictionary)
250
+ end
251
+
252
+ # Encryption operations
253
+ def encrypt_content(key)
254
+ raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
255
+ encrypt_content_now(key)
256
+ end
257
+
258
+ def decrypt_content(key, encrypted_file_path)
259
+ raise Readlines::Error::NotFoundError, "File not found: #{encrypted_file_path}" unless ::File.exist?(encrypted_file_path)
260
+ decrypt_content_now(key, encrypted_file_path)
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,16 @@
1
+ # readlines/lib/readlines/readlines/check.rb
2
+ # Check the spelling of words in the file against a dictionary
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Check
8
+ def check_spelling_now(dictionary)
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+
11
+ content = ::File.read(@file_path)
12
+ misspelled_words = content.scan(/\b\w+\b/).reject { |word| dictionary.include?(word.downcase) }
13
+ misspelled_words.uniq
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ # readlines/lib/readlines/readlines/content.rb
2
+ require 'fileutils'
3
+ require 'json'
4
+
5
+ module Readlines
6
+ module Content
7
+ def reverse_content_now
8
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
9
+
10
+ content = ::File.readlines(@file_path)
11
+ reversed_content = content.reverse.join
12
+ ::File.write(@file_path, reversed_content)
13
+ reversed_content
14
+ end
15
+
16
+ def validate_content_now(rules)
17
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
18
+
19
+ content = ::File.readlines(@file_path)
20
+ content.all? do |line|
21
+ rules.all? { |rule| line.match?(rule) }
22
+ end
23
+ end
24
+
25
+ def encrypt_content_now(key)
26
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
27
+
28
+ content = ::File.read(@file_path)
29
+ encrypted_content = content.chars.map { |char| (char.ord + key).chr }.join
30
+ encrypted_file_name = "#{@file_path}.encrypted"
31
+ ::File.write(encrypted_file_name, encrypted_content)
32
+ encrypted_file_name
33
+ end
34
+
35
+ def decrypt_content_now(key, encrypted_file_path)
36
+ raise Readlines::NotFoundError, "File not found: #{encrypted_file_path}" unless ::File.exist?(encrypted_file_path)
37
+
38
+ encrypted_content = ::File.read(encrypted_file_path)
39
+ decrypted_content = encrypted_content.chars.map { |char| (char.ord - key).chr }.join
40
+ decrypted_file_name = encrypted_file_path.sub('.encrypted', '')
41
+ ::File.write(decrypted_file_name, decrypted_content)
42
+ decrypted_file_name
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,43 @@
1
+ # readlines/lib/readlines/readlines/convert.rb
2
+ # Convert the encoding of the file
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Convert
8
+ def convert_encoding_now(from_encoding, to_encoding)
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+
11
+ content = ::File.read(@file_path, encoding: from_encoding)
12
+ ::File.write(@file_path, content.encode(to_encoding))
13
+ end
14
+
15
+ def convert_to_format_now(format)
16
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
17
+
18
+ content = ::File.read(@file_path)
19
+
20
+ case format.downcase
21
+ when 'txt'
22
+ when 'csv'
23
+ content = content.lines.map { |line| line.strip.split(',') }.map { |fields| fields.join(',') }.join("\n")
24
+ when 'json'
25
+ data = content.lines.map { |line| line.strip.split(',') }
26
+ content = JSON.pretty_generate(data)
27
+ else
28
+ raise ArgumentError, "Unsupported format: #{format}. Supported formats are .txt, .csv, and .json."
29
+ end
30
+
31
+ converted_file_path = "#{::File.basename(@file_path, ::File.extname(@file_path))}-copy.#{format.downcase.delete('.')}"
32
+ ::File.write(converted_file_path, content)
33
+ converted_file_path
34
+ end
35
+
36
+ def convert_to_array_now
37
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
38
+
39
+ content = ::File.readlines(@file_path)
40
+ content.map(&:chomp)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ # readlines/lib/readlines/readlines/count.rb
2
+ # Count the number of lines in the file based on the specified keyword and delimiter
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Count
8
+ def line_count_now
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+ count = 0
11
+ content = ::File.read(@file_path)
12
+ if @split_delimiter
13
+ sections = content.split(@split_delimiter)
14
+ sections.each do |section|
15
+ count += 1 if @count_keyword && section.include?(@count_keyword)
16
+ end
17
+ else
18
+ content.each_line do |line|
19
+ count += 1 if @count_keyword.nil? || line.include?(@count_keyword)
20
+ end
21
+ end
22
+ count
23
+ end
24
+
25
+ # Read the entire content of the file
26
+ def read_lines_now
27
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
28
+ content = ::File.read(@file_path)
29
+ content
30
+ end
31
+
32
+ # Count the number of characters in the file or a specific line
33
+ def character_count_now(line_specific: false)
34
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
35
+
36
+ content = ::File.read(@file_path)
37
+ if line_specific.is_a?(Integer)
38
+ line = content.lines[line_specific - 1]
39
+ line.length
40
+ else
41
+ content.length
42
+ end
43
+ end
44
+
45
+ # Count the number of words in the file or a specific line
46
+ def word_count_now(line_specific: false)
47
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
48
+
49
+ content = ::File.read(@file_path)
50
+ if line_specific.is_a?(Integer)
51
+ line = content.lines[line_specific - 1]
52
+ line.split.length
53
+ else
54
+ content.split.length
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,89 @@
1
+ # readlines/lib/readlines/readlines/delete.rb
2
+ # Delete empty lines from the file
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Delete
8
+ def delete_empty_lines_now
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+ content = ::File.read(@file_path)
11
+ updated_content = content.lines.reject { |line| line.strip.empty? }.join
12
+ ::File.write(@file_path, updated_content)
13
+ updated_content
14
+ end
15
+
16
+ # Delete unwanted characters from the file
17
+ def delete_unwanted_characters_now(characters)
18
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
19
+
20
+ content = ::File.read(@file_path)
21
+ updated_content = content.gsub(/[#{Regexp.escape(characters)}]/, '')
22
+ ::File.write(@file_path, updated_content)
23
+ updated_content
24
+ end
25
+
26
+ # Delete specific lines from the file and optionally remove empty lines
27
+ def delete_lines_now(line_numbers, delete_space: false)
28
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
29
+
30
+ content = ::File.readlines(@file_path)
31
+ updated_content = content.reject.with_index { |_, index| line_numbers.include?(index + 1) }.join
32
+
33
+ ::File.write(@file_path, updated_content)
34
+
35
+ if delete_space
36
+ remove_empty_lines
37
+ end
38
+
39
+ updated_content
40
+ end
41
+
42
+ # Delete duplicate lines from the file
43
+ def delete_duplicate_lines_now
44
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
45
+
46
+ content = ::File.readlines(@file_path)
47
+ unique_content = content.uniq.join
48
+ ::File.write(@file_path, unique_content)
49
+ unique_content
50
+ end
51
+
52
+ # Delete specific columns from a CSV file
53
+ def delete_csv_columns_now(column_indices)
54
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
55
+
56
+ content = ::File.readlines(@file_path)
57
+ updated_content = content.map do |line|
58
+ values = line.chomp.split(',')
59
+ column_indices.sort.reverse.each { |index| values.delete_at(index) }
60
+ values.join(',')
61
+ end.join("\n")
62
+ ::File.write(@file_path, updated_content)
63
+ updated_content
64
+ end
65
+
66
+ def delete_right_left_separator_now(separator, delete_right: false, delete_left: false, keep_separator: false)
67
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
68
+
69
+ result = ::File.readlines(@file_path).map do |line|
70
+ line.strip!
71
+ next if line.empty?
72
+
73
+ parts = line.split(separator, 2)
74
+ separator_keep = keep_separator ? separator : ''
75
+
76
+ if delete_right && parts.size > 1
77
+ parts.first + separator_keep
78
+ elsif delete_left && parts.size > 1
79
+ separator_keep + parts.last
80
+ else
81
+ line
82
+ end
83
+ end.compact
84
+
85
+ ::File.write(@file_path, result.join("\n"))
86
+ result
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,13 @@
1
+ # readlines/lib/readlines/readlines/error.rb
2
+
3
+ module Readlines
4
+ module Error
5
+ class Error < StandardError; end
6
+
7
+ class NotFoundError < Error; end
8
+
9
+ class MissingFilePathError < Error; end
10
+
11
+ class InvalidUnitError < StandardError; end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ # readlines/lib/readlines/readlines/file.rb
2
+ # Get statistics about the file
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module File
8
+ def file_statistics_now
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+
11
+ content = ::File.read(@file_path)
12
+ {
13
+ lines: content.lines.count,
14
+ characters: content.length,
15
+ words: content.split.length
16
+ }
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,48 @@
1
+ # readlines/lib/readlines/readlines/info.rb
2
+ # Get the file size in the specified unit
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Info
8
+ def file_size_now(unit = nil)
9
+ size = ::File.size(@file_path)
10
+
11
+ if unit.nil?
12
+ size
13
+ else
14
+ case unit
15
+ when :gigabytes, :g
16
+ size / (1024.0 * 1024.0 * 1024.0)
17
+ when :megabytes, :m
18
+ size / (1024.0 * 1024.0)
19
+ when :kilobytes, :k
20
+ size / 1024.0
21
+ when :bytes, :b
22
+ size
23
+ else
24
+ raise Readlines::InvalidUnitError, "Invalid unit: #{unit}. Supported units are :gigabytes, :megabytes, :kilobytes, or :bytes."
25
+ end
26
+ end
27
+ end
28
+
29
+ def info_now
30
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
31
+
32
+ file_info = {
33
+ created_at: ::File.birthtime(@file_path),
34
+ modified_at: ::File.mtime(@file_path),
35
+ path: ::File.absolute_path(@file_path),
36
+ size: ::File.size(@file_path),
37
+ name: ::File.basename(@file_path),
38
+ type: ::File.extname(@file_path)
39
+ }
40
+
41
+ if block_given?
42
+ yield file_info
43
+ else
44
+ file_info
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,38 @@
1
+ # readlines/lib/readlines/readlines/merge.rb
2
+ # Merge multiple files into a single file
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Merge
8
+ def merge_files_now(file_paths)
9
+ raise ArgumentError, "File paths array is empty" if file_paths.empty?
10
+
11
+ merged_content = file_paths.map do |file_path|
12
+ raise Readlines::NotFoundError, "File not found: #{file_path}" unless ::File.exist?(file_path)
13
+ ::File.read(file_path)
14
+ end.join
15
+
16
+ file_name = ::File.basename(@file_path, ::File.extname(@file_path))
17
+ merged_file_name = "#{file_name}_merged#{::File.extname(@file_path)}"
18
+ ::File.write(merged_file_name, merged_content)
19
+
20
+ merged_file_name
21
+ end
22
+
23
+ def merge_files_with_specific_line_now(file_paths, separator: "\n")
24
+ raise ArgumentError, "File paths array is empty" if file_paths.empty?
25
+
26
+ merged_content = file_paths.map do |file_path|
27
+ raise Readlines::NotFoundError, "File not found: #{file_path}" unless ::File.exist?(file_path)
28
+ ::File.read(file_path)
29
+ end.join(separator)
30
+
31
+ file_name = ::File.basename(@file_path, ::File.extname(@file_path))
32
+ merged_file_name = "#{file_name}_merged#{::File.extname(@file_path)}"
33
+ ::File.write(merged_file_name, merged_content)
34
+
35
+ merged_file_name
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,22 @@
1
+ # readlines/lib/readlines/readlines/pattern.rb
2
+ # Check if a pattern exists in the file
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module Readlines
7
+ module Pattern
8
+ def pattern_exists_now?(pattern)
9
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
10
+
11
+ content = ::File.read(@file_path)
12
+ content.match?(pattern)
13
+ end
14
+
15
+ def extract_patterns_now(patterns)
16
+ raise Readlines::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
17
+
18
+ content = ::File.read(@file_path)
19
+ patterns.flat_map { |pattern| content.scan(pattern) }
20
+ end
21
+ end
22
+ end