rbtils 0.0.1

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.
@@ -0,0 +1,14 @@
1
+ module Granify
2
+ module Controller
3
+ class Branch < Controller::Base
4
+ def current
5
+ Notify.info("Current branch: #{Command::Exec.git_current_branch}")
6
+ end
7
+
8
+ def recent
9
+ # TODO: format this
10
+ Notify.spit Command::Exec.global("git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes --count=10")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module Granify
2
+ module Controller
3
+ class Clean < Controller::Base
4
+ # force clean logs
5
+ def logs
6
+ Logs.clean
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,72 @@
1
+ module Granify
2
+ module Controller
3
+ class Hound < Controller::Base
4
+ def coffee
5
+ m = @model.data
6
+
7
+ if m.below_acceptable_limit?
8
+ Notify.info("Linting #{m.status[:total]} coffeescript files\nPrinting files with errors")
9
+
10
+ m.files_with_errors.each do |file|
11
+ Notify.spit(file)
12
+ end
13
+
14
+ success_message(m)
15
+ else
16
+ if m.log.exists?
17
+ @model.command.open_editor(m.log)
18
+ end
19
+
20
+ error_message(m, :coffeescript)
21
+ end
22
+
23
+ Notify.bubble("Running coffeescript files through coffeelint", "Linting...")
24
+ end
25
+
26
+ def widgets
27
+ m = @model.data
28
+
29
+ if m.below_acceptable_limit?
30
+ Notify.info("Linting #{m.status[:total]} coffeescript files\nPrinting files with errors")
31
+
32
+ m.files_with_errors.each do |file|
33
+ Notify.spit(file)
34
+ end
35
+
36
+ success_message(m)
37
+ else
38
+ if m.log.exists?
39
+ @model.command.open_editor(m.log)
40
+ end
41
+
42
+ error_message(m, :coffeescript)
43
+ end
44
+
45
+ Notify.bubble("Running coffeescript files through coffeelint", "Linting...")
46
+ end
47
+
48
+ def ruby
49
+ m = @model.data
50
+
51
+ if m.below_acceptable_limit?
52
+ Notify.info("Pass rate is above the acceptable limit, proceeding to next step")
53
+ else
54
+ error_message(m, :ruby)
55
+ end
56
+
57
+ Notify.bubble("Running ruby files through rubocop.", "Linting...")
58
+ end
59
+
60
+ private
61
+ def error_message(m, type)
62
+ post_exec
63
+ Notify.warning("#{m.issues[:errors]} error(s), #{m.status[:errors_per_file]} EPF - EPF must be less than 5\n#{m.success_rate[:str]} success rate - 90% required")
64
+ Notify.error("Too many #{type} errors to continue. Errors logged to:\n#{m.log}")
65
+ end
66
+
67
+ def success_message(m)
68
+ Notify.spit("\nResults:\n - #{Style.format(m.status[:success].to_s + " passed", :green)}\n - #{Style.format(m.status[:error].to_s + " failed", :red)}\nSuccess rate: #{Style.format(m.success_rate[:str], :green)}\nErrors logged to #{Style.format(m.log, :green)}")
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,40 @@
1
+ module Granify
2
+ module Controller
3
+ class Minify < Controller::Base
4
+ # Purpose: minify all JS files in the current directory, move them to a
5
+ # min directory and rename them file.min.js
6
+ @@folder = :min
7
+
8
+ # We don't need to clean logs here
9
+ def post_exec
10
+ false
11
+ end
12
+
13
+ def all
14
+ # future method
15
+ Notify.warning("Method not implemented")
16
+ end
17
+
18
+ def js
19
+ min_folder = Utils.mklocaldir(@@folder)
20
+ files = Utils.get_files(:js)
21
+ command = Command::Exec.new
22
+
23
+ if files.size > 0
24
+ files.each do |file|
25
+ command.minify(file, min_folder)
26
+ end
27
+
28
+ Notify.bubble("Minified #{files.size} files.", "Success")
29
+ else
30
+ Notify.warning("No JS files detected in this directory")
31
+ end
32
+ end
33
+
34
+ def cs
35
+ # future method
36
+ Notify.warning("Method not implemented")
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ module Granify
2
+ module Controller
3
+ class Open < Controller::Base
4
+ def files
5
+ begin
6
+ files = []
7
+
8
+ if !$request.custom.nil? && $request.custom.size > 0
9
+ # pull file list from CLI args
10
+ $request.custom.each do |requested_file|
11
+ files.push(requested_file) if File.exists? requested_file.to_s
12
+ end
13
+ else
14
+ raise ::ArgumentError, "Command requires a list of files to open\ni.e. #{Granify::PACKAGE_NAME} open files file1.ext file2.ext file3.ext"
15
+ end
16
+
17
+ # we have some files, lets open them
18
+ if files.size > 0
19
+ `$EDITOR -n #{files.join(' ')}`
20
+
21
+ Notify.success("Opened #{files.size} file(s) in sublime text")
22
+ else
23
+ Notify.warning("The requested files (#{$request.custom.join(', ')}) could not be opened")
24
+ end
25
+
26
+ rescue => e
27
+ Notify.error(e.message)
28
+ end
29
+ end
30
+
31
+ def files_from_log
32
+ begin
33
+ files = []
34
+
35
+ if File.exists? $request.custom[0].to_s
36
+ # pull file list from a log file
37
+ files = IO.readlines($request.custom[0].to_s)
38
+ files.each do |l|
39
+ l.gsub!(/\r\n?/, "")
40
+ end
41
+ else
42
+ raise ::ArgumentError, "Command requires a log file\ni.e. #{Granify::PACKAGE_NAME} open files_from_log file1.log"
43
+ end
44
+
45
+ if files.size > 0
46
+ `$EDITOR -n #{files.join(' ')}`
47
+
48
+ Notify.success("Opened #{files.size} file(s) in sublime text")
49
+ else
50
+ Notify.warning("The requested files (#{$request.custom.join(', ')}) could not be opened")
51
+ end
52
+ rescue => e
53
+ Notify.error(e.message)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,41 @@
1
+ module Granify
2
+ module Controller
3
+ class Update < Controller::Base
4
+ # Setup all flags supported by this command
5
+ def pre_exec
6
+ # flag methods that require internet access
7
+ @methods_require_internet.push(:rbtils)
8
+
9
+ super
10
+ end
11
+
12
+ def rbtils
13
+ Notify.info("Checking for updates")
14
+
15
+ status = Command::Exec.global("(cd #{Granify::INSTALLED_DIR} && git checkout master && git pull) 2>&1").split("\n")
16
+
17
+ if status.include? "Your branch is up-to-date with 'origin/master'."
18
+ Notify.warning("You are running the current version of #{Granify::PACKAGE_NAME}")
19
+ else
20
+ # TODO: run on a different machine, currently this just assumes it worked..
21
+ Notify.success("Successfully updated to the latest version")
22
+ end
23
+ end
24
+
25
+ def granify
26
+ Notify.info("Checking for updates")
27
+
28
+ status = @model.command.arbitrary("git checkout master && git pull")
29
+ puts status.inspect
30
+ exit
31
+ end
32
+
33
+ def goliath
34
+ Notify.info("Checking for updates")
35
+
36
+
37
+
38
+ end
39
+ end
40
+ end
41
+ end
data/lib/helper.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Granify
2
+ module Helper
3
+ def self.load(klass, args = nil)
4
+ begin
5
+ klass_instance = Granify::Helper.const_get(klass.capitalize)
6
+
7
+ if klass_instance
8
+ if args.nil?
9
+ klass_instance.new
10
+ else
11
+ klass_instance.new(args)
12
+ end
13
+ end
14
+ rescue => e
15
+ Notify.error(e.message)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ module Granify
2
+ module Helper
3
+ class Time
4
+ def self.human_readable(start, finish)
5
+ seconds = finish.to_f - start.to_f
6
+
7
+ if seconds < 60
8
+ "No time at all!"
9
+ else
10
+ minutes = (seconds / 60).round(1)
11
+ if minutes < 1
12
+ "#{minutes} minute"
13
+ else
14
+ "#{minutes} minutes"
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.formatted(time = nil)
20
+ if time.nil?
21
+ time = ::Time.now
22
+ end
23
+
24
+ time.strftime("%e/%-m/%Y @ %I:%M:%S%P")
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/log.rb ADDED
@@ -0,0 +1,111 @@
1
+ module Granify
2
+ class Log
3
+ attr_accessor :path, :total_files_processed
4
+ attr_reader :template
5
+
6
+ def initialize(*args)
7
+ if args.length == 0
8
+ # default log
9
+ @template = "#{Granify::LOG_DIR}/%s"
10
+ @path = sprintf(@template, "default.log")
11
+ else
12
+ @template = "#{Granify::LOG_DIR}/%s/%s-%s.log"
13
+
14
+ format(args)
15
+ end
16
+
17
+ @path
18
+ end
19
+
20
+ def stale?
21
+ Time.now - last_write > 60
22
+ end
23
+
24
+ def exists?
25
+ File.exist? @path
26
+ end
27
+
28
+ def delete
29
+ if exists?
30
+ File.delete @path
31
+ end
32
+
33
+ Notify.sinfo("Deleting truncated log file #{@path}")
34
+ @path = nil
35
+ end
36
+
37
+ def num_lines
38
+ File.foreach(@path).inject(0) {|c, line| c+1}
39
+ end
40
+
41
+ def faults
42
+ matchdata = { :errors => 0, :warnings => 0, :total => 0 }
43
+
44
+ begin
45
+ case @log_type
46
+ when :js
47
+ last_line = IO.readlines(@path)[-5].chomp
48
+ matches = last_line.match(/(\d+) example, (\d+) failure/)
49
+
50
+ if matches
51
+ matchdata[:errors] += matches[2].to_i
52
+ end
53
+ when :coffeelint
54
+ total = 0
55
+ File.foreach(@path) do |line|
56
+ matches = line.match(/Lint\! » (\d+) errors and (\d+)/)
57
+
58
+ if matches
59
+ matchdata[:errors] += matches[1].to_i
60
+ matchdata[:warnings] += matches[2].to_i
61
+ end
62
+ end
63
+ when :ruby
64
+ last_line = IO.readlines(@path)[-1].chomp
65
+ matches = last_line.match(/(\d+) files inspected\, (\d+)/)
66
+
67
+ if matches
68
+ matchdata[:errors] += matches[2].to_i
69
+ matchdata[:total] += matches[1].to_i
70
+ end
71
+ when :goliath
72
+
73
+ else
74
+ raise ArgumentError, "Unknown log type - #{log_type}"
75
+ end
76
+ rescue => e
77
+ Notify.error(e.message)
78
+ end
79
+
80
+ matchdata
81
+ end
82
+
83
+ def to_s
84
+ @path
85
+ end
86
+
87
+ private
88
+ def format(args)
89
+ @identifier = args[2]
90
+
91
+ @path = sprintf(@template,
92
+ @identifier,
93
+ args[0],
94
+ args[1].strftime('%Y-%m-%d-%T')
95
+ )
96
+
97
+ if !File.exists? @path
98
+ Utils.generate_path(args[0], args[1].strftime('%Y-%m-%d-%T'), @identifier)
99
+ end
100
+
101
+ # create the log file, populate it with temporary data
102
+ File.open(@path, 'w+') do |f|
103
+ f.write("Command output will be logged below when it finishes running\n")
104
+ end
105
+ end
106
+
107
+ def last_write
108
+ File.mtime(@path)
109
+ end
110
+ end
111
+ end
data/lib/logs.rb ADDED
@@ -0,0 +1,34 @@
1
+ module Granify
2
+ class Logs
3
+ MAX_LOGS_TO_STORE = 30
4
+
5
+ @files = Dir["#{Granify::LOG_DIR}/*/*.log"]
6
+
7
+ def self.clean
8
+ if @files.size > 0
9
+ @files.each do |file|
10
+ File.delete file if File.exist? file
11
+ end
12
+ Notify.info("Removed #{@files.size} old log files")
13
+ end
14
+ end
15
+
16
+ def self.dirty?
17
+ @files.size >= MAX_LOGS_TO_STORE
18
+ end
19
+
20
+ # Create a directory if required
21
+ def self.mkdir(name)
22
+ dir = "#{Granify::LOG_DIR}/#{name.downcase}"
23
+
24
+ if !Dir.exist? dir
25
+ Dir.mkdir dir
26
+ end
27
+
28
+ # Create the default .gitignore
29
+ File.open("#{dir}/.gitignore", "w+") do |file|
30
+ file.write "# Ignore everything in this directory\n*\n# Except this file\n!.gitignore"
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/model.rb ADDED
@@ -0,0 +1,26 @@
1
+ module Granify
2
+ module Model
3
+ class Base
4
+ attr_accessor :data, :branch, :browser, :command, :start
5
+
6
+ def initialize(hash = nil)
7
+ @data = hash || Granify::Model::Data.new
8
+
9
+ # Current time
10
+ #@time = @data.start
11
+ # Time the command was executed
12
+ @start = Time.now
13
+ # Current working branch
14
+ @branch = @data.branch
15
+ # Browser to execute tests in
16
+ @browser = @data.browser
17
+ # Instantiate the command execution class
18
+ @command = Command::Exec.new
19
+ end
20
+
21
+ def bind(hash)
22
+ initialize(hash)
23
+ end
24
+ end
25
+ end
26
+ end