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.
- checksums.yaml +7 -0
- data/lib/command.rb +179 -0
- data/lib/config.rb +52 -0
- data/lib/configs/coffeelint.json +116 -0
- data/lib/constants.rb +15 -0
- data/lib/controller.rb +127 -0
- data/lib/controllers/branch.rb +14 -0
- data/lib/controllers/clean.rb +10 -0
- data/lib/controllers/hound.rb +72 -0
- data/lib/controllers/minify.rb +40 -0
- data/lib/controllers/open.rb +58 -0
- data/lib/controllers/update.rb +41 -0
- data/lib/helper.rb +19 -0
- data/lib/helpers/time.rb +28 -0
- data/lib/log.rb +111 -0
- data/lib/logs.rb +34 -0
- data/lib/model.rb +26 -0
- data/lib/model_data.rb +97 -0
- data/lib/models/hound.rb +232 -0
- data/lib/request.rb +20 -0
- data/lib/router.rb +73 -0
- data/lib/utils.rb +123 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b00e004f6a120b2c92a986e94d15ec4bdf84cecc
|
4
|
+
data.tar.gz: 8e5362f564d74b21410eadcc0b9c883431fa9e80
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 61afcde4aec89976cf123edd60358ea1ac5e5a78bd18c0a9804d90102afb7486781dbce6b96c167f02a317c5019b7688b074105e7a4d3ffef34dcd51085a1590
|
7
|
+
data.tar.gz: 7e77c88344481538327a336b42f027614a8ef1a809903f271cace7cce2f2f83fc861bd9b723cd8594782c5719d4a6ccacc51566dc2582a3fad575bc5d8a471ed
|
data/lib/command.rb
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
module Granify
|
2
|
+
module Command
|
3
|
+
class Exec
|
4
|
+
attr_reader :response, :exitcode
|
5
|
+
attr_accessor :enable_logging
|
6
|
+
|
7
|
+
#
|
8
|
+
# class methods
|
9
|
+
#
|
10
|
+
class << self
|
11
|
+
def git_queue_status
|
12
|
+
if global("git log origin/#{git_current_branch}..HEAD --oneline")
|
13
|
+
response = @response.split("\n")
|
14
|
+
response.size > 0
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def git_push
|
19
|
+
global("git push -q origin #{git_current_branch}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def git_checkout
|
23
|
+
begin
|
24
|
+
curr_branch = git_current_branch
|
25
|
+
branch = $request.custom.nil? ? curr_branch : $request.custom[0]
|
26
|
+
|
27
|
+
if !git_branch_verify branch
|
28
|
+
raise "Requested branch not found in the working copy: #{branch}"
|
29
|
+
end
|
30
|
+
|
31
|
+
if branch == curr_branch
|
32
|
+
return Notify.warning("Requested branch is already checked out, skipping checkout")
|
33
|
+
else
|
34
|
+
global("git checkout -q #{branch}")
|
35
|
+
end
|
36
|
+
|
37
|
+
# not found locally, checkout from origin
|
38
|
+
if !@response
|
39
|
+
branch = "origin/#{branch}"
|
40
|
+
global("git checkout -q #{branch}")
|
41
|
+
end
|
42
|
+
|
43
|
+
if !@response
|
44
|
+
Notify.error("Unable to locate #{branch} on the remote server or local working copy")
|
45
|
+
end
|
46
|
+
|
47
|
+
branch
|
48
|
+
rescue SystemExit, Interrupt
|
49
|
+
Notify.error("Interrupt caught, exiting")
|
50
|
+
rescue RuntimeError => e
|
51
|
+
Notify.error(e.message)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def git_current_branch
|
56
|
+
global("git rev-parse --abbrev-ref HEAD")
|
57
|
+
end
|
58
|
+
|
59
|
+
def git_branch_verify(branch = nil)
|
60
|
+
if branch.nil?
|
61
|
+
branch = git_current_branch
|
62
|
+
end
|
63
|
+
|
64
|
+
global("git rev-parse --verify #{branch}")
|
65
|
+
end
|
66
|
+
|
67
|
+
def global(command, file = nil)
|
68
|
+
begin
|
69
|
+
# disable logging if user settings prohibit it
|
70
|
+
#file = nil if !@enable_logging
|
71
|
+
# default value for exit code is an error
|
72
|
+
@exitcode = 1
|
73
|
+
|
74
|
+
@response = `#{command}`.chomp
|
75
|
+
@exitcode = $?.exitstatus
|
76
|
+
|
77
|
+
# Log output to a file
|
78
|
+
# This method is better than redirecting output to a file because now
|
79
|
+
# the response is always populated instead of being empty when output
|
80
|
+
# is sent to the log file
|
81
|
+
if file
|
82
|
+
File.open(file.path, 'w+') do |f|
|
83
|
+
f.write(@response)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@response
|
88
|
+
rescue SystemExit, Interrupt
|
89
|
+
Notify.error("Interrupt caught, exiting")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
# instance methods
|
96
|
+
#
|
97
|
+
def minify(file, destination)
|
98
|
+
begin
|
99
|
+
min_file = "#{destination}#{File.basename(file, File.extname(file))}.min.js"
|
100
|
+
|
101
|
+
@response = `uglifyjs #{file} -cm -o "#{min_file}"`
|
102
|
+
|
103
|
+
Notify.success("Minified #{file}")
|
104
|
+
|
105
|
+
$?.exitstatus == 0
|
106
|
+
rescue SystemExit, Interrupt
|
107
|
+
Notify.error("Interrupt caught, exiting")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def lint(file, log_file)
|
112
|
+
begin
|
113
|
+
command = `coffeelint -f "#{Granify::INSTALLED_DIR}/lib/configs/coffeelint.json" #{file}`
|
114
|
+
|
115
|
+
@response = command.include?("Ok!")
|
116
|
+
|
117
|
+
# only send errors to the log file
|
118
|
+
if !@response
|
119
|
+
File.open(log_file.path, 'a') do |f|
|
120
|
+
f.write("Logged at #{Time.now}\n============================================================\n\n")
|
121
|
+
f.write(command)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
$?.exitstatus == 0
|
126
|
+
rescue SystemExit, Interrupt
|
127
|
+
Notify.error("Interrupt caught, exiting")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def open_editor(file=nil)
|
132
|
+
begin
|
133
|
+
log_file = file || Granify::DEFAULT_LOG
|
134
|
+
|
135
|
+
# System editor is not set/unavailable, use system default to open the
|
136
|
+
# file
|
137
|
+
if `echo $EDITOR` == ""
|
138
|
+
if Utils.os == :macosx
|
139
|
+
`open #{log_file.path}`
|
140
|
+
else
|
141
|
+
`xdg-open #{log_file.path}`
|
142
|
+
end
|
143
|
+
else
|
144
|
+
`$EDITOR #{log_file.path}`
|
145
|
+
end
|
146
|
+
rescue SystemExit, Interrupt
|
147
|
+
Notify.error("Interrupt caught, exiting")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def arbitrary(command, file = nil)
|
152
|
+
begin
|
153
|
+
# default value for exit code is an error
|
154
|
+
@exitcode = 1
|
155
|
+
@response = `#{command}`.chomp
|
156
|
+
@exitcode = $?.exitstatus
|
157
|
+
|
158
|
+
# Log output to a file
|
159
|
+
# This method is better than redirecting output to a file because now
|
160
|
+
# the response is always populated instead of being empty when output
|
161
|
+
# is sent to the log file
|
162
|
+
if file
|
163
|
+
File.open(file.path, 'w+') do |f|
|
164
|
+
f.write("Logged at #{Time.now}\n============================================================\n\n")
|
165
|
+
f.write(@response)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
@exitcode == 0
|
170
|
+
|
171
|
+
# support chaining
|
172
|
+
self
|
173
|
+
rescue SystemExit, Interrupt
|
174
|
+
Notify.error("Interrupt caught, exiting")
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
data/lib/config.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Granify
|
2
|
+
class Cfg
|
3
|
+
def bootstrap!
|
4
|
+
begin
|
5
|
+
# configure Notifaction gem
|
6
|
+
Notify.configure do |c|
|
7
|
+
c.plugins = []
|
8
|
+
end
|
9
|
+
|
10
|
+
if Utils.has_internet_connection?
|
11
|
+
# check for package updates
|
12
|
+
status = Command::Exec.global("(cd #{Granify::INSTALLED_DIR} && git fetch origin && git diff master origin/master) 2>&1")
|
13
|
+
|
14
|
+
if !status.empty?
|
15
|
+
Notify.warning("You are running an outdated version of #{Granify::PACKAGE_NAME}, please run `rbtils update` to update")
|
16
|
+
end
|
17
|
+
else
|
18
|
+
Notify.warning("Update check could not be performed because you are not connected to the internet")
|
19
|
+
end
|
20
|
+
|
21
|
+
# check for missing dependencies
|
22
|
+
missing = []
|
23
|
+
|
24
|
+
# test if we have all the required commands before sending anything to
|
25
|
+
# handlers
|
26
|
+
Granify::SHELL_COMMANDS[Utils.os].each do |command|
|
27
|
+
Command::Exec.global("type \"#{command}\" > /dev/null 2>&1")
|
28
|
+
|
29
|
+
if $?.exitstatus != 0
|
30
|
+
missing.push("- "+ command)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
if !missing.empty?
|
35
|
+
Notify.error("Required system commands and/or configuration variables are not installed:\n#{missing.join("\n")}")
|
36
|
+
end
|
37
|
+
|
38
|
+
if missing.size > 0
|
39
|
+
# try to install the missing commands
|
40
|
+
#Command::Exec.global("npm install --silent -g #{missing.join(' ')}")
|
41
|
+
|
42
|
+
# commented out for now as it currently does nothing
|
43
|
+
# if $?.exitstatus > 0
|
44
|
+
# # TODO: implement other auto-install commands such as apt-get
|
45
|
+
# end
|
46
|
+
end
|
47
|
+
rescue => e
|
48
|
+
Notify.error("#{e.to_s}\n#{e.backtrace.join("\n")}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
{
|
2
|
+
"arrow_spacing": {
|
3
|
+
"level": "ignore"
|
4
|
+
},
|
5
|
+
"camel_case_classes": {
|
6
|
+
"level": "error"
|
7
|
+
},
|
8
|
+
"coffeescript_error": {
|
9
|
+
"level": "error"
|
10
|
+
},
|
11
|
+
"colon_assignment_spacing": {
|
12
|
+
"level": "ignore",
|
13
|
+
"spacing": {
|
14
|
+
"left": 0,
|
15
|
+
"right": 0
|
16
|
+
}
|
17
|
+
},
|
18
|
+
"cyclomatic_complexity": {
|
19
|
+
"value": 10,
|
20
|
+
"level": "ignore"
|
21
|
+
},
|
22
|
+
"duplicate_key": {
|
23
|
+
"level": "error"
|
24
|
+
},
|
25
|
+
"empty_constructor_needs_parens": {
|
26
|
+
"level": "ignore"
|
27
|
+
},
|
28
|
+
"ensure_comprehensions": {
|
29
|
+
"level": "warn"
|
30
|
+
},
|
31
|
+
"indentation": {
|
32
|
+
"value": 2,
|
33
|
+
"level": "error"
|
34
|
+
},
|
35
|
+
"line_endings": {
|
36
|
+
"level": "ignore",
|
37
|
+
"value": "unix"
|
38
|
+
},
|
39
|
+
"max_line_length": {
|
40
|
+
"value": 200,
|
41
|
+
"level": "ignore",
|
42
|
+
"limitComments": true
|
43
|
+
},
|
44
|
+
"missing_fat_arrows": {
|
45
|
+
"level": "ignore"
|
46
|
+
},
|
47
|
+
"newlines_after_classes": {
|
48
|
+
"value": 3,
|
49
|
+
"level": "ignore"
|
50
|
+
},
|
51
|
+
"no_backticks": {
|
52
|
+
"level": "error"
|
53
|
+
},
|
54
|
+
"no_debugger": {
|
55
|
+
"level": "warn"
|
56
|
+
},
|
57
|
+
"no_empty_functions": {
|
58
|
+
"level": "ignore"
|
59
|
+
},
|
60
|
+
"no_empty_param_list": {
|
61
|
+
"level": "ignore"
|
62
|
+
},
|
63
|
+
"no_implicit_braces": {
|
64
|
+
"level": "ignore",
|
65
|
+
"strict": true
|
66
|
+
},
|
67
|
+
"no_implicit_parens": {
|
68
|
+
"strict": true,
|
69
|
+
"level": "ignore"
|
70
|
+
},
|
71
|
+
"no_interpolation_in_single_quotes": {
|
72
|
+
"level": "ignore"
|
73
|
+
},
|
74
|
+
"no_plusplus": {
|
75
|
+
"level": "ignore"
|
76
|
+
},
|
77
|
+
"no_stand_alone_at": {
|
78
|
+
"level": "ignore"
|
79
|
+
},
|
80
|
+
"no_tabs": {
|
81
|
+
"level": "error"
|
82
|
+
},
|
83
|
+
"no_throwing_strings": {
|
84
|
+
"level": "error"
|
85
|
+
},
|
86
|
+
"no_trailing_semicolons": {
|
87
|
+
"level": "error"
|
88
|
+
},
|
89
|
+
"no_trailing_whitespace": {
|
90
|
+
"level": "error",
|
91
|
+
"allowed_in_comments": false,
|
92
|
+
"allowed_in_empty_lines": true
|
93
|
+
},
|
94
|
+
"no_unnecessary_double_quotes": {
|
95
|
+
"level": "ignore"
|
96
|
+
},
|
97
|
+
"no_unnecessary_fat_arrows": {
|
98
|
+
"level": "warn"
|
99
|
+
},
|
100
|
+
"non_empty_constructor_needs_parens": {
|
101
|
+
"level": "ignore"
|
102
|
+
},
|
103
|
+
"prefer_english_operator": {
|
104
|
+
"level": "ignore",
|
105
|
+
"doubleNotLevel": "ignore"
|
106
|
+
},
|
107
|
+
"space_operators": {
|
108
|
+
"level": "ignore"
|
109
|
+
},
|
110
|
+
"spacing_after_comma": {
|
111
|
+
"level": "ignore"
|
112
|
+
},
|
113
|
+
"transform_messes_up_line_numbers": {
|
114
|
+
"level": "warn"
|
115
|
+
}
|
116
|
+
}
|
data/lib/constants.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Granify
|
2
|
+
PACKAGE_NAME = "rbtils"
|
3
|
+
INSTALLED_DIR = File.dirname($0)
|
4
|
+
LOG_DIR = INSTALLED_DIR + "/logs"
|
5
|
+
DEFAULT_LOG = Log.new # no args means default log
|
6
|
+
HELPER_DIR = INSTALLED_DIR + "/lib/helpers/"
|
7
|
+
CONTROLLER_DIR = INSTALLED_DIR + "/lib/controllers/"
|
8
|
+
MODEL_DIR = INSTALLED_DIR + "/lib/models/"
|
9
|
+
LOG_DIGEST_LENGTH = 20
|
10
|
+
SHELL_COMMANDS = {
|
11
|
+
:macosx => %w(git uglifyjs rubocop),
|
12
|
+
:linux => %w(git uglifyjs rubocop)
|
13
|
+
}
|
14
|
+
DEBUG = false
|
15
|
+
end
|
data/lib/controller.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
module Granify
|
2
|
+
module Controller
|
3
|
+
class Base
|
4
|
+
attr_accessor :model, :helper, :methods_require_internet, :default_method
|
5
|
+
|
6
|
+
@@options = Hash.new
|
7
|
+
|
8
|
+
# Perform pre-run tasks
|
9
|
+
def pre_exec
|
10
|
+
OptionParser.new do |opt|
|
11
|
+
opt.banner = "granify controller command [...-flags]"
|
12
|
+
|
13
|
+
opt.on("-v", "--verbose", "Verbose output") do |v|
|
14
|
+
# short output
|
15
|
+
@@options[:verbose] = v
|
16
|
+
end
|
17
|
+
end.parse!
|
18
|
+
end
|
19
|
+
|
20
|
+
# Handle the request
|
21
|
+
def exec(args = [])
|
22
|
+
self.send(@default_method.to_sym)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Perform post-run cleanup tasks, such as deleting old logs
|
26
|
+
def post_exec(total_errors = 0, total_warnings = 0, total_files = 0)
|
27
|
+
# TODO: do post-test evaluation
|
28
|
+
# total_errors = @model.data.log.faults[:errors]
|
29
|
+
# total_warnings = @model.data.log.faults[:warnings]
|
30
|
+
|
31
|
+
# if @model.data.log.total_files_processed
|
32
|
+
# total_files = @model.data.log.total_files_processed
|
33
|
+
# end
|
34
|
+
|
35
|
+
if @@options[:verbose]
|
36
|
+
Notify.info("Results:\nCommand: granify #{$request.controller} #{$request.command} #{($request.flags && $request.flags.size > 0 ? $request.flags.to_json : '')}\n#{total_errors} errors and #{total_warnings} warnings in #{total_files} source files.\nTotal execution time: #{Helper::Time.human_readable(@last_model.start, Time.now)}")
|
37
|
+
end
|
38
|
+
|
39
|
+
if Logs.dirty?
|
40
|
+
Logs.clean
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Determines if the command can execute
|
45
|
+
def can_exec?(command = nil, name = nil)
|
46
|
+
@model = Granify::Model.const_get(command.capitalize).new rescue nil
|
47
|
+
@helper = Granify::Helper.const_get(command.capitalize).new rescue nil
|
48
|
+
@methods_require_internet = []
|
49
|
+
|
50
|
+
# get user-defined methods to use as a fallback
|
51
|
+
user_defined_methods = []
|
52
|
+
|
53
|
+
# timeout is the first system defined method after the user defined
|
54
|
+
# ones
|
55
|
+
for i in 0..public_methods.index(:to_json) -1
|
56
|
+
user_defined_methods.push(public_methods[i].to_sym)
|
57
|
+
end
|
58
|
+
|
59
|
+
@default_method = name || user_defined_methods.first || :sample
|
60
|
+
|
61
|
+
if !respond_to? default_method.to_sym, true
|
62
|
+
Notify.error("Command not found: #{name}")
|
63
|
+
end
|
64
|
+
|
65
|
+
true
|
66
|
+
end
|
67
|
+
|
68
|
+
# default method called by exec if no argument is passed
|
69
|
+
def sample
|
70
|
+
Notify.warning("Method not implemented");
|
71
|
+
end
|
72
|
+
|
73
|
+
def required_modules(*modules)
|
74
|
+
auto_load_required(modules).each do |type, hash|
|
75
|
+
# Make each auto-loaded module available as an instance variable
|
76
|
+
# i.e. [:hound]: @hound_controller, @hound_model, @hound_helper
|
77
|
+
# i.e. [:test]: @test_controller, @test_model, @test_helper
|
78
|
+
# Only files that exist and can be called are loaded
|
79
|
+
hash.each do |key, value|
|
80
|
+
instance_variable_set("@#{key}_#{type}".to_sym, value)
|
81
|
+
@last_model = instance_variable_get("@#{key}_model")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
# autoload and instantiate required libraries, models and helpers
|
88
|
+
def auto_load_required(modules = [])
|
89
|
+
loaded = {:controller => {}, :helper => {}, :model => {}}
|
90
|
+
|
91
|
+
begin
|
92
|
+
modules.each do |mod|
|
93
|
+
if File.exists? "#{Granify::INSTALLED_DIR}/lib/controllers/#{mod}.rb"
|
94
|
+
require "#{Granify::INSTALLED_DIR}/lib/controllers/#{mod}.rb"
|
95
|
+
|
96
|
+
loaded[:controller][mod] = Granify::Controller.const_get(mod.capitalize).new
|
97
|
+
else
|
98
|
+
raise StandardError, "Controller not found: #{mod}"
|
99
|
+
end
|
100
|
+
|
101
|
+
if File.exists? "#{Granify::INSTALLED_DIR}/lib/helpers/#{mod}.rb"
|
102
|
+
require "#{Granify::INSTALLED_DIR}/lib/helpers/#{mod}.rb"
|
103
|
+
loaded[:helper][mod] = Granify::Helper.const_get(mod.capitalize).new
|
104
|
+
|
105
|
+
# auto-instantiate new instance of helper for the new instance of the controller
|
106
|
+
loaded[:controller][mod].helper = loaded[:helper][mod]
|
107
|
+
end
|
108
|
+
|
109
|
+
if File.exists? "#{Granify::INSTALLED_DIR}/lib/models/#{mod}.rb"
|
110
|
+
require "#{Granify::INSTALLED_DIR}/lib/models/#{mod}.rb"
|
111
|
+
loaded[:model][mod] = Granify::Model.const_get(mod.capitalize).new
|
112
|
+
|
113
|
+
# auto-instantiate new instance of model for the new instance of the controller
|
114
|
+
loaded[:controller][mod].model = loaded[:model][mod]
|
115
|
+
else
|
116
|
+
loaded[:controller][mod].model = Model::Base.new
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
loaded
|
121
|
+
rescue StandardError => e
|
122
|
+
Notify.error(e.message)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|