blufin-lib 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 28d9f465ff5230d850d2c1d876a4e105bf077559
4
+ data.tar.gz: ff911b1d347254a0054140b7fcd148a5641cfaa3
5
+ SHA512:
6
+ metadata.gz: 34aa1c67ceae7a75988e3169616ede84b5a21b91d46f09266e47fb35a8bb85e3adfe51860d7a62ffea085fe9df7cce11467af4ee27f33a4bea4380bc5e7001bd
7
+ data.tar.gz: 5745185edb426f42e9d7eb6c62b3b7c26507cff9de7ea4b4e14633206d00e79b8aaf1e78ba27d2c9ef4fefe4b6543ce051e11c6fde6549e222848615a1ad62c0
data/lib/blufin-lib.rb ADDED
@@ -0,0 +1,22 @@
1
+ module Blufin
2
+
3
+ autoload :Arrays, 'blufin-lib/core/arrays'
4
+ autoload :Browser, 'blufin-lib/core/browser'
5
+ autoload :DateTimeUtils, 'blufin-lib/core/datetime_utils'
6
+ autoload :Encryptor, 'blufin-lib/core/encryptor'
7
+ autoload :Files, 'blufin-lib/core/files'
8
+ autoload :Network, 'blufin-lib/core/network'
9
+ autoload :Numbers, 'blufin-lib/core/numbers'
10
+ autoload :Routes, 'blufin-lib/core/routes'
11
+ autoload :SSH, 'blufin-lib/core/ssh'
12
+ autoload :Strings, 'blufin-lib/core/strings'
13
+ autoload :Terminal, 'blufin-lib/core/terminal'
14
+ autoload :Tools, 'blufin-lib/core/tools'
15
+
16
+ module Test
17
+
18
+ autoload :EnvironmentValidator, 'blufin-lib/test/TestEnvironmentValidator'
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ module Blufin
2
+
3
+ class Arrays
4
+
5
+ # Checks if an array has duplicates.
6
+ # @return boolean
7
+ def self.array_has_duplicate(array, ignore_case = false)
8
+ raise RuntimeError, "Expected Array, but got #{array.class}" unless array.is_a?(Array)
9
+ array = array.dup
10
+ if ignore_case
11
+ array.map! { |name| name.downcase }
12
+ end
13
+ !(array.uniq.length == array.length)
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,30 @@
1
+ require 'watir-webdriver'
2
+
3
+ module Blufin
4
+
5
+ class Browser
6
+
7
+ # Get a Watir Browser object.
8
+ # @return [Watir::Browser]
9
+ def self.get(headless = false)
10
+
11
+ # Set the path to phantomjs executable
12
+ Selenium::WebDriver::PhantomJS.path = '/usr/local/bin/phantomjs'
13
+
14
+ browser = Watir::Browser.new (headless ? :phantomjs : :chrome), :switches => %w(--ignore-certificate-errors --test-type)
15
+
16
+ width = 1440
17
+ height = 2000
18
+ x = 0
19
+ y = -0
20
+
21
+ browser.window.move_to(x, y)
22
+ browser.window.resize_to(width, height)
23
+ browser.window.use
24
+ browser
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,14 @@
1
+ module Blufin
2
+
3
+ class DateTimeUtils
4
+
5
+ # Returns the current DateTime as string. Default format is: %d/%m/%Y %H:%M:%S
6
+ # @return String
7
+ def self.now(format = nil)
8
+ format = '%Y/%m/%d %H:%M:%S' if format.nil?
9
+ Time.now.strftime(format)
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,53 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+
4
+ module Blufin
5
+
6
+ class Encryptor
7
+
8
+ def initialize(key = nil, hex = nil)
9
+
10
+ @key = key
11
+ @hex = hex
12
+
13
+ raise RuntimeError, "Encryptor hasn't been properly initialized. You forgot to pass the CRYPT_KEY + CRYPT_HEX to the constructor when instantiating the class." if @key.nil? || @hex.nil?
14
+
15
+ end
16
+
17
+ def encrypt(string)
18
+
19
+ c = OpenSSL::Cipher.new('aes-256-cbc')
20
+ c.encrypt
21
+ c.key = Digest::SHA1.hexdigest(@hex)[0..31]
22
+ begin
23
+ d = c.update(string)
24
+ d << c.final
25
+ return Base64.encode64(d)
26
+ rescue => e
27
+ Blufin::Terminal::error('Encryption failed', "Could not encrypt string \xe2\x86\x92 #{string == '' ? '[blank]' : Blufin::Terminal::format_invalid(string)}", false)
28
+ Blufin::Terminal::print_exception(e)
29
+ end
30
+
31
+ end
32
+
33
+ def decrypt(string)
34
+
35
+ string_decoded = Base64.decode64(string)
36
+ c = OpenSSL::Cipher.new('aes-256-cbc')
37
+ c.decrypt
38
+ c.key = Digest::SHA1.hexdigest(@hex)[0..31]
39
+ begin
40
+ d = c.update(string_decoded)
41
+ d << c.final
42
+ return d
43
+ rescue => e
44
+ Blufin::Terminal::error('Decryption failed', "Could not decrypt string \xe2\x86\x92 #{string == '' ? '[blank]' : Blufin::Terminal::format_invalid(string)}", false)
45
+ Blufin::Terminal::print_exception(e)
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,385 @@
1
+ require 'fileutils'
2
+ require 'parseconfig'
3
+
4
+ module Blufin
5
+
6
+ class Files
7
+
8
+ JAVA_AUTO_GENERATED_EVERY_RUN = 'java_auto_generated_every_run'
9
+ JAVA_AUTO_GENERATED_ONCE = 'java_auto_generated_once'
10
+
11
+ # Same as write_file() but for Java files. If arrange_imports = TRUE (default) it
12
+ # will sort the import statements in the same order as IntelliJ would.
13
+ # @return String
14
+ def self.write_file_java(path_and_file, array_of_lines, auto_generated = JAVA_AUTO_GENERATED_EVERY_RUN)
15
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
16
+ auto_generated_valid = [JAVA_AUTO_GENERATED_EVERY_RUN, JAVA_AUTO_GENERATED_ONCE]
17
+ raise RuntimeError, "Expected .java file, instead got: #{path_and_file}" unless path_and_file =~ /\.java\z/
18
+ raise RuntimeError, "auto_generated must be one of the following: #{auto_generated_valid.join(', ')}" unless auto_generated_valid.include?(auto_generated)
19
+ package = nil
20
+ import_statements_one = []
21
+ import_statements_two = []
22
+ previous_was_blank = false
23
+ annotations_one = []
24
+ annotations_two = []
25
+ contents = []
26
+ array_of_lines.each do |line|
27
+ if contents.any?
28
+ next if line.strip == '' && previous_was_blank
29
+ previous_was_blank = false
30
+ contents << line
31
+ previous_was_blank = true if line.strip == ''
32
+ next
33
+ end
34
+ if package.nil? && line.strip =~ /^package\s+[A-Za-z0-9\._-]+;$/
35
+ # Get package.
36
+ raise RuntimeError, "Package has a hyphen in it \xe2\x86\x92 \x1B[38;5;184m#{line.strip}\x1B[0m. When this file's contents were generated you forgot a .gsub() statement to replace it." if line.strip =~ /-/
37
+ package = line.strip
38
+ next
39
+ elsif line.strip =~ /^import\s+[A-Za-z0-9\.*_-]+;$/ || line.strip =~ /^import\s+static\s+[A-Za-z0-9\.*_-]+;$/
40
+ # Get import statements.
41
+ raise RuntimeError, "Import has a hyphen in it \xe2\x86\x92 \x1B[38;5;184m#{line.strip}\x1B[0m. When this file's contents were generated you forgot a .gsub() statement to replace it." if line.strip =~ /-/
42
+ import_statements_one << line.strip
43
+ next
44
+ elsif !contents.any? && line.strip =~ /^@(.)+$/
45
+ annotations_one << line.strip
46
+ elsif !contents.any? && line.strip =~ /^(public|private|protected)\s+.*(class|enum)\s+.*\{$/
47
+ contents << line.strip
48
+ next
49
+ end
50
+ end
51
+ raise RuntimeError, "Couldn't parse content for: #{path_and_file}" unless contents.any?
52
+ # Add @AutoGenerated + @TestNotRequired stuff.
53
+ import_statements_one << 'import org.blufin.base.annotations.AutoGenerated;'
54
+ import_statements_one << 'import org.blufin.base.annotations.TestNotRequired;'
55
+ import_statements_one << 'import org.blufin.base.annotations.helper.ON;'
56
+ annotations_one.each do |annotation|
57
+ next if %w(@TestNotRequired @AutoGenerated @AutoGenerated(ON.EVERY_RUN) @AutoGenerated(ON.CREATION_ONLY)).include?(annotation)
58
+ annotations_two << annotation
59
+ end
60
+ annotations_two << '@TestNotRequired'
61
+ annotations_two << ((auto_generated == JAVA_AUTO_GENERATED_EVERY_RUN) ? '@AutoGenerated(ON.EVERY_RUN)' : '@AutoGenerated(ON.CREATION_ONLY)')
62
+ annotations_two.uniq!
63
+ import_statements_one.uniq!
64
+ import_statements_one.sort!
65
+ package_path = package.gsub(/package\s/, '').gsub(/;/, '').strip
66
+
67
+ # Figure out which import statements to "keep" -- IE: Are they being used?
68
+ import_statements_one.each do |import_statement|
69
+
70
+ import_statement_path = []
71
+ import_statement_split = import_statement.gsub(/import\s/, '').gsub(/;/, '').strip.split('.')
72
+ import_statement_split.each_with_index { |n, idx| import_statement_path << n unless idx == (import_statement_split.length - 1) }
73
+
74
+ # Skip import if we're in the same package.
75
+ next if import_statement_path.join('.') == package_path
76
+
77
+ found = false
78
+ is = import_statement.split('.')
79
+ is = is[is.length - 1].gsub(';', '').strip
80
+ if is == '*'
81
+ import_statements_two << import_statement
82
+ next
83
+ end
84
+ annotations_two.each do |annotation|
85
+ if annotation =~ /@#{is}/ || annotation =~ /[\(\.]#{is}[\)\.]/
86
+ found = true
87
+ break
88
+ end
89
+ end
90
+ unless found
91
+ contents.each do |content_line|
92
+ if content_line =~ /[<\(\s{]#{is}[\.<>,\s\(\)]/ || content_line =~ /@#{is}[\(]?/
93
+ found = true
94
+ break
95
+ end
96
+ end
97
+ end
98
+ import_statements_two << import_statement if found
99
+ end
100
+ import_statement_counter = {}
101
+ import_statement_tracker = {}
102
+ # Convert multiple imports to .*
103
+ import_statements_two.each do |import_statement|
104
+ is = import_statement.split('.')
105
+ is = is.first(is.length - 1).join('.')
106
+ import_statement_counter[is] = 0 if import_statement_counter[is].nil?
107
+ import_statement_counter[is] += 1
108
+ import_statement_tracker[is] = [] if import_statement_tracker[is].nil?
109
+ import_statement_tracker[is] << import_statement
110
+ end
111
+ import_statements_one = []
112
+ import_statements_two.each do |import_statement|
113
+ is = import_statement.split('.')
114
+ is = is.first(is.length - 1).join('.')
115
+ if import_statement_counter[is] > 5
116
+ import_statements_one << "#{is}.*;"
117
+ else
118
+ import_statements_one << import_statement
119
+ end
120
+ end
121
+ import_statements_one.uniq!
122
+ import_statements_one.sort!
123
+ # Re-assemble the file.
124
+ final_written_java_non = 0
125
+ final_written_java = 0
126
+ final_contents = [package, '']
127
+ # Write NON-JAVA statements.
128
+ import_statements_one.each do |import_statement|
129
+ unless import_statement =~ /^import\s+java/ || import_statement =~ /^import\s+static/
130
+ final_contents << import_statement
131
+ final_written_java_non += 1
132
+ end
133
+ end
134
+ static_statement_found = false
135
+ # Write STATIC statements.
136
+ import_statements_one.each do |import_statement|
137
+ if import_statement =~ /^import\s+static/
138
+ unless static_statement_found
139
+ final_contents << ''
140
+ static_statement_found = true
141
+ end
142
+ final_contents << import_statement
143
+ final_written_java += 1
144
+ end
145
+ end
146
+ final_contents << '' if final_written_java_non > 0
147
+ # Write JAVA statements.
148
+ import_statements_one.each do |import_statement|
149
+ if import_statement =~ /^import\s+java/
150
+ final_contents << import_statement
151
+ final_written_java += 1
152
+ end
153
+ end
154
+ final_contents << '' if final_written_java > 0
155
+ annotations_two.each { |line| final_contents << line } if annotations_two.any?
156
+ contents.each { |line| final_contents << line } if contents.any?
157
+ return self.write_file(path_and_file, final_contents)
158
+ end
159
+
160
+ # Write an "Array of Lines" to a file -- overwrites file if exists!
161
+ # @return String
162
+ def self.write_file(path_and_file, array_of_lines)
163
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
164
+ path_and_file = File.expand_path(path_and_file)
165
+ raise RuntimeError, "Expected an array of lines to write to file, instead got: #{array_of_lines.class}" unless array_of_lines.is_a? Array
166
+ prepare_for_file_write(path_and_file)
167
+ begin
168
+ File.open(path_and_file, 'w') { |file|
169
+ array_of_lines.each_with_index do |line, index|
170
+ if index == array_of_lines.size - 1
171
+ file.write("#{line}") unless line.to_s.strip == ''
172
+ else
173
+ file.write("#{line}\n")
174
+ end
175
+ end
176
+ file.close
177
+ }
178
+ rescue Exception => e
179
+ Blufin::Terminal::print_exception(e)
180
+ end
181
+ path_and_file
182
+ end
183
+
184
+ # Write a "String" to a file -- overwrites file if exists!
185
+ # @return void
186
+ def self.write_file_string(path_and_file, content)
187
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
188
+ path_and_file = File.expand_path(path_and_file)
189
+ raise RuntimeError, "Expected String to write to file, instead got: #{content.class}" unless content.is_a? String
190
+ prepare_for_file_write(path_and_file)
191
+ begin
192
+ File.open(path_and_file, 'w') { |file|
193
+ file.write("#{content}")
194
+ file.close
195
+ }
196
+ rescue Exception => e
197
+ Blufin::Terminal::print_exception(e)
198
+ end
199
+ end
200
+
201
+ # Writes a line to a file.
202
+ # regex -> If a value exists the program checks for this regex and writes on the line AFTER match(es). if nil (or not found), writes at the end of file.
203
+ # only_if_not_exists -> If TRUE, will add line only if it doesn't already exist.
204
+ # replace -> If TRUE, will replace file rather than writing on next line after regex.
205
+ # @return void
206
+ def self.write_line_to_file(path_and_file, line, regex = nil, only_if_not_exists = true, replace = false)
207
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
208
+ path_and_file = File.expand_path(path_and_file)
209
+ raise RuntimeError, "File not found: #{path_and_file}" unless file_exists(path_and_file)
210
+ raise RuntimeError, "Expected String to write to file, instead got: #{line.class}" unless line.is_a? String
211
+ raise RuntimeError, "Expected Regexp to match to line, instead got: #{regex.class}" unless regex.nil? || regex.is_a?(Regexp)
212
+ raise RuntimeError, 'Cannot set replace to TRUE when regex is nil.' if regex.nil? && replace
213
+ raise RuntimeError, 'only_if_not_exists must be set to FALSE when replace is TRUE.' if only_if_not_exists && replace
214
+ new_lines = []
215
+ if only_if_not_exists
216
+ line_found = false
217
+ read_file(path_and_file).each do |line_content|
218
+ line_content.gsub!(/\n\z/, '')
219
+ line_found = true if line_content == line
220
+ end
221
+ return if line_found
222
+ end
223
+ if !regex.nil? && !replace
224
+ regex_found = false
225
+ line_inserted = false
226
+ read_file(path_and_file).each do |line_content|
227
+ line_content.gsub!(/\n\z/, '')
228
+ regex_found = true if line_content =~ regex
229
+ if regex_found && line_content !~ regex && !line_inserted
230
+ new_lines << line
231
+ line_inserted = true
232
+ end
233
+ new_lines << line_content
234
+ end
235
+ new_lines << line unless line_inserted
236
+ elsif !regex.nil? && replace
237
+ regex_found = false
238
+ read_file(path_and_file).each do |line_content|
239
+ line_content.gsub!(/\n\z/, '')
240
+ if !regex_found && line_content =~ regex
241
+ regex_found = true
242
+ new_lines << line
243
+ else
244
+ new_lines << line_content
245
+ end
246
+ end
247
+ end
248
+ write_file(path_and_file, new_lines)
249
+ end
250
+
251
+ # Removes a line from a file.
252
+ # multiple_occurrences -> If set to TRUE, will remove ALL occurrences from file.
253
+ # @return void
254
+ def self.remove_line_from_file(path_and_file, regex, multiple_occurrences = false)
255
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
256
+ path_and_file = File.expand_path(path_and_file)
257
+ raise RuntimeError, "Expected Regexp to match to line, instead got: #{regex.class}" unless regex.is_a? Regexp
258
+ raise RuntimeError, "File not found: #{path_and_file}" unless file_exists(path_and_file)
259
+ new_lines = []
260
+ line_removed = false
261
+ read_file(path_and_file).each do |line_content|
262
+ line_content.gsub!(/\n\z/, '')
263
+ line_content_to_match = line_content.strip
264
+ if line_content_to_match =~ regex
265
+ if multiple_occurrences
266
+ next
267
+ else
268
+ unless line_removed
269
+ line_removed = true
270
+ next
271
+ end
272
+ end
273
+ end
274
+ new_lines << line_content
275
+ end
276
+ write_file(path_and_file, new_lines)
277
+ end
278
+
279
+ # Get content of a file as an "Array of Lines"
280
+ # @return Array
281
+ def self.read_file(path_and_file, start_line = nil, end_line = nil)
282
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
283
+ line_count = 0
284
+ path_and_file = File.expand_path(path_and_file)
285
+ raise RuntimeError, "File not found: #{path_and_file}" unless file_exists(path_and_file)
286
+ raise RuntimeError, "start_line (#{start_line}) cannot be bigger than end_line (#{end_line})." if (!start_line.nil? && !end_line.nil?) && (start_line > end_line)
287
+ file_content = []
288
+ file = File.open(path_and_file).read
289
+ file.gsub!(/\r\n?/, "\n")
290
+ file.each_line do |line|
291
+ line_count += 1
292
+ next if !start_line.nil? && start_line > line_count
293
+ next if !end_line.nil? && end_line < line_count
294
+ file_content << line
295
+ end
296
+ file_content
297
+ end
298
+
299
+ # Deletes a file (if exists)
300
+ # @return void
301
+ def self.delete_file(path_and_file)
302
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
303
+ FileUtils.rm(File.expand_path(path_and_file)) if file_exists(path_and_file)
304
+ end
305
+
306
+ # Returns TRUE or FALSE depending whether a path exists.
307
+ # @return void
308
+ def self.path_exists(path)
309
+ raise RuntimeError, "Expected String, instead got:#{path.class}" unless path.is_a?(String)
310
+ File.directory?(File.expand_path(path))
311
+ end
312
+
313
+ # Returns TRUE or FALSE depending whether a path exists.
314
+ # @return void
315
+ def self.file_exists(path_and_file)
316
+ raise RuntimeError, "Expected String, instead got:#{path_and_file.class}" unless path_and_file.is_a?(String)
317
+ File.exist?(File.expand_path(path_and_file))
318
+ end
319
+
320
+ # Get full path, IE: '~/Repos' would become '/Users/Albert/Repos'
321
+ # @return String
322
+ def self.get_full_path(path)
323
+ raise RuntimeError, "Expected String, instead got:#{path.class}" unless path.is_a?(String)
324
+ "/#{Blufin::Strings.remove_surrounding_slashes(File.expand_path(path))}"
325
+ end
326
+
327
+ # Get and array of files in a directory.
328
+ # @return Array
329
+ def self.get_files_in_dir(path, only_with_extension = nil)
330
+ raise RuntimeError, "Expected String, instead got:#{path.class}" unless path.is_a?(String)
331
+ path = "/#{Blufin::Strings.remove_surrounding_slashes(File.expand_path(path))}"
332
+ raise RuntimeError, "Directory doesn't exist: #{path}" unless path_exists(path)
333
+ files = Dir.glob("#{path}/**/*.#{only_with_extension.nil? ? '*' : only_with_extension}")
334
+ files.uniq.sort
335
+ end
336
+
337
+ # Get and array of directories in a directory.
338
+ # @return Array
339
+ def self.get_dirs_in_dir(path, recursive = false)
340
+ raise RuntimeError, "Expected String, instead got:#{path.class}" unless path.is_a?(String)
341
+ path = "/#{Blufin::Strings.remove_surrounding_slashes(File.expand_path(path))}"
342
+ raise RuntimeError, "Directory doesn't exist: #{path}" unless path_exists(path)
343
+ dirs = Dir.glob("#{path}/**/*/")
344
+ unless recursive
345
+ root_dirs = []
346
+ root_length = path.split('/').length
347
+ dirs.each do |dir|
348
+ root_dirs << dir if dir.split('/').length == root_length + 1
349
+ end
350
+ dirs = root_dirs
351
+ end
352
+ dirs.map! { |value| value.gsub(/\/\z/, '') }
353
+ dirs
354
+ end
355
+
356
+ # Create a directory recursively (if it doesn't already exist).
357
+ # @return String
358
+ def self.create_directory(path)
359
+ begin
360
+ path = File.expand_path(path)
361
+ FileUtils.mkpath(path) unless path_exists(path)
362
+ path
363
+ rescue => e
364
+ Blufin::Terminal::print_exception(e)
365
+ end
366
+ end
367
+
368
+ # Proxy function for the above.
369
+ # @return void
370
+ def self.create_path(path)
371
+ create_directory(path)
372
+ end
373
+
374
+ private
375
+
376
+ # Creates path (if not exists) and deletes file (if exists).
377
+ # @return void
378
+ def self.prepare_for_file_write(path_and_file)
379
+ FileUtils::mkdir_p(File.dirname(path_and_file)) unless path_exists(File.dirname(path_and_file))
380
+ File.delete(path_and_file) if file_exists(path_and_file)
381
+ end
382
+
383
+ end
384
+
385
+ end