readlines 1.4 → 1.6
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 +4 -4
- data/README.md +187 -259
- data/lib/readlines/read.rb +34 -2
- data/lib/readlines/readlines/error.rb +27 -5
- data/lib/readlines/readlines/filter.rb +46 -0
- metadata +5 -5
- /data/lib/{read.rb → readlines.rb} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 573d78464068c0e851233a9618a588a95eb90faac37369a57bf60b9f304157be
|
4
|
+
data.tar.gz: d717ea49cbb087b333480feb9d842d43a72e2f7da4b82fd4987f27ab83291959
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49315052d03f5102941ff900893e045268522e7d661c6edb1e0d6426cb53bd3b4b8d2a902b9eb6afd5e807b38e32f7fa6cb46adbbe3c8607359c7d5809a841e5
|
7
|
+
data.tar.gz: 191227637e442aa45f2fdd4dc23e239be88ff354a0c24fddf7e3cf38e4d8f38b735f77b9277975186bade948c85952d8f28690d683209907937043b831134bab
|
data/README.md
CHANGED
@@ -5,346 +5,274 @@ Readlines is a powerful and versatile Ruby library for file manipulation and pro
|
|
5
5
|
|
6
6
|
## Features
|
7
7
|
|
8
|
-
- Read the entire file content or specific parts
|
9
|
-
- Search for
|
10
|
-
-
|
11
|
-
- Replace specific patterns
|
12
|
-
- Remove empty lines
|
13
|
-
- Sort
|
14
|
-
- Split
|
15
|
-
- Merge multiple files
|
16
|
-
-
|
17
|
-
- Replace special characters
|
18
|
-
-
|
19
|
-
-
|
20
|
-
-
|
21
|
-
-
|
22
|
-
-
|
23
|
-
-
|
24
|
-
-
|
25
|
-
-
|
26
|
-
-
|
27
|
-
-
|
28
|
-
- Search
|
29
|
-
-
|
30
|
-
-
|
31
|
-
-
|
32
|
-
-
|
33
|
-
- Validate the file contents against a set of rules.
|
34
|
-
- Remove duplicate lines from the file.
|
35
|
-
- Get statistics about the file (number of lines, characters, words).
|
36
|
-
- Search for logical patterns in the file using AND and OR operators.
|
37
|
-
- Split the file based on a specified pattern.
|
38
|
-
- Delete specific columns from a CSV file.
|
39
|
-
- Replace a specific value in a CSV column.
|
40
|
-
- Check for spelling errors in the file using a dictionary.
|
41
|
-
- Encrypt the file contents using a key.
|
42
|
-
- Decrypt the encrypted file contents using a key.
|
43
|
-
- Get the file size in different units (bytes, kilobytes, megabytes, gigabytes).
|
8
|
+
- **File Reading**: Read the entire file content or specific parts.
|
9
|
+
- **Search Operations**: Search for values and display matching line numbers.
|
10
|
+
- **Line Counting**: Count lines based on keywords or delimiters.
|
11
|
+
- **Pattern Replacement**: Replace specific patterns or multiple patterns at once.
|
12
|
+
- **Delete Empty Lines**: Remove empty lines.
|
13
|
+
- **Alphabetical Sorting**: Sort lines alphabetically.
|
14
|
+
- **File Splitting**: Split files into parts or by size.
|
15
|
+
- **File Merging**: Merge multiple files with a separator.
|
16
|
+
- **Encoding Conversion**: Convert file encoding.
|
17
|
+
- **Character Replacement**: Replace special characters or unwanted characters.
|
18
|
+
- **Format Conversion**: Convert the file to txt, csv, or json.
|
19
|
+
- **Multiple Pattern Search**: Search and count multiple patterns.
|
20
|
+
- **Delimiter-Based Splitting**: Split files by delimiter or pattern.
|
21
|
+
- **Pattern Checking**: Check if patterns exist.
|
22
|
+
- **Delete Specific Lines**: Delete lines, specific columns in CSV, and duplicates.
|
23
|
+
- **Reverse Content**: Reverse the file’s content.
|
24
|
+
- **Range-Based Search**: Search within a specific line range.
|
25
|
+
- **Character and Word Counting**: Count characters or words.
|
26
|
+
- **Pattern Extraction**: Extract specific patterns.
|
27
|
+
- **Content Validation**: Validate against custom rules.
|
28
|
+
- **Logical Pattern Search**: AND/OR based pattern search.
|
29
|
+
- **Spelling Check**: Detect spelling errors with a dictionary.
|
30
|
+
- **Encryption/Decryption**: Encrypt and decrypt content.
|
31
|
+
- **File Size Calculation**: Display size in bytes, KB, MB, or GB.
|
32
|
+
- **Filter Operation**: Delete or replace lines based on matching criteria (`:start`, `:body`, or `:end`).
|
44
33
|
|
45
34
|
## Installation
|
46
35
|
|
47
|
-
To use the Readlines library in your Ruby project,
|
36
|
+
To use the Readlines library in your Ruby project, install it via RubyGems:
|
48
37
|
|
49
|
-
```
|
38
|
+
```bash
|
50
39
|
gem install readlines
|
51
40
|
```
|
52
41
|
|
53
|
-
|
42
|
+
Or add it to your Gemfile:
|
54
43
|
|
55
44
|
```ruby
|
56
45
|
gem 'readlines'
|
57
46
|
```
|
58
47
|
|
59
|
-
|
48
|
+
Run `bundle install` to install the library and its dependencies.
|
60
49
|
|
61
50
|
## Usage
|
62
51
|
|
63
|
-
|
52
|
+
Start by requiring `readlines` in your Ruby script:
|
64
53
|
|
65
54
|
```ruby
|
66
55
|
require 'readlines'
|
67
56
|
```
|
68
57
|
|
69
|
-
Create an instance of the `Read` class
|
58
|
+
Create an instance of the `Read` class with the filename (or full path):
|
70
59
|
|
71
60
|
```ruby
|
72
|
-
|
73
|
-
read = Read.new(
|
61
|
+
file_name = 'file.txt'
|
62
|
+
read = Read.new(file_name)
|
74
63
|
```
|
75
64
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
# ++++++++++++++++++++++++++++++++++++
|
80
|
-
# name : 'john'
|
81
|
-
# phone : '+1 332-332-3322'
|
82
|
-
#++++++++++++++++++++++++++++++++++++
|
83
|
-
read = Read.new(file_path, count: 'name', split: '++++++++++++++++++++++++++++++++++++')
|
84
|
-
puts read.line_count
|
85
|
-
```
|
65
|
+
### Examples
|
66
|
+
|
67
|
+
#### Basic Operations
|
86
68
|
```ruby
|
87
69
|
# Read the entire file content
|
88
70
|
content = read.read_lines
|
89
71
|
puts content
|
90
72
|
```
|
73
|
+
|
74
|
+
#### Counting Operations
|
91
75
|
```ruby
|
92
|
-
#
|
93
|
-
|
94
|
-
result = read.search_about(value, show_lines: true)
|
95
|
-
puts result
|
96
|
-
```
|
97
|
-
```ruby
|
98
|
-
# Count the number of lines in the file based on a keyword or delimiter
|
99
|
-
keyword = 'example'
|
100
|
-
delimiter = '---'
|
101
|
-
count = read.line_count(count: keyword, split: delimiter)
|
76
|
+
# Count lines containing a specific keyword
|
77
|
+
count = read.line_count(count: 'example')
|
102
78
|
puts count
|
79
|
+
|
80
|
+
# Count characters in the file or a specific line
|
81
|
+
total_characters = read.character_count
|
82
|
+
puts total_characters
|
83
|
+
line_characters = read.character_count(line_specific: 3)
|
84
|
+
puts line_characters
|
85
|
+
|
86
|
+
# Count words in the file or a specific line
|
87
|
+
total_words = read.word_count
|
88
|
+
puts total_words
|
89
|
+
line_words = read.word_count(line_specific: 3)
|
90
|
+
puts line_words
|
103
91
|
```
|
92
|
+
|
93
|
+
#### Search Operations
|
104
94
|
```ruby
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
95
|
+
# Search for a specific value and show line numbers
|
96
|
+
result = read.search_about('example', show_lines: true)
|
97
|
+
puts result
|
98
|
+
|
99
|
+
# Search for multiple patterns and count occurrences
|
100
|
+
patterns = [/example/, /test/]
|
101
|
+
result = read.search_multiple_patterns(patterns)
|
102
|
+
puts result
|
103
|
+
|
104
|
+
# Check if a pattern exists
|
105
|
+
pattern_exists = read.pattern_exists?(/example/)
|
106
|
+
puts pattern_exists
|
107
|
+
|
108
|
+
# Search for a pattern within a range of lines
|
109
|
+
matched_lines = read.search_in_range(5, 10, /example/)
|
110
|
+
puts matched_lines
|
111
|
+
|
112
|
+
# Logical pattern search (AND/OR operators)
|
113
|
+
and_results = read.search_logical_patterns([/example/, /test/], 'AND')
|
114
|
+
puts and_results
|
115
|
+
or_results = read.search_logical_patterns([/example/, /test/], 'OR')
|
116
|
+
puts or_results
|
110
117
|
```
|
118
|
+
|
119
|
+
#### Replacement Operations
|
111
120
|
```ruby
|
112
|
-
#
|
113
|
-
updated_content = read.
|
121
|
+
# Replace specific patterns in the file
|
122
|
+
updated_content = read.replace(/example/, 'new_example')
|
114
123
|
puts updated_content
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
puts sorted_content
|
120
|
-
```
|
121
|
-
```ruby
|
122
|
-
# Split the file into a specified number of parts
|
123
|
-
num_parts = 3
|
124
|
-
read.split_file(num_parts)
|
125
|
-
```
|
126
|
-
```ruby
|
127
|
-
# Merge multiple files into a single file
|
128
|
-
file_paths = ['/path/to/file1.txt', '/path/to/file2.txt']
|
129
|
-
merged_file = read.merge_files(file_paths)
|
130
|
-
puts merged_file
|
131
|
-
```
|
132
|
-
```ruby
|
133
|
-
# Convert the encoding of the file from one encoding to another
|
134
|
-
from_encoding = 'UTF-8'
|
135
|
-
to_encoding = 'ISO-8859-1'
|
136
|
-
read.convert_encoding(from_encoding, to_encoding)
|
137
|
-
```
|
138
|
-
```ruby
|
139
|
-
# Replace special characters in the file with a replacement string
|
140
|
-
replacement = '_'
|
141
|
-
updated_content = read.replace_special_characters(replacement)
|
124
|
+
|
125
|
+
# Replace multiple patterns at once
|
126
|
+
pattern_replacement = {/example/ => 'new_example', /test/ => 'new_test'}
|
127
|
+
updated_content = read.replace_multiple_patterns(pattern_replacement)
|
142
128
|
puts updated_content
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
129
|
+
|
130
|
+
# Replace characters in a CSV column
|
131
|
+
updated_csv = read.replace_csv_value(2, 'old_value', 'new_value')
|
132
|
+
puts updated_csv
|
133
|
+
|
134
|
+
# Replace special characters with a specified replacement string
|
135
|
+
updated_content = read.replace_special_characters('_')
|
148
136
|
puts updated_content
|
149
137
|
```
|
138
|
+
|
139
|
+
#### Deletion Operations
|
150
140
|
```ruby
|
151
|
-
#
|
152
|
-
|
153
|
-
read.split_file_by_size(part_size)
|
154
|
-
```
|
155
|
-
```ruby
|
156
|
-
# Convert the file to a specified format
|
157
|
-
format = 'csv'
|
158
|
-
converted_file = read.convert_to_format(format)
|
159
|
-
puts converted_file
|
160
|
-
```
|
161
|
-
```ruby
|
162
|
-
# Search for multiple patterns in the file and count occurrences of each pattern
|
163
|
-
patterns = [/example/, /pattern/]
|
164
|
-
result = read.search_multiple_patterns(patterns)
|
165
|
-
puts result
|
166
|
-
```
|
167
|
-
```ruby
|
168
|
-
# Replace multiple patterns in the file in a single operation
|
169
|
-
pattern_replacement_hash = {/example/ => 'new_example', /pattern/ => 'new_pattern'}
|
170
|
-
updated_content = read.replace_multiple_patterns(pattern_replacement_hash)
|
141
|
+
# Delete empty lines from the file
|
142
|
+
updated_content = read.delete_empty_lines
|
171
143
|
puts updated_content
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
delimiter = '---'
|
176
|
-
read.split_by_delimiter(delimiter)
|
177
|
-
```
|
178
|
-
```ruby
|
179
|
-
# Merge multiple files into a single file with a specified separator between each file's content
|
180
|
-
file_paths = ['/path/to/file1.txt', '/path/to/file2.txt']
|
181
|
-
separator = '---'
|
182
|
-
merged_file = read.merge_files(file_paths, separator: separator)
|
183
|
-
puts merged_file
|
184
|
-
```
|
185
|
-
```ruby
|
186
|
-
# Check if a specific pattern exists in the file
|
187
|
-
pattern = /example/
|
188
|
-
exists = read.pattern_exists?(pattern)
|
189
|
-
puts exists
|
190
|
-
```
|
191
|
-
```ruby
|
192
|
-
# Delete specific lines from the file with the option to remove resulting empty lines
|
193
|
-
line_numbers = [2, 4, 6]
|
194
|
-
updated_content = read.delete_lines(line_numbers, delete_space: true)
|
144
|
+
|
145
|
+
# Delete specific lines with the option to remove empty lines
|
146
|
+
updated_content = read.delete_lines([2, 4, 6], delete_space: true)
|
195
147
|
puts updated_content
|
148
|
+
|
149
|
+
# Delete unwanted characters
|
150
|
+
updated_content = read.delete_unwanted_characters('!@#$%^')
|
151
|
+
puts updated_content
|
152
|
+
|
153
|
+
# Delete duplicate lines
|
154
|
+
unique_content = read.delete_duplicate_lines
|
155
|
+
puts unique_content
|
156
|
+
|
157
|
+
# Delete specific columns in a CSV file
|
158
|
+
updated_csv = read.delete_csv_columns([1, 3])
|
159
|
+
puts updated_csv
|
160
|
+
|
161
|
+
# Filter lines based on criteria
|
162
|
+
# Replace lines starting with "hello" with "hi"
|
163
|
+
read.filter("hello", :start, :replace, "hi")
|
164
|
+
read.filter("world", :body, :replace, "guys")
|
165
|
+
read.filter("123", :end, :replace, "456")
|
166
|
+
|
167
|
+
# Delete lines containing "unwanted_text" from start or end or anywhere using `:start` or `:end` or `:body`
|
168
|
+
read.filter("unwanted_text", :start, :delete)
|
169
|
+
read.filter("unwanted_text", :body, :delete)
|
170
|
+
read.filter("unwanted_text", :end, :delete)
|
196
171
|
```
|
172
|
+
|
173
|
+
#### File Splitting and Merging
|
197
174
|
```ruby
|
198
|
-
#
|
199
|
-
|
200
|
-
puts reversed_content
|
201
|
-
```
|
202
|
-
```ruby
|
203
|
-
# Search for a pattern within a specified range of lines
|
204
|
-
start_line = 5
|
205
|
-
end_line = 10
|
206
|
-
pattern = /example/
|
207
|
-
matched_lines = read.search_in_range(start_line, end_line, pattern)
|
208
|
-
puts matched_lines
|
209
|
-
```
|
210
|
-
```ruby
|
211
|
-
# Count the number of characters in the file or in a specific line
|
212
|
-
total_characters = read.character_count
|
213
|
-
puts total_characters
|
175
|
+
# Split the file into 3 parts
|
176
|
+
read.split_file(3)
|
214
177
|
|
215
|
-
|
216
|
-
|
217
|
-
|
178
|
+
# Split by size (in bytes)
|
179
|
+
read.split_file_by_size(1024) # 1 KB
|
180
|
+
|
181
|
+
# Split by delimiter
|
182
|
+
read.split_by_delimiter('---')
|
183
|
+
|
184
|
+
# Split by a pattern
|
185
|
+
read.split_by_pattern(/Chapter \d+/)
|
186
|
+
|
187
|
+
# Merge multiple files
|
188
|
+
merged_file = read.merge_files(['/path/to/file1.txt', '/path/to/file2.txt'])
|
189
|
+
puts merged_file
|
190
|
+
|
191
|
+
# Merge files with a separator
|
192
|
+
merged_file_with_separator = read.merge_files(['/file1.txt', '/file2.txt'], separator: '---')
|
193
|
+
puts merged_file_with_separator
|
218
194
|
```
|
195
|
+
|
196
|
+
#### Encoding and Format Conversion
|
219
197
|
```ruby
|
220
|
-
#
|
221
|
-
|
222
|
-
puts total_words
|
198
|
+
# Convert encoding
|
199
|
+
read.convert_encoding('UTF-8', 'ISO-8859-1')
|
223
200
|
|
224
|
-
|
225
|
-
|
226
|
-
puts
|
201
|
+
# Convert file format to CSV
|
202
|
+
converted_csv = read.convert_to_format('csv')
|
203
|
+
puts converted_csv
|
227
204
|
```
|
205
|
+
|
206
|
+
#### Extracting and Validating Content
|
228
207
|
```ruby
|
229
|
-
# Extract specific patterns
|
208
|
+
# Extract specific patterns (e.g., email addresses)
|
230
209
|
patterns = [/email:\s*\S+/, /phone:\s*\S+/]
|
231
210
|
extracted_data = read.extract_patterns(patterns)
|
232
211
|
puts extracted_data
|
233
|
-
|
234
|
-
|
235
|
-
# Convert the file contents into an array of lines
|
236
|
-
lines_array = read.convert_to_array
|
237
|
-
puts lines_array
|
238
|
-
```
|
239
|
-
```ruby
|
240
|
-
# Validate the file contents against a set of rules
|
212
|
+
|
213
|
+
# Validate content with a set of rules
|
241
214
|
rules = [/^[A-Z]/, /\b\d{3}-\d{3}-\d{4}\b/]
|
242
215
|
is_valid = read.validate_content(rules)
|
243
216
|
puts is_valid
|
244
|
-
|
245
|
-
|
246
|
-
# Remove duplicate lines from the file
|
247
|
-
unique_content = read.delete_duplicate_lines
|
248
|
-
puts unique_content
|
249
|
-
```
|
250
|
-
```ruby
|
251
|
-
# Get statistics about the file
|
252
|
-
stats = read.file_statistics
|
253
|
-
puts stats
|
254
|
-
```
|
255
|
-
```ruby
|
256
|
-
# Search for logical patterns in the file using AND and OR operators
|
257
|
-
patterns = [/example/, /pattern/]
|
258
|
-
and_matched_lines = read.search_logical_patterns(patterns, 'AND')
|
259
|
-
puts and_matched_lines
|
260
|
-
```
|
261
|
-
```ruby
|
262
|
-
or_matched_lines = read.search_logical_patterns(patterns, 'OR')
|
263
|
-
puts or_matched_lines
|
264
|
-
```
|
265
|
-
```ruby
|
266
|
-
# Split the file based on a specified pattern
|
267
|
-
pattern = /Chapter \d+:/
|
268
|
-
read.split_by_pattern(pattern)
|
269
|
-
```
|
270
|
-
```ruby
|
271
|
-
# Delete specific columns from a CSV file
|
272
|
-
column_indices = [1, 3]
|
273
|
-
updated_csv = read.delete_csv_columns(column_indices)
|
274
|
-
puts updated_csv
|
275
|
-
```
|
276
|
-
```ruby
|
277
|
-
# Replace a specific value in a CSV column
|
278
|
-
column_index = 2
|
279
|
-
old_value = 'old_value'
|
280
|
-
new_value = 'new_value'
|
281
|
-
updated_csv = read.replace_csv_value(column_index, old_value, new_value)
|
282
|
-
puts updated_csv
|
283
|
-
```
|
284
|
-
```ruby
|
285
|
-
# Check for spelling errors in the file using a dictionary
|
217
|
+
|
218
|
+
# Check for spelling errors using a dictionary
|
286
219
|
dictionary = ['example', 'pattern', 'file']
|
287
220
|
misspelled_words = read.check_spelling(dictionary)
|
288
221
|
puts misspelled_words
|
289
222
|
```
|
223
|
+
|
224
|
+
#### File Size and Statistics
|
290
225
|
```ruby
|
291
|
-
#
|
292
|
-
key = 5
|
293
|
-
encrypted_file = read.encrypt_content(key)
|
294
|
-
puts encrypted_file
|
295
|
-
```
|
296
|
-
```ruby
|
297
|
-
# Decrypt the encrypted file contents using a key
|
298
|
-
encrypted_file_path = '/path/to/encrypted_file.txt'
|
299
|
-
decrypted_file = read.decrypt_content(key, encrypted_file_path)
|
300
|
-
puts decrypted_file
|
301
|
-
```
|
302
|
-
```ruby
|
303
|
-
# Get the file size in different units
|
226
|
+
# Get file size in different units
|
304
227
|
file_size_bytes = read.file_size
|
305
228
|
puts file_size_bytes
|
306
|
-
|
307
229
|
file_size_kb = read.file_size(unit: :kilobytes)
|
308
230
|
puts file_size_kb
|
309
|
-
|
310
231
|
file_size_mb = read.file_size(unit: :megabytes)
|
311
232
|
puts file_size_mb
|
312
|
-
|
313
233
|
file_size_gb = read.file_size(unit: :gigabytes)
|
314
234
|
puts file_size_gb
|
235
|
+
|
236
|
+
# Get statistics about the file
|
237
|
+
file_stats = read.file_statistics
|
238
|
+
puts file_stats
|
239
|
+
```
|
240
|
+
|
241
|
+
#### Encryption and Decryption
|
242
|
+
```ruby
|
243
|
+
# Encrypt content using a key
|
244
|
+
encrypted_content = read.encrypt_content(5)
|
245
|
+
puts encrypted_content
|
246
|
+
|
247
|
+
# Decrypt the content using the same key
|
248
|
+
decrypted_content = read.decrypt_content(5, '/path/to/encrypted_file.txt')
|
249
|
+
puts decrypted_content
|
250
|
+
```
|
251
|
+
|
252
|
+
#### Reverse and Additional Operations
|
253
|
+
```ruby
|
254
|
+
# Reverse the order of file contents
|
255
|
+
reversed_content = read.reverse_content
|
256
|
+
puts reversed_content
|
315
257
|
```
|
316
258
|
|
317
259
|
## Error Handling
|
318
260
|
|
319
|
-
The Readlines library provides custom error classes
|
261
|
+
The Readlines library provides custom error classes for handling specific exceptions:
|
320
262
|
|
321
|
-
-
|
322
|
-
-
|
323
|
-
-
|
324
|
-
-
|
263
|
+
- **Readlines::Error**: General error class for all exceptions.
|
264
|
+
- **Readlines::NotFoundError**: Raised when the file is not found.
|
265
|
+
- **Readlines::MissingFilePathError**: Raised when a file path is missing or empty.
|
266
|
+
- **Readlines::InvalidUnitError**: Raised for invalid file size units.
|
325
267
|
|
326
268
|
These error classes help in handling and debugging exceptions that may occur while using the library.
|
327
269
|
|
328
270
|
## Contributing
|
329
271
|
|
330
|
-
Contributions
|
272
|
+
Contributions are welcome! If you find bugs, have suggestions, or want to add features, please open an issue or submit a pull request on the [GitHub repository](https://github.com/abo5/readlines).
|
331
273
|
|
332
274
|
When contributing, please ensure that your code follows the existing coding style and includes appropriate tests.
|
333
275
|
|
334
276
|
## License
|
335
277
|
|
336
|
-
The Readlines library is open-source and released under the [MIT License](https://opensource.org/licenses/MIT).
|
337
|
-
|
338
|
-
## Contact
|
339
|
-
|
340
|
-
If you have any questions, suggestions, or feedback regarding the Readlines library, please feel free to contact the maintainer:
|
341
|
-
|
342
|
-
- Name: Maven
|
343
|
-
- GitHub: [Maven's GitHub](https://github.com/abo5)
|
344
|
-
|
345
|
-
We appreciate your interest in the Readlines library and look forward to your contributions and feedback!
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
# readlines
|
350
|
-
# readlines
|
278
|
+
The Readlines library is open-source and released under the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/readlines/read.rb
CHANGED
@@ -13,6 +13,7 @@ require_relative 'readlines/replace'
|
|
13
13
|
require_relative 'readlines/search'
|
14
14
|
require_relative 'readlines/sort'
|
15
15
|
require_relative 'readlines/split'
|
16
|
+
require_relative 'readlines/filter'
|
16
17
|
require 'fileutils'
|
17
18
|
require 'json'
|
18
19
|
|
@@ -24,6 +25,7 @@ module Readlines
|
|
24
25
|
include Readlines::Search
|
25
26
|
include Readlines::Replace
|
26
27
|
include Readlines::File
|
28
|
+
include Readlines::Filter
|
27
29
|
include Readlines::Merge
|
28
30
|
include Readlines::Info
|
29
31
|
include Readlines::Pattern
|
@@ -33,12 +35,17 @@ module Readlines
|
|
33
35
|
attr_reader :file_path
|
34
36
|
|
35
37
|
def initialize(file_path, count: nil, split: nil)
|
38
|
+
file_path = ::File.join(Dir.pwd, file_path) unless ::File.absolute_path?(file_path)
|
39
|
+
|
40
|
+
raise Readlines::Error::MissingFilePathError, 'File not found at provided path' unless ::File.exist?(file_path)
|
36
41
|
raise Readlines::Error::MissingFilePathError, 'You should provide a file path, e.g., "/path/to/file.txt"' if file_path.nil? || file_path.empty?
|
37
|
-
|
42
|
+
|
43
|
+
|
38
44
|
@file_path = file_path
|
39
45
|
@count_keyword = count
|
40
46
|
@split_delimiter = split
|
41
47
|
end
|
48
|
+
|
42
49
|
|
43
50
|
include Readlines::Count
|
44
51
|
include Readlines::Delete
|
@@ -46,12 +53,14 @@ module Readlines
|
|
46
53
|
include Readlines::Search
|
47
54
|
include Readlines::Replace
|
48
55
|
include Readlines::File
|
56
|
+
include Readlines::Filter
|
49
57
|
include Readlines::Merge
|
50
58
|
include Readlines::Info
|
51
59
|
include Readlines::Pattern
|
52
60
|
include Readlines::Sort
|
53
61
|
include Readlines::Split
|
54
62
|
include Readlines::Content
|
63
|
+
include Readlines::Filter
|
55
64
|
|
56
65
|
# Count operations
|
57
66
|
def line_count
|
@@ -220,6 +229,20 @@ module Readlines
|
|
220
229
|
raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
|
221
230
|
file_statistics_now()
|
222
231
|
end
|
232
|
+
|
233
|
+
## Replace and Delete lines from the file
|
234
|
+
def filter(value, query, operation, replacement = nil)
|
235
|
+
raise Readlines::Error::NotFoundError, "File not found: #{@file_path}" unless ::File.exist?(@file_path)
|
236
|
+
|
237
|
+
processed_lines = []
|
238
|
+
::File.foreach(@file_path) do |line|
|
239
|
+
result = apply_filter(line, value, query, operation, replacement)
|
240
|
+
processed_lines << result if result
|
241
|
+
end
|
242
|
+
|
243
|
+
::File.write(@file_path, processed_lines.join)
|
244
|
+
processed_lines
|
245
|
+
end
|
223
246
|
|
224
247
|
# Pattern operations
|
225
248
|
def pattern_exists?(pattern)
|
@@ -260,4 +283,13 @@ module Readlines
|
|
260
283
|
decrypt_content_now(key, encrypted_file_path)
|
261
284
|
end
|
262
285
|
end
|
263
|
-
|
286
|
+
|
287
|
+
def filter(file_path, value, query, operation, replacement = nil)
|
288
|
+
processed_lines = []
|
289
|
+
File.foreach(file_path) do |line|
|
290
|
+
result = filter(line, value, query, operation, replacement)
|
291
|
+
processed_lines << result if result # Only add if result is not nil (for delete operation)
|
292
|
+
end
|
293
|
+
processed_lines
|
294
|
+
end
|
295
|
+
end
|
@@ -2,12 +2,34 @@
|
|
2
2
|
|
3
3
|
module Readlines
|
4
4
|
module Error
|
5
|
-
class
|
5
|
+
class BaseError < StandardError
|
6
|
+
def initialize(message = "An error occurred in Readlines")
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
6
10
|
|
7
|
-
class NotFoundError <
|
11
|
+
class NotFoundError < BaseError
|
12
|
+
def initialize(message = "File not found.")
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
8
16
|
|
9
|
-
class MissingFilePathError <
|
17
|
+
class MissingFilePathError < BaseError
|
18
|
+
def initialize(message = "File path is missing.")
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
10
22
|
|
11
|
-
class InvalidUnitError <
|
23
|
+
class InvalidUnitError < BaseError
|
24
|
+
def initialize(message = "Invalid unit provided.")
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class ArgumentError < BaseError
|
30
|
+
def initialize(message = "Invalid argument provided.")
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
12
34
|
end
|
13
|
-
end
|
35
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# readlines/lib/readlines/readlines/filter.rb
|
2
|
+
# Replace and Delete lines from the file
|
3
|
+
require_relative 'delete'
|
4
|
+
require_relative 'replace'
|
5
|
+
|
6
|
+
module Readlines
|
7
|
+
module Filter
|
8
|
+
def apply_filter(line, value, query, operation, replacement = nil)
|
9
|
+
case query
|
10
|
+
when :start
|
11
|
+
matched = line.strip.start_with?(value.to_s)
|
12
|
+
when :body
|
13
|
+
matched = line.include?(value.to_s)
|
14
|
+
when :end
|
15
|
+
matched = line.strip.end_with?(value.to_s)
|
16
|
+
else
|
17
|
+
raise Readlines::Error::ArgumentError, "Invalid query type. Use :start, :body, or :end."
|
18
|
+
end
|
19
|
+
|
20
|
+
if matched
|
21
|
+
case operation
|
22
|
+
when :delete
|
23
|
+
return nil
|
24
|
+
when :replace
|
25
|
+
raise Readlines::Error::ArgumentError, "Replacement value is required for replace operation." if replacement.nil?
|
26
|
+
|
27
|
+
pattern = case query
|
28
|
+
when :start
|
29
|
+
/^#{Regexp.quote(value.to_s)}/
|
30
|
+
when :body
|
31
|
+
/#{Regexp.quote(value.to_s)}/
|
32
|
+
when :end
|
33
|
+
/#{Regexp.quote(value.to_s)}$/
|
34
|
+
end
|
35
|
+
|
36
|
+
return line.gsub(pattern, replacement)
|
37
|
+
else
|
38
|
+
raise Readlines::Error::ArgumentError, "Invalid operation type. Use :delete or :replace."
|
39
|
+
end
|
40
|
+
else
|
41
|
+
line
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: readlines
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.6'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maven
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -84,14 +84,13 @@ description: Readlines is a Ruby library offering advanced tools for reading, wr
|
|
84
84
|
and manipulating text files. It supports searching, replacing, sorting, splitting,
|
85
85
|
merging, handling CSVs, encryption, and more. Perfect for developers needing efficient
|
86
86
|
and complex file operations.
|
87
|
-
email:
|
88
|
-
- qppn@hotmail.com
|
87
|
+
email:
|
89
88
|
executables: []
|
90
89
|
extensions: []
|
91
90
|
extra_rdoc_files: []
|
92
91
|
files:
|
93
92
|
- README.md
|
94
|
-
- lib/
|
93
|
+
- lib/readlines.rb
|
95
94
|
- lib/readlines/read.rb
|
96
95
|
- lib/readlines/readlines/check.rb
|
97
96
|
- lib/readlines/readlines/content.rb
|
@@ -100,6 +99,7 @@ files:
|
|
100
99
|
- lib/readlines/readlines/delete.rb
|
101
100
|
- lib/readlines/readlines/error.rb
|
102
101
|
- lib/readlines/readlines/file.rb
|
102
|
+
- lib/readlines/readlines/filter.rb
|
103
103
|
- lib/readlines/readlines/info.rb
|
104
104
|
- lib/readlines/readlines/merge.rb
|
105
105
|
- lib/readlines/readlines/pattern.rb
|
File without changes
|