pad_utils 1.2.1 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d994307acebee505edfb95deac3c785681b8595
4
- data.tar.gz: 84663dbf244c403d7f20cb105b9756d7f2ccff44
3
+ metadata.gz: d62721ccb2c8956e21afbd46701f70c4ed8b16d0
4
+ data.tar.gz: 880ccaa96f429c75831085cfaa4c06993bb3beb0
5
5
  SHA512:
6
- metadata.gz: 1e350721bb28b31c559e34ac7ee2e728af50337a5624c5757cb61bfac56a57a66c0f3c4b924d4b61cf17944311bdeaa94e170b3003a55021eca2fbd54c0d697e
7
- data.tar.gz: c91c8147eda9bda2bcd6888375a382a78698f1d6dfaff5c1c62cbef94981b75704befe0ad38928e7a95888641069b22ed273075d2d84f6f6981cc029cc762113
6
+ metadata.gz: 58c650731599b21858389934b0223cfd59780eca5e0206a345b8cf4878ca21a67233e09034c8cb4dc46240d311838d2989ff481ec285231b5fa5eb36a51fb6c2
7
+ data.tar.gz: f82659ed6c0f39447f064d2e9916c7b7078c145bb7c4d152bd4155d19810c0a0d76d2f3d40430ffce85ce7e261c91ad6310c18a42872b51859d8f96309e61202
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  PadUtils is a simple gem containing common utilities and shortcuts. It is used in the [Padstone](http://padstone.io) app builder but can be embedded in any other Ruby project.
4
4
 
5
+ It provides methods to work with text, JSON, hashes, time, to build cli menus and more.
5
6
 
6
7
  ## Installation
7
8
 
@@ -10,285 +11,9 @@ It's a Ruby gem. Install it like any other gem!
10
11
  `gem install pad_utils`
11
12
 
12
13
 
13
- ## Usage
14
+ ## Documentation
14
15
 
15
- Just `require 'pad_utils'` within your code to access the following methods.
16
-
17
-
18
- ### Build CLI menus
19
-
20
-
21
- #### 1. Yes/No menu
22
-
23
- Prompt user with a cli yes/no menu. Returns `true` or `false`.
24
-
25
- * `question`: the question to ask
26
- * `default`: the default answer
27
-
28
- `PadUtils.yes_no_menu(question: "Question?", default: "y")`
29
-
30
-
31
- #### 2. Open question menu
32
-
33
- Prompt user with a cli open question menu. Returns a `string`.
34
-
35
- `PadUtils.question_menu(question)`
36
-
37
-
38
- #### 3. Multiple choice menu
39
-
40
- Prompt user with a multiple choice menu. Returns a `symbol`.
41
-
42
- * `question`: the question to ask
43
- * `choices`: hash of choices (e.g. `{b: "blue", r: "red"}`)
44
- * `default`: symbol representing the default value. If none provided, last value in choices hash will be used.
45
-
46
- `PadUtils.choice_menu(question: "Question?", choices: {}, default: nil)`
47
-
48
-
49
- ### Work with text
50
-
51
-
52
- #### 1. Convert a string to a Rubified name
53
-
54
- Convert a string into a proper "rubified" name. For example, 'app_name' will be converted to 'AppName'. Returns a `string`.
55
-
56
- `PadUtils.convert_to_ruby_name(value)`
57
-
58
-
59
- #### 2. Convert CamelCase to camel_case (underscores)
60
-
61
- Convert a `CamelCase` word to an underscored one, e.g. `camel_case`. Taken from the Rails [Inflector](http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore) class. Returns a `string`.
62
-
63
- `PadUtils.underscore(val)`
64
-
65
-
66
- #### 3. Sanitize a string
67
-
68
- Sanitize a string by replacing special characters (including spaces) with underscores. Returns a `string`.
69
-
70
- `PadUtils.sanitize(value)`
71
-
72
-
73
- #### 4. Replace a string in a file
74
-
75
- Replace text within a file. `old_text` can either be a `string` or a `regex`. Doesn't return anything, overwrites `file`.
76
-
77
- `PadUtils.replace_in_file(file, old_text, new_text)`
78
-
79
-
80
- #### 5. Insert text before first occurence
81
-
82
- Insert text in a string or a file before the first occurence of a string. Returns a `string`. If `is_file` is `true`, overwrites `original` file.
83
-
84
- * `original`: the original string or filename
85
- * `tag`: occurence of string to find
86
- * `text`: string to insert
87
- * `is_file`: `true` if `original` is a filename (default), `false` if it's a `string`
88
-
89
- `PadUtils.insert_before_first(original: nil, tag: nil, text: nil, is_file: true)`
90
-
91
-
92
- #### 6. Insert text before last occurence
93
-
94
- Insert text in a string or a file before the last occurence of a string. Returns a `string`. If `is_file` is `true`, overwrites `original` file.
95
-
96
- * `original`: the original string or filename
97
- * `tag`: occurence of string to find
98
- * `text`: string to insert
99
- * `is_file`: `true` if `original` is a filename (default), `false` if it's a `string`
100
-
101
- `PadUtils.insert_before_last(original: nil, tag: nil, text: nil, is_file: true)`
102
-
103
-
104
- #### 7. Insert text after first occurence
105
-
106
- Insert text in a string or a file after the first occurence of a string. Returns a `string`. If `is_file` is `true`, overwrites `original` file.
107
-
108
- * `original`: the original string or filename
109
- * `tag`: occurence of string to find
110
- * `text`: string to insert
111
- * `is_file`: `true` if `original` is a filename (default), `false` if it's a `string`
112
-
113
- `PadUtils.insert_after_first(original: nil, tag: nil, text: nil, is_file: true)`
114
-
115
-
116
- #### 8. Insert text after last occurence
117
-
118
- Insert text in a string or a file after the last occurence of a string. Returns a `string`. If `is_file` is `true`, overwrites `original` file.
119
-
120
- * `original`: the original string or filename
121
- * `tag`: occurence of string to find
122
- * `text`: string to insert
123
- * `is_file`: `true` if `original` is a filename (default), `false` if it's a `string`
124
-
125
- `PadUtils.insert_after_last(original: nil, tag: nil, text: nil, is_file: true)`
126
-
127
-
128
- ### JSON and Hash
129
-
130
- Few methods to convert JSON to deep symbolized hash and back.
131
-
132
-
133
- #### 1. Symbolize all keys in a hash
134
-
135
- Convert all keys and sub-keys to symbols in a hash. Emulates the `deep_symbolize_keys` found in [Rails](http://apidock.com/rails/Hash/deep_symbolize_keys). Returns a `Hash`.
136
-
137
- `PadUtils.deep_symbolize_hash_keys(hash)`
138
-
139
-
140
- #### 2. Convert a JSON string to a symbolized hash
141
-
142
- Returns a `Hash`.
143
-
144
- `PadUtils.json_to_hash(json)`
145
-
146
-
147
- #### 3. Load a JSON file and convert it to a symbolized hash
148
-
149
- Returns a `Hash`.
150
-
151
- `PadUtils.json_file_to_hash(json_filename)`
152
-
153
-
154
- #### 4. Convert a hash to JSON
155
-
156
- *Alias method on `to_json` for consistency.*
157
-
158
- Returns a `string`.
159
-
160
- `PadUtils.hash_to_json(hash)`
161
-
162
-
163
- #### 5. Write a hash to a JSON file
164
-
165
- Returns the file content as a `string`.
166
-
167
- `PadUtils..hash_to_json_file(filename, hash)`
168
-
169
-
170
- ### Work with files
171
-
172
- Mostly, these are convenience methods aliasing existing Ruby methods. Implemented for consistency.
173
-
174
-
175
- #### 1. Delete a file
176
-
177
- Delete a file. If not found, doesn't raise any error.
178
-
179
- `delete_file(file_path)`
180
-
181
-
182
- #### 2. Does a file exist?
183
-
184
- Returns `true` or `false`.
185
-
186
- `PadUtils.file_exist?(file_path)`
187
-
188
-
189
- #### 3. Copy a file
190
-
191
- **Will override file if it already exists!**
192
-
193
- `PadUtils.copy_file(file_path, dest_dir)`
194
-
195
-
196
- #### 4. Move a file
197
-
198
- **Will not throw an error if original file doesn't exist!**
199
-
200
- `PadUtils.move_file(file_path, dest_file)`
201
-
202
-
203
- #### 5. Copy multiple files
204
-
205
- `PadUtils.copy_files(files_array, dest_dir)`
206
-
207
-
208
- #### 6. Copy all files
209
-
210
- Copy all files from a directory to another. *Will create destination if it doesn't exist*.
211
-
212
- `PadUtils.copy_all_files(source_dir, dest_dir)`
213
-
214
-
215
- #### 7. Create a directory
216
-
217
- Create a directory and subdirectories. **Won't complain if it already exists. Won't override content**.
218
-
219
- `PadUtils.create_directory(dir_name)`
220
-
221
-
222
- #### 8. Delete a directory and its content
223
-
224
- `PadUtils.delete_directory(dir_name)`
225
-
226
-
227
- #### 9. Read content of a file
228
-
229
- Returns a `string`.
230
-
231
- `PadUtils.get_file_content(filepath)`
232
-
233
-
234
- #### 10. Write to a file
235
-
236
- Write content to a file. Create it if it doesn't exist. **Overwrites it if it already exists!**.
237
-
238
- `PadUtils.write_to_file(filepath, content)`
239
-
240
-
241
- #### 11. Append to a file
242
-
243
- Append content to the end of a file. Create it if it doesn't exist.
244
-
245
- **It will write a newline character first. If you don't want that,
246
- set the `new_line` option to `false`**.
247
-
248
- `PadUtils.append_to_file(filepath, content, new_line = true)`
249
-
250
-
251
- ### Logging
252
-
253
- By default, logs will go to `~/pad_logs/logs.txt`.
254
-
255
- * Change default path: `PadUtils.log_path = "/new/path/to/logs"`
256
- * Change default file name: `PadUtils.log_file = "my_logs.txt"`
257
-
258
- To log a message, you call `log` and pass it a `message` string. Optionally, you can also pass an `Exception` object in the parameters:
259
-
260
- `PadUtils.log(message, e = nil)`
261
-
262
-
263
- ### Some time methods
264
-
265
-
266
- #### 1. Time to string timestamp
267
-
268
- Returns a `string` timestamp with the format `YYYYMMDDHHmmss` from a `Time` object.
269
-
270
- `PadUtils.time_to_stamp(val)`
271
-
272
-
273
- #### 2. String to time
274
-
275
- Returns a `Time` object from a timestamp with the format `YYYYMMDDHHmmss`
276
-
277
- `PadUtils.stamp_to_time(val)`
278
-
279
-
280
- #### 3. Time to readable string
281
-
282
- Returns a `string` readable timestamp with format `YYYY-MM-DD HH:mm:ss` from a `Time` object.
283
-
284
- `PadUtils.time_to_readable_stamp(val)`
285
-
286
-
287
- #### 4. Readable timestamp to time
288
-
289
- Returns a `Time` object from a readable timestamp `string` with format `YYYY-MM-DD HH:mm:ss`
290
-
291
- `PadUtils.readable_stamp_to_time(val)`
16
+ PadUtils is fully documented at [padutils.padstone.io](http://padutils.padstone.io/PadUtils.html) using [YARD](http://www.rubydoc.info/gems/yard/).
292
17
 
293
18
 
294
19
  ## Contribute
data/bin/padutils CHANGED
@@ -2,4 +2,5 @@
2
2
 
3
3
  require_relative "../lib/pad_utils"
4
4
 
5
+ # CLI entry point calling {PadUtils.main}
5
6
  PadUtils::main ARGV
@@ -6,70 +6,144 @@ module PadUtils
6
6
  # Most are wrappers on FileUtils existing methods. Having them here,
7
7
  # a user of PadUtils doesn't have to remember names and parameters.
8
8
 
9
- # Delete a file. If not found, doesn't raise any error.
9
+ # Deletes a file.
10
+ #
11
+ # @param file_path [String] the file path and name
12
+ # @return [Void] nothing
13
+ # @example
14
+ # PadUtils.delete("path/to/file.txt")
10
15
  def self.delete_file(file_path)
11
16
  FileUtils.rm(file_path, force: true)
12
17
  end
13
18
 
14
- # Just a wrapper on File.exist? for consistency.
19
+ # Checks if a file exists.
20
+ #
21
+ # @param file_path [String] the file path and name
22
+ # @return [Boolean]
23
+ # @example
24
+ # PadUtils.file_exist?("path/to/file.txt")
15
25
  def self.file_exist?(file_path)
16
26
  File.exist?(file_path)
17
27
  end
18
28
 
19
- # Just a wrapper on FileUtils.cp for consistency.
20
- # Will override file if it already exists!
29
+ # Copies a file.
30
+ #
31
+ # @param file_path [String] the source file name and path
32
+ # @param dest_dir [String] the destination directory
33
+ # @return [Void] nothing
34
+ # @example
35
+ # PadUtils.copy_file("test.txt", "path/to/destination/directory")
21
36
  def self.copy_file(file_path, dest_dir)
22
37
  FileUtils.cp(file_path, dest_dir)
23
38
  end
24
39
 
25
- # Just a wrapper on FileUtils.mv for consistency.
26
- # Will not throw an error if original file doesn't exist
40
+
41
+ # Moves a file.
42
+ #
43
+ # @param file_path [String] the source file path and name
44
+ # @param dest_file [String] the destination path and name
45
+ # @return [Void] nothing
46
+ # @example
47
+ # PadUtils.move_file("source.txt", "path/to/destination/renamed.txt")
27
48
  def self.move_file(file_path, dest_file)
28
49
  FileUtils.mv(file_path, dest_file, force: true)
29
50
  end
30
51
 
31
- # Copy an array of files
52
+ # Copies an array of files.
53
+ #
54
+ # @param files [Array<String>] the array of files paths and names to copy
55
+ # @param dest_dir [String] the destination path
56
+ # @return [Void] nothing
57
+ # @example
58
+ # files = ["file1.txt", "path/to/file2.txt", "path/to/files/file3.txt"]
59
+ # PadUtils.copy_files(files, "path/to/destination")
32
60
  def self.copy_files(files, dest_dir)
33
61
  files.each do |f|
34
62
  copy_file(f, dest_dir)
35
63
  end
36
64
  end
37
65
 
38
- # Copy all files from a directory to another.
39
- # Will create destination if it doesn't exist
66
+ # Copies all files from a directory.
67
+ #
68
+ # @note Will create the destination if it doesn't exist.
69
+ # Files existing on destination but not on source won't be overwritten.
70
+ #
71
+ # @param orig_dir [String] the path to source directory
72
+ # @return [Void] nothing
73
+ # @example
74
+ # PadUtils.copy_all_files("path/to/source", "path/to/destination")
40
75
  def self.copy_all_files(orig_dir, dest_dir)
41
76
  FileUtils.copy_entry(orig_dir, dest_dir)
42
77
  end
43
78
 
44
- # Create a directory and subdirectories
45
- # Won't complain if it already exists. Won't override content.
79
+ # Creates a directory.
80
+ #
81
+ # @note Won't override directory content if it already exists.
82
+ #
83
+ # @param dir_name [String] the directory path and name
84
+ # @return [Void] nothing
85
+ # @example
86
+ # PadUtils.create_directory("path/to/dir")
46
87
  def self.create_directory(dir_name)
47
88
  FileUtils.mkdir_p(dir_name)
48
89
  end
49
90
 
50
- # Delete a directory and its content.
51
- # Just a wrapper for consistency.
91
+ # Deletes a directory and its content
92
+ #
93
+ # @param dir_name [String] the directory path and name
94
+ # @return [Void] nothing
95
+ # @example
96
+ # PadUtils.delete_directory("path/to/dir")
52
97
  def self.delete_directory(dir_name)
53
98
  FileUtils.rm_r(dir_name)
54
99
  end
55
100
 
56
- # Reads content of a file. Method created for consistency.
101
+ # Reads the whole content of a file into a string.
102
+ #
103
+ # Will log errors using {PadUtils.log PadUtils.log}.
104
+ #
105
+ # @param filepath [String] the file path and name
106
+ # @return [String] the content of the file
107
+ # @example
108
+ # PadUtils.get_file_content("path/to/file.txt")
57
109
  def self.get_file_content(filepath)
58
110
  File.read(filepath)
59
111
  rescue Exception => e
60
112
  PadUtils.log("Error in get_file_content", e)
61
113
  end
62
114
 
63
- # Write content to a file. Create it if it doesn't exist.
115
+ # Writes content to a file.
116
+ #
117
+ # @note Will create destination file if it doesn't exist.
118
+ # Will also overwrite the file if it already exists.
119
+ #
120
+ # Will log errors using {PadUtils.log PadUtils.log}.
121
+ #
122
+ # @param filepath [String] the file path and name
123
+ # @param content [String] the content to be written
124
+ # @return [Void] nothing
125
+ # @example
126
+ # PadUtils.write_to_file("path/to/file", "Hello\nThis is a test")
64
127
  def self.write_to_file(filepath, content)
65
128
  File.open(filepath, 'w') { |f| f.write(content)}
66
129
  rescue Exception => e
67
130
  PadUtils.log("Error in write_to_file", e)
68
131
  end
69
132
 
70
- # Append content to the end of a file. Create it if it doesn't exist.
71
- # It will write a newline character first. If you don't want that,
72
- # set the new_line option to false.
133
+
134
+ # Appends content to a file.
135
+ #
136
+ # @note Will create the destination file if it doesn't exist.
137
+ # It also prepends a newline character. Set new_line to false to change this.
138
+ #
139
+ # Will log errors using {PadUtils.log PadUtils.log}.
140
+ #
141
+ # @param filepath [String] the file path and name
142
+ # @param content [String] the content to append
143
+ # @param new_line [Boolean] prepends a newline character
144
+ # @return [Void] nothing
145
+ # @example
146
+ # PadUtils.append_to_file("path/to/file.txt", "Append this!", false)
73
147
  def self.append_to_file(filepath, content, new_line = true)
74
148
  content = "\n#{content}" if new_line
75
149
  File.open(filepath, 'a') { |f| f.write("#{content}")}
@@ -2,43 +2,74 @@ require 'json'
2
2
 
3
3
  module PadUtils
4
4
 
5
- # Convert all keys and sub-keys to symbols in a hash.
6
- # Emulates the deep_symbolize_keys found in Rails.
7
- # Returns a Hash.
5
+ # Converts keys and sub-keys to symbols in a hash.
6
+ #
7
+ # Emulates Rails {http://apidock.com/rails/Hash/deep_symbolize_keys deep_symbolize_keys} method.
8
+ #
9
+ # @param hash [Hash] the hash to symbolize
10
+ # @return [Hash] the symbolized hash
11
+ # @example
12
+ # h = {"name": "Nico", "age": 37, "computers": [{"model": "Mac Pro"}, {"model": "MacBook"}]}
13
+ # PadUtils.deep_symbolize_hash_keys(h)
14
+ # # => {:name => "Nico", :age => 37, :computers => [{:model => "Mac Pro"}, {:model => "MacBook"}]}
8
15
  def self.deep_symbolize_hash_keys(hash)
9
16
  return hash.collect { |e| deep_symbolize_hash_keys(e) } if hash.is_a?(Array)
10
17
  return hash.inject({}) { |sh,(k,v)| sh[k.to_sym] = deep_symbolize_hash_keys(v); sh } if hash.is_a?(Hash)
11
18
  hash
12
19
  end
13
20
 
14
- # Convert a JSON string to a symbolized hash.
15
- # Returns a hash.
21
+ # Converts a JSON string to a symbolized hash.
22
+ #
23
+ # Calls {PadUtils.deep_symbolize_hash_keys} on a JSON formatted string.
24
+ #
25
+ # @param json [String] the JSON string to convert
26
+ # @return [Hash] the symbolized hash
27
+ # @example
28
+ # PadUtils.json_to_hash(a_json_string)
16
29
  def self.json_to_hash(json)
17
30
  h = JSON.parse(json)
18
31
  self.deep_symbolize_hash_keys(h)
19
32
  end
20
33
 
21
- # Load a JSON file and convert it to a symbolized hash.
22
- # Returns a hash.
34
+ # Converts a JSON file to a symbolized hash.
35
+ #
36
+ # Reads a JSON file and calls {PadUtils.deep_symbolize_hash_keys} on its content.
37
+ #
38
+ # @param json_file [String] the json file path and name
39
+ # @return [Hash] the symbolized hash
40
+ # @example
41
+ # PadUtils.json_file_to_hash("path/to/file")
23
42
  def self.json_file_to_hash(json_file)
24
43
  jfile = PadUtils.get_file_content(json_file)
25
44
  h = JSON.parse(jfile)
26
45
  self.deep_symbolize_hash_keys(h)
27
46
  end
28
47
 
29
- # Convert a hash to JSON. Alias method for consistency.
30
- # Returns a string
48
+ # Convert a hash to a JSON string.
49
+ #
50
+ # @param hash [Hash] the hash to convert
51
+ # @return [String] the JSON string
52
+ # @example
53
+ # h = {name: "Nico", age: 37}
54
+ # PadUtils.hash_to_json(h) # => '{"name": "Nico", "age": 37}'
31
55
  def self.hash_to_json(hash)
32
56
  hash.to_json
33
57
  end
34
58
 
35
- # Write a hash to a json file.
36
- # Returns the file content as a string.
59
+ # Writes a hash to a JSON file.
60
+ #
61
+ # @note Will overwrite the file if it already exists.
62
+ #
63
+ # @param filename [String] the file path and name to write to
64
+ # @param hash [Hash] the hash to convert to JSON and write
65
+ # @return [String] the JSON string
66
+ # @example
67
+ # h = {name: "Nico", age: 37}
68
+ # PadUtils.hash_to_json_file("path/to/json_file.txt", h) # => '{"name": "Nico", "age": 37}'
37
69
  def self.hash_to_json_file(filename, hash)
38
70
  json = hash.to_json
39
71
  PadUtils.write_to_file(filename, json)
40
72
  json
41
73
  end
42
74
 
43
-
44
75
  end
@@ -3,29 +3,54 @@ module PadUtils
3
3
  # Module variable holding the log path. By default,
4
4
  # logs will go in ~/pad_logs/
5
5
  @@log_path = "#{ENV["HOME"]}/pad_logs"
6
-
6
+
7
7
  # Module variable holding the log file. By default,
8
8
  # logs will go in @@log_path/logs.txt
9
9
  @@log_file = "logs.txt"
10
-
11
- # Set another log path
10
+
11
+ # Sets a different log path.
12
+ #
13
+ # @param val [String] the path to the directory
14
+ # @return [String] the log directory path
15
+ # @example
16
+ # PadUtils.set_log_path("path/directory") # => 'path/directory'
12
17
  def self.set_log_path(val)
13
18
  @@log_path = val
14
19
  end
15
-
16
- # Set another log file
20
+
21
+ # Sets a different log file.
22
+ #
23
+ # @param val [String] the log file name
24
+ # @return [String] the log file name
25
+ # @example
26
+ # PadUtils.set_log_file("my_logs.txt") # => 'my_logs.txt'
17
27
  def self.set_log_file(val)
18
28
  @@log_file = val
19
29
  end
20
-
21
- # Log a message
30
+
31
+ # Logs a message.
32
+ #
33
+ # @note If using the method within a rescue block, pass the exception from
34
+ # `rescue Exception => e`
35
+ #
36
+ # @param message [String] the message to log
37
+ # @param e [Exception] the raised exception
38
+ # @return [Void] nothing
39
+ # @example
40
+ # def faulty_method
41
+ # a = 0
42
+ # b = 3
43
+ # c = b / a
44
+ # rescue Exception => e
45
+ # PadUtils.log("Something bad happened!", e)
46
+ # end
22
47
  def self.log(message, e = nil)
23
48
  # Create the log directory if it doesn't exist
24
49
  PadUtils.create_directory(@@log_path)
25
-
50
+
26
51
  # Add a timestamp to the message
27
52
  message = "#{PadUtils.time_to_stamp(Time.now)}: #{message}"
28
-
53
+
29
54
  # If an error is added, add its inner message to the message
30
55
  # as well as the whole stack
31
56
  if e != nil
@@ -36,9 +61,9 @@ module PadUtils
36
61
  end
37
62
  message = "#{message}\n"
38
63
  end
39
-
64
+
40
65
  # Adds the message to the log file
41
- PadUtils.append_to_file("#{@@log_path}/#{@@log_file}", message)
66
+ PadUtils.append_to_file("#{@@log_path}/#{@@log_file}", message)
42
67
  end
43
-
44
- end
68
+
69
+ end
@@ -1,30 +1,48 @@
1
1
  module PadUtils
2
2
 
3
- # Prompt user with a cli yes/no menu. Returns true or false.
4
- # question: the question to ask
5
- # default: the default answer
3
+ # Builds a `yes/no` cli menu.
4
+ #
5
+ # Will log errors using {PadUtils.log PadUtils.log}.
6
+ #
7
+ # @param question [String] the question to ask
8
+ # @param default [String] the default answer as `"y"` or `"n"` - (*default: `"y"`*)
9
+ # @return [String] the answer as `"y"` or `"n"`
10
+ # @example
11
+ # PadUtils.yes_no_menu("Is it cold outside?", default: "n")
6
12
  def self.yes_no_menu(question: "Question?", default: "y")
7
13
  default_answer = default == "y" ? "(Y/n)" : "(y/N)"
8
14
  STDOUT.print "#{question} #{default_answer}: "
9
15
  answer = STDIN.gets.chomp.strip.downcase
10
16
  answer = default if answer.length < 1
11
17
  answer == "y"
12
-
13
18
  rescue Exception => e
14
19
  PadUtils.log("Error in yes/no menu", e)
15
20
  end
16
21
 
17
- # Prompt user with a cli open question menu. Returns a string.
22
+ # Builds an open question menu.
23
+ #
24
+ # Will add `:` and a space after the question.
25
+ #
26
+ # @param question [String] the question to ask
27
+ # @return [String] the answer to the question
28
+ # @example
29
+ # PadUtils.question_menu("How are you?") # => 'All good'
18
30
  def self.question_menu(question)
19
31
  STDOUT.print "#{question}: "
20
32
  STDIN.gets.chomp.strip
21
33
  end
22
34
 
23
- # Prompt user with a multiple choice menu. Returns a symbol. Always!
24
- # question: the question to ask
25
- # choices: hash of choices (e.g. {b: "blue", r: "red"})
26
- # default: symbol representing the default value. If none provided, last
27
- # value in choices hash will be used.
35
+ # Builds a multiple choice menu.
36
+ #
37
+ # Will log errors using {PadUtils.log PadUtils.log}.
38
+ #
39
+ # @param question [String] the question to ask
40
+ # @param choices [Hash] the possible choices
41
+ # @param default [Symbol, nil] the default answer hash key. If nil, the last choice will be used.
42
+ # @return [Symbol] the chosen option
43
+ # @example
44
+ # options = {r: "red", b: "blue", g: "green"}
45
+ # PadUtils.choice_menu(question: "Which color?", choices: options, default: :b)
28
46
  def self.choice_menu(question: "Question?", choices: {}, default: nil)
29
47
  STDOUT.puts
30
48
  STDOUT.puts "- #{question}"
@@ -47,7 +65,6 @@ module PadUtils
47
65
  else
48
66
  return choices.keys[answer - 1].to_sym
49
67
  end
50
-
51
68
  rescue Exception => e
52
69
  PadUtils.log("Error in choice menu", e)
53
70
  end
@@ -1,7 +1,15 @@
1
1
  module PadUtils
2
2
 
3
- # Convert a string into a proper Ruby name.
4
- # For example, 'app_name' will be converted to 'AppName'
3
+ # Converts a string to a Rubified name.
4
+ #
5
+ # @deprecated Use {PadUtils.camel_case PadUtils.camel_case} instead as it will
6
+ # properly sanitize the string as well.
7
+ #
8
+ # @param value [String] the string to rubify
9
+ # @return [String] the rubified string
10
+ # @example
11
+ # s = "hello_you"
12
+ # PadUtils.convert_to_ruby_name(s) # => 'HelloYou'
5
13
  def self.convert_to_ruby_name(value)
6
14
  if value.scan(/\_|\-/).size > 0
7
15
  value.split(/\_|\-/).map(&:capitalize).join
@@ -10,8 +18,37 @@ module PadUtils
10
18
  end
11
19
  end
12
20
 
13
- # Convert a CamelCase word to an underscored one, e.g. camel_case
14
- # Taken from the Rails Inflector class.
21
+ # Converts a string to a CamelCase.
22
+ #
23
+ # @note The string will first be sanitized using {PadUtils.sanitize PadUtils.sanitize}.
24
+ #
25
+ # @param value [String] the string to CamelCase
26
+ # @return [String] the CamelCased string
27
+ # @example
28
+ # s = "hello_you"
29
+ # s2 = "hello you"
30
+ # s3 = "hello $you#"
31
+ # PadUtils.convert_to_ruby_name(s) # => 'HelloYou'
32
+ # PadUtils.convert_to_ruby_name(s2) # => 'HelloYou'
33
+ # PadUtils.convert_to_ruby_name(s3) # => 'HelloYou'
34
+ def self.camel_case(value)
35
+ value = self.sanitize(value)
36
+ if value.scan(/\_|\-/).size > 0
37
+ value.split(/\_|\-/).map(&:capitalize).join
38
+ else
39
+ value.slice(0,1).capitalize + value.slice(1..-1)
40
+ end
41
+ end
42
+
43
+ # Converts a CamelCase string to an underscore string.
44
+ #
45
+ # Taken from the Rails {http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore Inflector}
46
+ # class.
47
+ #
48
+ # @param val [String] the CamelCase string to underscore
49
+ # @return [String] the under_score string
50
+ # @example
51
+ # PadUtils.underscore("CamelCase") # => camel_case
15
52
  def self.underscore(val)
16
53
  word = val.dup
17
54
  word.gsub!(/::/, '/')
@@ -22,13 +59,28 @@ module PadUtils
22
59
  word
23
60
  end
24
61
 
25
- # Convert a string to only alphanumeric and underscores
62
+ # Sanitizes a string.
63
+ #
64
+ # Will only allow alphanumeric characters and underscores.
65
+ #
66
+ # @param value [String] the string to sanitize
67
+ # @return [String] the sanitized string
68
+ # @example
69
+ # PadUtils.sanitize("Abc Def *34*#yXz") # => 'Abc_Def__34__yXz'
26
70
  def self.sanitize(value)
27
71
  value.tr('^A-Za-z0-9', '_')
28
72
  end
29
73
 
30
- # Replace text within a file.
31
- # old_text can be a regex or a string
74
+ # Replaces text in a file.
75
+ #
76
+ # Will log errors using {PadUtils.log PadUtils.log}.
77
+ #
78
+ # @param file [String] the file path and name
79
+ # @param old_text [String, Regexp] the text to find as a string or regex
80
+ # @param new_text [String] the new text
81
+ # @return [Void] nothing
82
+ # @example
83
+ # PadUtils.replace_in_file("example.txt", /some_text/, "new text")
32
84
  def self.replace_in_file(file, old_text, new_text)
33
85
  text_update = PadUtils.get_file_content(file)
34
86
  text_update = text_update.gsub(old_text, new_text)
@@ -38,11 +90,19 @@ module PadUtils
38
90
  PadUtils.log("Error replacing #{old_text} in #{file} with #{new_text}", e)
39
91
  end
40
92
 
41
- # Insert text in a string or a file before the first occurence of a string.
42
- # original: the original string or filename
43
- # tag: occurence of string to find
44
- # text: string to insert
45
- # is_file: say if original is a file (default: true) or a string
93
+ # Inserts text before the first occurence of a string.
94
+ #
95
+ # Can be used on a string or on a file.
96
+ #
97
+ # Will log errors using {PadUtils.log PadUtils.log}.
98
+ #
99
+ # @param original [String] the original file path and name *or* the original string
100
+ # @param tag [String] the string to find
101
+ # @param text [String] the string to insert
102
+ # @param is_file [Boolean] `true` if `original` is a file, `false` if it is a string
103
+ # @return [String] the new content
104
+ # @example
105
+ # PadUtils.insert_before_first(original: "file.txt", tag: "end", text: "# hello!")
46
106
  def self.insert_before_first(original: nil, tag: nil, text: nil, is_file: true)
47
107
  # The new text will be consolidated in content
48
108
  content = ""
@@ -81,11 +141,19 @@ module PadUtils
81
141
  PadUtils.log("Error in insert_before_first", e)
82
142
  end
83
143
 
84
- # Insert text in a string or a file before the last occurence of a string.
85
- # original: the original string or filename
86
- # tag: occurence of string to find
87
- # text: string to insert
88
- # is_file: say if original is a file (default: true) or a string
144
+ # Inserts text before the last occurence of a string.
145
+ #
146
+ # Can be used on a string or on a file.
147
+ #
148
+ # Will log errors using {PadUtils.log PadUtils.log}.
149
+ #
150
+ # @param original [String] the original file path and name *or* the original string
151
+ # @param tag [String] the string to find
152
+ # @param text [String] the string to insert
153
+ # @param is_file [Boolean] `true` if `original` is a file, `false` if it is a string
154
+ # @return [String] the new content
155
+ # @example
156
+ # PadUtils.insert_before_last(original: "file.txt", tag: "end", text: "# hello!")
89
157
  def self.insert_before_last(original: nil, tag: nil, text: nil, is_file: true)
90
158
  # The new text will be consolidated in content
91
159
  content = ""
@@ -114,11 +182,19 @@ module PadUtils
114
182
  PadUtils.log("Error in insert_before_last", e)
115
183
  end
116
184
 
117
- # Insert text in a string or a file after the first occurence of a string.
118
- # original: the original string or filename
119
- # tag: occurence of string to find
120
- # text: string to insert
121
- # is_file: say if original is a file (default: true) or a string
185
+ # Inserts text after the first occurence of a string.
186
+ #
187
+ # Can be used on a string or on a file.
188
+ #
189
+ # Will log errors using {PadUtils.log PadUtils.log}.
190
+ #
191
+ # @param original [String] the original file path and name *or* the original string
192
+ # @param tag [String] the string to find
193
+ # @param text [String] the string to insert
194
+ # @param is_file [Boolean] `true` if `original` is a file, `false` if it is a string
195
+ # @return [String] the new content
196
+ # @example
197
+ # PadUtils.insert_after_first(original: "file.txt", tag: "end", text: "# hello!")
122
198
  def self.insert_after_first(original: nil, tag: nil, text: nil, is_file: true)
123
199
  # The new text will be consolidated in content
124
200
  content = ""
@@ -157,11 +233,19 @@ module PadUtils
157
233
  PadUtils.log("Error in insert_after_first", e)
158
234
  end
159
235
 
160
- # Insert text in a string or a file after the last occurence of a string.
161
- # original: the original string or filename
162
- # tag: occurence of string to find
163
- # text: string to insert
164
- # is_file: say if original is a file (default: true) or a string
236
+ # Inserts text after the last occurence of a string.
237
+ #
238
+ # Can be used on a string or on a file.
239
+ #
240
+ # Will log errors using {PadUtils.log PadUtils.log}.
241
+ #
242
+ # @param original [String] the original file path and name *or* the original string
243
+ # @param tag [String] the string to find
244
+ # @param text [String] the string to insert
245
+ # @param is_file [Boolean] `true` if `original` is a file, `false` if it is a string
246
+ # @return [String] the new content
247
+ # @example
248
+ # PadUtils.insert_after_last(original: "file.txt", tag: "end", text: "# hello!")
165
249
  def self.insert_after_last(original: nil, tag: nil, text: nil, is_file: true)
166
250
  # The new text will be consolidated in content
167
251
  content = ""
@@ -2,25 +2,48 @@ require "time"
2
2
 
3
3
  module PadUtils
4
4
 
5
- # Return a string timestamp with the format: YYYYMMDDHHmmss
5
+ # Returns a string timestamp.
6
+ #
7
+ # Format `YYYYMMDDHHmmss` will be used.
8
+ #
9
+ # @param val [Time] the Time object to convert
10
+ # @return [String] the timestamp
11
+ # @example
12
+ # PadUtils.time_to_stamp(Time.now) # => 20160227160122
6
13
  def self.time_to_stamp(val)
7
14
  val.strftime("%Y%m%d%H%M%S")
8
15
  end
9
16
 
10
- # Return a Time object from a timestamp with the format: YYYYMMDDHHmmss
17
+ # Returns a Time object from a string timestamp.
18
+ #
19
+ # Will log errors using {PadUtils.log PadUtils.log}.
20
+ #
21
+ # @param val [String] a string formatted as `YYYYMMDDHHmmss`
22
+ # @return [Time] the Time object
23
+ # @example
24
+ # PadUtils.stamp_to_time("20160227160122")
11
25
  def self.stamp_to_time(val)
12
26
  Time.parse "#{val[0..3]}-#{val[4..5]}-#{val[6..7]} #{val[8..9]}:#{val[10..11]}:#{val[12..13]}"
13
27
  rescue Exception => e
14
28
  PadUtils.log("Error in stamp_to_time", e)
15
29
  end
16
30
 
17
- # Return a string readable timestamp with format: YYYY-MM-DD HH:mm:ss
31
+ # Returns a readable string timestamp.
32
+ #
33
+ # Format `YYYY-MM-DD HH:mm:ss` will be used.
34
+ #
35
+ # @param val [Time] the Time object to convert
36
+ # @return [String] the readable timestamp
18
37
  def self.time_to_readable_stamp(val)
19
38
  val.strftime("%Y-%m-%d %H:%M:%S")
20
39
  end
21
40
 
22
- # Return a Time object from a PadUtils readable timestamp
23
- # with format: YYYY-MM-DD HH:mm:ss
41
+ # Returns a Time object from a readable timestamp.
42
+ #
43
+ # Will log errors using {PadUtils.log PadUtils.log}.
44
+ #
45
+ # @param val [String] the readable timestamp formatted as `YYYY-MM-DD HH:mm:ss`
46
+ # @return [Time] the Time object
24
47
  def self.readable_stamp_to_time(val)
25
48
  Time.parse val
26
49
  rescue Exception => e
@@ -1,3 +1,4 @@
1
1
  module PadUtils
2
- VERSION = "1.2.1"
2
+ # PadUtils version number
3
+ VERSION = "1.3.0"
3
4
  end
data/lib/pad_utils.rb CHANGED
@@ -6,6 +6,11 @@ require_relative "pad_utils/pad_logger"
6
6
  require_relative "pad_utils/pad_menu"
7
7
  require_relative "pad_utils/pad_json"
8
8
 
9
+ # Main namespace for PadUtils.
10
+ #
11
+ # Each method is implemented as a module method. Prefix them with PadUtils to call them.
12
+ # @example
13
+ # PadUtils.some_method(param)
9
14
  module PadUtils
10
15
  # TODO: Add a cli coloring feature
11
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pad_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nico Schuele
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-21 00:00:00.000000000 Z
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: PadUtils is a simple gem containing common utilities and shortcuts. It
14
14
  is used in the [Padstone](http://padstone.io) app builder but can be embedded in
@@ -57,3 +57,4 @@ signing_key:
57
57
  specification_version: 4
58
58
  summary: PadUtils is a simple gem containing common utilities and shortcuts
59
59
  test_files: []
60
+ has_rdoc: