scribbler 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.irbrc +2 -0
- data/.rvmrc +1 -1
- data/README.md +87 -40
- data/bin/scribbler +1 -1
- data/lib/scribbler.rb +63 -2
- data/lib/scribbler/base.rb +15 -191
- data/lib/scribbler/{cli.rb → cli_client.rb} +29 -29
- data/lib/scribbler/configurator.rb +61 -13
- data/lib/scribbler/executable.rb +12 -4
- data/lib/scribbler/includeables.rb +13 -43
- data/lib/scribbler/log_location.rb +13 -0
- data/lib/scribbler/logger.rb +152 -0
- data/lib/scribbler/version.rb +1 -1
- data/scribbler.gemspec +1 -0
- data/spec/lib/scribbler/base_spec.rb +16 -0
- data/spec/{scribbler/cli_spec.rb → lib/scribbler/cli_client_spec.rb} +4 -4
- data/spec/{scribbler → lib/scribbler}/configurator_spec.rb +14 -3
- data/spec/lib/scribbler/executable_spec.rb +28 -0
- data/spec/lib/scribbler/includeables_spec.rb +24 -0
- data/spec/lib/scribbler/log_location_spec.rb +11 -0
- data/spec/lib/scribbler/logger_spec.rb +172 -0
- data/spec/{scribbler → lib/scribbler}/version_spec.rb +0 -0
- data/spec/lib/scribbler_spec.rb +47 -0
- data/spec/spec_helper.rb +6 -8
- data/spec/support/examples/scribbler_example.rb +1 -1
- data/templates/scribbler.rb +3 -3
- metadata +62 -39
- data/spec/scribbler/base_spec.rb +0 -140
- data/spec/scribbler/executable_spec.rb +0 -21
- data/spec/scribbler/includeables_spec.rb +0 -9
- data/spec/scribbler_spec.rb +0 -7
@@ -1,5 +1,5 @@
|
|
1
1
|
module Scribbler
|
2
|
-
class
|
2
|
+
class CLIClient
|
3
3
|
# Run a shell command and output clean text explaining what happened
|
4
4
|
#
|
5
5
|
# command - Shell command to run
|
@@ -20,28 +20,12 @@ module Scribbler
|
|
20
20
|
# # => nothing
|
21
21
|
#
|
22
22
|
# Returns the backtick return of the command
|
23
|
-
def
|
23
|
+
def run_command(command, poptions={})
|
24
24
|
options = {:output => true}.merge(poptions)
|
25
25
|
output command if options[:output]
|
26
26
|
`#{command}`
|
27
27
|
end
|
28
28
|
|
29
|
-
# Central method for outputting text. Will serve
|
30
|
-
# as a central location for changing how Scribbler outputs
|
31
|
-
#
|
32
|
-
# text - Text to output
|
33
|
-
#
|
34
|
-
# Examples:
|
35
|
-
#
|
36
|
-
# CLI.say "Output stuff"
|
37
|
-
# # "Output stuff"
|
38
|
-
# # => "Output stuff"
|
39
|
-
#
|
40
|
-
# Returns whatever `puts` command returns
|
41
|
-
def self.say(text)
|
42
|
-
puts text
|
43
|
-
end
|
44
|
-
|
45
29
|
# Copy a list of files to one location with one output
|
46
30
|
# for the whole copy
|
47
31
|
#
|
@@ -55,7 +39,7 @@ module Scribbler
|
|
55
39
|
# # => Nothing
|
56
40
|
#
|
57
41
|
# Returns Nothing
|
58
|
-
def
|
42
|
+
def mass_copy(files, destination)
|
59
43
|
output 'cp'
|
60
44
|
files.each do |file|
|
61
45
|
run_command "cp #{file} #{destination}", :output => false
|
@@ -64,6 +48,22 @@ module Scribbler
|
|
64
48
|
|
65
49
|
private
|
66
50
|
|
51
|
+
# Central method for outputting text. Will serve
|
52
|
+
# as a central location for changing how Scribbler outputs
|
53
|
+
#
|
54
|
+
# text - Text to output
|
55
|
+
#
|
56
|
+
# Examples:
|
57
|
+
#
|
58
|
+
# CLI.say "Output stuff"
|
59
|
+
# # "Output stuff"
|
60
|
+
# # => "Output stuff"
|
61
|
+
#
|
62
|
+
# Returns whatever `puts` command returns
|
63
|
+
def say(text)
|
64
|
+
puts text
|
65
|
+
end
|
66
|
+
|
67
67
|
# Get the command and try to output a human description
|
68
68
|
# of what's happening
|
69
69
|
#
|
@@ -80,16 +80,16 @@ module Scribbler
|
|
80
80
|
# # => "Checking necessary directories are in place"
|
81
81
|
#
|
82
82
|
# Returns Nothing
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
83
|
+
def output(command)
|
84
|
+
base_command = command.split(' ').first
|
85
|
+
say out_definitions[base_command]
|
86
|
+
end
|
87
|
+
|
88
|
+
def out_definitions
|
89
|
+
Hash.new { |h,k| h[k.to_s] ||= "Running command: #{k}" }.tap { |hash|
|
90
|
+
hash["cp"] = "Coping files"
|
91
|
+
hash["mkdir"] = "Checking necessary directories are in place"
|
92
|
+
}
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -1,7 +1,55 @@
|
|
1
1
|
module Scribbler
|
2
2
|
class Configurator
|
3
|
-
|
4
|
-
|
3
|
+
attr_accessor :logs, :application_include, :template, :use_template_by_default, :log_directory
|
4
|
+
|
5
|
+
# USED FOR CONFIGURE BLOCK DEPRECATION
|
6
|
+
def config
|
7
|
+
self
|
8
|
+
end
|
9
|
+
private :config
|
10
|
+
|
11
|
+
# Gets the path of this Gem
|
12
|
+
#
|
13
|
+
# Examples:
|
14
|
+
#
|
15
|
+
# Configurator.gem_path
|
16
|
+
# # => '/some/home/.rvm/gems/ruby-1.9.3-p125/gems/scribbler-0.0.1/'
|
17
|
+
#
|
18
|
+
# Returns String of the current gem's directory path
|
19
|
+
def gem_path
|
20
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
21
|
+
end
|
22
|
+
|
23
|
+
# Gets all the paths to the template files in the gem's template directory
|
24
|
+
#
|
25
|
+
# Examples:
|
26
|
+
#
|
27
|
+
# Configurator.templates
|
28
|
+
# # => ['/some/home/.rvm/gems/ruby-1.9.3-p125/gems/scribbler-0.0.1/templates/1.rb',
|
29
|
+
# # '/some/home/.rvm/gems/ruby-1.9.3-p125/gems/scribbler-0.0.1/templates/2.rb]
|
30
|
+
#
|
31
|
+
# Returns Array of Strings of the gem's template files
|
32
|
+
def templates
|
33
|
+
Dir.glob(File.join(gem_path, 'templates', '*'))
|
34
|
+
end
|
35
|
+
|
36
|
+
# Gets the path to the default install directory. If Rails is present
|
37
|
+
# it will default to the Rails.root/config/initializers/. Otherwise
|
38
|
+
# it assumes its the $PWD/config/initializer. Should look at a cleaner
|
39
|
+
# abstraction of this
|
40
|
+
#
|
41
|
+
# Examples:
|
42
|
+
#
|
43
|
+
# Configurator.default_install_path
|
44
|
+
# # => '/some/home/projects/rails_app/config/initializers/'
|
45
|
+
#
|
46
|
+
# Returns String for best guess of a good install path
|
47
|
+
def default_install_path
|
48
|
+
begin
|
49
|
+
::Rails.root.join 'config', 'initializers', ''
|
50
|
+
rescue NameError
|
51
|
+
File.join Dir.pwd, 'config', 'initializers', ''
|
52
|
+
end
|
5
53
|
end
|
6
54
|
|
7
55
|
# Provides location for getting the directory Scribbler will place
|
@@ -14,10 +62,10 @@ module Scribbler
|
|
14
62
|
# # => "/some/path/to/log/"
|
15
63
|
#
|
16
64
|
# Returns String for log directory location
|
17
|
-
def
|
65
|
+
def log_directory
|
18
66
|
@log_directory ||= begin
|
19
67
|
Rails.root.join('log')
|
20
|
-
rescue
|
68
|
+
rescue => e
|
21
69
|
File.join Dir.pwd, 'log'
|
22
70
|
end
|
23
71
|
end
|
@@ -36,12 +84,12 @@ module Scribbler
|
|
36
84
|
# Returns boolean
|
37
85
|
#
|
38
86
|
# TODO: Allow the class we're sending the include to to be custom
|
39
|
-
def
|
87
|
+
def application_include
|
40
88
|
@application_include || false
|
41
89
|
end
|
42
90
|
|
43
91
|
# Boolean for deciding if we should use the logger template by
|
44
|
-
# by default when calling
|
92
|
+
# by default when calling Scribbler.log
|
45
93
|
#
|
46
94
|
# Default: false
|
47
95
|
#
|
@@ -51,15 +99,15 @@ module Scribbler
|
|
51
99
|
# # => false
|
52
100
|
#
|
53
101
|
# Returns boolean
|
54
|
-
def
|
102
|
+
def use_template_by_default
|
55
103
|
@use_template_by_default || false
|
56
104
|
end
|
57
105
|
|
58
106
|
# The method that sets a template for each log made with
|
59
|
-
#
|
107
|
+
# Scribbler.log
|
60
108
|
#
|
61
109
|
# The template proc is given the whole options hash that is
|
62
|
-
# passed through
|
110
|
+
# passed through Scribbler.log or YourApplication.log. So if you
|
63
111
|
# had:
|
64
112
|
#
|
65
113
|
# YourApplication.log :a_log,
|
@@ -79,16 +127,16 @@ module Scribbler
|
|
79
127
|
# "Message: options[:message]"
|
80
128
|
# end
|
81
129
|
#
|
82
|
-
# From Scribbler
|
130
|
+
# From Scribbler.configure that would be:
|
83
131
|
#
|
84
132
|
# config.template = proc do |options|
|
85
133
|
# "Message: options[:message]"
|
86
134
|
# end
|
87
135
|
#
|
88
136
|
# **Keep in mind** that the template can be ignored at any
|
89
|
-
#
|
137
|
+
# Scribbler.log call with:
|
90
138
|
#
|
91
|
-
#
|
139
|
+
# Scribbler.log :your_log, :template => false, :message "..."
|
92
140
|
#
|
93
141
|
# Default:
|
94
142
|
#
|
@@ -108,7 +156,7 @@ module Scribbler
|
|
108
156
|
#
|
109
157
|
# TODO: Block input that would break this
|
110
158
|
# TODO: Test
|
111
|
-
def
|
159
|
+
def template
|
112
160
|
@template ||= proc do |options|
|
113
161
|
begin
|
114
162
|
if_id = options[:object].present? ? options[:object].try(:id) : 'no id'
|
data/lib/scribbler/executable.rb
CHANGED
@@ -5,10 +5,18 @@ module Scribbler
|
|
5
5
|
# options - Options from command in shell
|
6
6
|
# :path - changes the path its installing config files too
|
7
7
|
#
|
8
|
-
def
|
9
|
-
install_path = options[:path] ||
|
10
|
-
|
11
|
-
|
8
|
+
def install(options={})
|
9
|
+
install_path = options[:path] || config.default_install_path
|
10
|
+
cli.run_command "mkdir -p #{install_path}"
|
11
|
+
cli.mass_copy config.templates, install_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def config
|
15
|
+
Scribbler.config
|
16
|
+
end
|
17
|
+
|
18
|
+
def cli
|
19
|
+
CLIClient.new
|
12
20
|
end
|
13
21
|
end
|
14
22
|
end
|
@@ -1,23 +1,20 @@
|
|
1
1
|
module Scribbler
|
2
|
-
class BaseIncluder # I don't love this
|
3
|
-
# Wonky way of allowing Base to include the Includeables.
|
4
|
-
# Receives require errors with this currently.
|
5
|
-
#
|
6
|
-
# Examples:
|
7
|
-
#
|
8
|
-
# BaseIncluder.include_includeables
|
9
|
-
# # => Nothing
|
10
|
-
#
|
11
|
-
# Returns Nothing
|
12
|
-
# TODO Rework; there must be a more sane way of including these
|
13
|
-
def self.include_includeables
|
14
|
-
Base.send :include, Scribbler::Includeables
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
2
|
module Includeables
|
19
3
|
extend ActiveSupport::Concern
|
4
|
+
|
20
5
|
module ClassMethods
|
6
|
+
def logger
|
7
|
+
Logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def log(*args)
|
11
|
+
logger.log *args
|
12
|
+
end
|
13
|
+
|
14
|
+
def log_at(location)
|
15
|
+
LogLocation.new.find_path location
|
16
|
+
end
|
17
|
+
|
21
18
|
def log_location_regex
|
22
19
|
/(?<file>.*)_log_location$/
|
23
20
|
end
|
@@ -40,33 +37,6 @@ module Scribbler
|
|
40
37
|
def respond_to?(name)
|
41
38
|
(m = name.to_s.match log_location_regex) ? !!m : super
|
42
39
|
end
|
43
|
-
|
44
|
-
def log_at(file_name)
|
45
|
-
File.join Scribbler::Configurator.log_directory, "#{file_name}.log"
|
46
|
-
end
|
47
|
-
|
48
|
-
# Public: Save ourselves some repetition. Notifies error to NewRelic
|
49
|
-
# and drops given string into a given log.
|
50
|
-
#
|
51
|
-
# location - Either a pathname from the above method or symbol for an above
|
52
|
-
# method
|
53
|
-
# options - Hash of options for logging on Ngin
|
54
|
-
# :error - Error object, mostly for passing to NewRelic
|
55
|
-
# :message - Message to log in the actual file
|
56
|
-
# :new_relic - Notify NewRelic of the error (default: true)
|
57
|
-
#
|
58
|
-
# Examples
|
59
|
-
#
|
60
|
-
# log(Ngin.subseason_log_location, :error => e, :message => "Error message stuff", :new_relic => false)
|
61
|
-
#
|
62
|
-
# log(:subseason, :error => e, :message => "Error message stuff")
|
63
|
-
#
|
64
|
-
# log(:subseason, :message => "Logging like a bauss")
|
65
|
-
#
|
66
|
-
# Returns Nothing.
|
67
|
-
def log(location, options={})
|
68
|
-
Scribbler::Base.log(location, options)
|
69
|
-
end
|
70
40
|
end
|
71
41
|
end
|
72
42
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
module Scribbler
|
2
|
+
class Logger
|
3
|
+
private
|
4
|
+
attr_accessor :location
|
5
|
+
attr_accessor :options
|
6
|
+
|
7
|
+
public
|
8
|
+
|
9
|
+
def self.log(location, options = {})
|
10
|
+
new(location, options).log
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(location, options = {})
|
14
|
+
self.location = location
|
15
|
+
self.options = gather_log_options options
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Save ourselves some repetition. Notifies error to NewRelic
|
19
|
+
# and drops given string into a given log.
|
20
|
+
#
|
21
|
+
# location - Either a pathname from the above method or symbol for an above
|
22
|
+
# method
|
23
|
+
# options - Hash of options for logging on Ngin
|
24
|
+
# :error - Error object, mostly for passing to NewRelic
|
25
|
+
# :message - Message to log in the actual file
|
26
|
+
# :custom_fields - Custom fields dropped into the default template
|
27
|
+
# :template - Whether or not to use the template at this log
|
28
|
+
# :new_relic - Notify NewRelic of the error (default: true)
|
29
|
+
#
|
30
|
+
# Examples
|
31
|
+
#
|
32
|
+
# log(Ngin.subseason_log_location, :error => e, :message => "Error message stuff", :new_relic => false)
|
33
|
+
#
|
34
|
+
# log(:subseason, :error => e, :message => "Error message stuff")
|
35
|
+
#
|
36
|
+
# log(:subseason, :message => "Logging like a bauss")
|
37
|
+
#
|
38
|
+
# Returns Nothing.
|
39
|
+
def log
|
40
|
+
notify_new_relic options[:error], options[:new_relic]
|
41
|
+
apply_to_log
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def actual_log_location
|
47
|
+
LogLocation.new.find_path location
|
48
|
+
end
|
49
|
+
|
50
|
+
def notify_new_relic(error, new_relic)
|
51
|
+
NewRelic::Agent.notice_error(error) if error and new_relic != false
|
52
|
+
rescue NameError
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def gather_log_options(given_options)
|
57
|
+
{
|
58
|
+
:template => config.use_template_by_default,
|
59
|
+
:stack_frame => given_options[:call_stack] ? Kernel.caller[1..-1] : nil
|
60
|
+
}.merge given_options
|
61
|
+
end
|
62
|
+
|
63
|
+
def config
|
64
|
+
Scribbler.config
|
65
|
+
end
|
66
|
+
|
67
|
+
# Builds the message and any other options into a string
|
68
|
+
# using the template defined in the configure.
|
69
|
+
#
|
70
|
+
# NOTE: These "options" come from the instance
|
71
|
+
#
|
72
|
+
# options - options hash that comprises most of the important log pieces
|
73
|
+
# :message - The message we're wrapping into the templater [required]
|
74
|
+
# :template - Whether or not to use the template method
|
75
|
+
# **Other option information given in the .log docs
|
76
|
+
#
|
77
|
+
# Examples
|
78
|
+
#
|
79
|
+
# build_with_template(:message => "...", :template => false)
|
80
|
+
# # => "..."
|
81
|
+
#
|
82
|
+
# build_with_template
|
83
|
+
# # => nil
|
84
|
+
#
|
85
|
+
# build_with_template(:message => "...", :template => true)
|
86
|
+
# # => <<-EXAMPLE
|
87
|
+
# --------------------
|
88
|
+
# TEMPLATE STUFF
|
89
|
+
# ....
|
90
|
+
# EXAMPLE
|
91
|
+
#
|
92
|
+
# Returns nil, a string, or a string built with calling the Configurator.template method
|
93
|
+
def build_with_template
|
94
|
+
options[:message] = options[:message].to_s.strip_heredoc.rstrip
|
95
|
+
template.call options
|
96
|
+
end
|
97
|
+
|
98
|
+
def no_template
|
99
|
+
->(o) { o[:message] }
|
100
|
+
end
|
101
|
+
|
102
|
+
def decypher_template_option
|
103
|
+
if options[:template]
|
104
|
+
options[:template].is_a?(Proc) ? options[:template] : default_template
|
105
|
+
else
|
106
|
+
no_template
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def template_option_given?
|
111
|
+
options.key?(:template)
|
112
|
+
end
|
113
|
+
|
114
|
+
def default_template
|
115
|
+
config.template
|
116
|
+
end
|
117
|
+
|
118
|
+
def template
|
119
|
+
template_option_given? ? decypher_template_option : default_template
|
120
|
+
end
|
121
|
+
|
122
|
+
# Drops built message into the log with the given location
|
123
|
+
#
|
124
|
+
# location - location either found with Scribbler.*_log_location or by hoping a valid
|
125
|
+
# path string or Path object were passed
|
126
|
+
# options - options hash
|
127
|
+
# :message - Message to be built and put in log file [required]
|
128
|
+
# ** Other hash information given in Scribbler.log
|
129
|
+
#
|
130
|
+
# Examples
|
131
|
+
#
|
132
|
+
# apply_to_log # WITH :some_loc, :message => "...", :template => false, :error => e
|
133
|
+
# # => Nothing
|
134
|
+
#
|
135
|
+
# Returns Nothing
|
136
|
+
def apply_to_log
|
137
|
+
if can_apply_to_log?
|
138
|
+
File.open actual_log_location, 'a' do |f|
|
139
|
+
f.puts build_with_template
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# TODO: Fix to work with any template
|
145
|
+
def can_apply_to_log?
|
146
|
+
location.present? and
|
147
|
+
(options[:message].present? or
|
148
|
+
options[:object].present? or
|
149
|
+
options[:custom_fields].present?)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|