sass-prof 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e37860473bfa73ead2c01c662024505ddf4bab29
4
- data.tar.gz: cc7f27493822630a8c35fabb083151fafcd6d182
3
+ metadata.gz: 9bdc582c7241e357559c9cb8fe3ca8a9d8ca5eb2
4
+ data.tar.gz: 5a65fa2fba5c17ddb3f71fc08a3af4bba6ae7c97
5
5
  SHA512:
6
- metadata.gz: 4dd56d83f24ba3a906eaa9e979254c14552f33705e7731ebea0d4070d22d9f66d0901220b92350a664dffff45c2195445137001386c6162d18786ba245a34735
7
- data.tar.gz: dc3cecbc78e426b8113e8d87d567c8eea4a0eee19cc2b2fedfed697f7c4a6b206e1868a31ef4c2d2b4c615f8759a9509e22c9c82cfff7939b48bacb0d6b06057
6
+ metadata.gz: f80bd2249c8002050c28609f79de4860e0a679ed321a857d28c78e5d1ef3b5fe556311b69e8febd6363fe3acff61d67549d0fa0569c2263fe50e0d9c0a0c4d39
7
+ data.tar.gz: 3d9eb5c378eceae90768bd047fd111402b99ad91f0877d39a4753f0f8a1f62c9ec2337770ff8e99f1446e8adda73912a3c57362a40ed9fcf4a59e5d80f6c51b6
data/README.md CHANGED
@@ -26,8 +26,8 @@ You may specify a few options within your `config.rb`, such as directing output
26
26
  ```ruby
27
27
  require "sass-prof"
28
28
 
29
- # Instance of Sass::Prof's configuration
30
- prof = Sass::Prof::Config
29
+ # Configuration object
30
+ prof = SassProf::Config
31
31
 
32
32
  # Directs all output to a log file
33
33
  # Default is `false`
@@ -52,7 +52,7 @@ prof.max_execution_time = 15
52
52
  # Default is `true`
53
53
  prof.color = true
54
54
 
55
- # Execution time integer precision
55
+ # Execution time floating point precision
56
56
  # Default is `15`
57
57
  prof.precision = 5
58
58
  ```
@@ -66,8 +66,3 @@ _Please note: your compile times **will be slower** due to the overhead of **Sas
66
66
  3. Commit your changes (`git commit -am 'Add some feature'`)
67
67
  4. Push to the branch (`git push origin my-new-feature`)
68
68
  5. Create a new Pull Request
69
-
70
- ## Todo
71
-
72
- - [ ] Add proper rspec tests
73
- - [ ] Add support for `@mixin`'s
data/lib/sass-prof.rb CHANGED
@@ -2,219 +2,50 @@
2
2
 
3
3
  require "terminal-table"
4
4
 
5
+ require "sass-prof/config"
6
+ require "sass-prof/reporter"
7
+ require "sass-prof/formatter"
8
+ require "sass-prof/profiler"
9
+
10
+ # Monkey patch Sass to utilize Profiler
5
11
  module Sass
6
- module Prof
7
-
8
- module Config
9
- attr_accessor :t_max
10
- attr_accessor :max_width
11
- attr_accessor :output_file
12
- attr_accessor :quiet
13
- attr_accessor :color
14
- attr_accessor :precision
15
-
16
- alias_method :max_execution_time=, :t_max=
17
- alias_method :max_execution_time, :t_max
18
-
19
- @t_max = 100
20
- @max_width = false
21
- @output_file = false
22
- @quiet = false
23
- @color = true
24
- @precision = 15
25
-
26
- extend self
27
- end
12
+ class Tree::Visitors::Perform
13
+ alias_method :__visit_function, :visit_function
28
14
 
29
- module Report
30
- attr_accessor :rows
15
+ def visit_function(node)
16
+ prof = ::SassProf::Profiler.new(node.dup, :function, node.args.dup,
17
+ @environment)
18
+ prof.start
31
19
 
32
- @rows = []
20
+ value = __visit_function node
33
21
 
34
- def add_row(row)
35
- row = Prof::Formatter.truncate_row row if Prof::Config.max_width
36
- @rows << row
37
- end
22
+ prof.stop
38
23
 
39
- def reset_report
40
- @rows = []
41
- end
24
+ value
25
+ end
42
26
 
43
- def print_report
44
- log_report if Prof::Config.output_file
45
- puts Prof::Formatter.to_table @rows
46
- end
27
+ alias_method :__visit_mixindef, :visit_mixindef
47
28
 
48
- def log_report
49
- File.open(Prof::Config.output_file, "a+") do |f|
50
- f.puts Prof::Formatter.to_table @rows.map { |r|
51
- r.map { |col| col.gsub /\e\[(\d+)(;\d+)*m/, "" } }
52
- end
53
- end
29
+ def visit_mixindef(node)
30
+ prof = ::SassProf::Profiler.new(node.dup, :mixin, node.args.dup,
31
+ @environment)
32
+ prof.start
54
33
 
55
- extend self
56
- end
34
+ value = __visit_mixindef node
57
35
 
58
- module Formatter
59
-
60
- COLORS = Hash.new("37").merge({
61
- :black => "30",
62
- :red => "31",
63
- :green => "32",
64
- :yellow => "33",
65
- :blue => "34",
66
- :purple => "35",
67
- :cyan => "36",
68
- :white => "37",
69
- })
70
-
71
- def colorize(string, color)
72
- return string.to_s unless Prof::Config.color
73
-
74
- "\e[0;#{COLORS.fetch(color)}m#{string}\e[0m"
75
- end
76
-
77
- def to_table(rows)
78
- pr = Prof::Config.precision / 3 - 5 # 5 is to account for whitespace
79
- t_ms = rows.map { |c|
80
- c[1].gsub(/\e\[(\d+)(;\d+)*m/, "").to_f }.reduce :+
81
-
82
- t_ss, t_ms = t_ms.divmod 1000
83
- t_mm, t_ss = t_ss.divmod 60
84
-
85
- # Add total execution time footer
86
- rows << :separator
87
- rows << [
88
- "Total",
89
- "%.#{pr}fm %.#{pr}fs %.#{pr}fms" % [t_mm, t_ss, t_ms],
90
- "",
91
- ""
92
- ]
93
-
94
- table = Terminal::Table.new({
95
- :headings => ["File", "Execution Time", "Action", "Signature"],
96
- :rows => rows
97
- })
98
-
99
- table
100
- end
101
-
102
- def truncate_row(row)
103
- max_width = Prof::Config.max_width
104
- tr_row = []
105
-
106
- row.map do |col|
107
- clean_width = col.gsub(/\e\[(\d+)(;\d+)*m/, "").length
108
- diff = col.length - clean_width
109
-
110
- if clean_width > max_width
111
- tr_row << (col[0..max_width + diff] << "\e[0m...")
112
- else
113
- tr_row << col
114
- end
115
- end
116
-
117
- tr_row
118
- end
119
-
120
- extend self
121
- end
36
+ prof.stop
122
37
 
123
- class Profiler
124
- attr_accessor :function, :action, :args, :env
125
-
126
- def initialize(function, action, args = nil, env = nil)
127
- @function = function
128
- @action = action
129
- @args = args
130
- @env = env
131
- @t_total = 0
132
- @t_then = 0
133
- @t_now = 0
134
- end
135
-
136
- def start
137
- @t_then = Time.now
138
- end
139
-
140
- def stop
141
- @t_now = Time.now
142
- t_delta = (@t_now.to_f - @t_then.to_f) * 1000.0
143
- @t_then, @t_total = @t_now, t_delta
144
-
145
- create_fn_report
146
- end
147
-
148
- private
149
-
150
- def create_fn_report
151
- fn_report = [fn_source, fn_execution_time, fn_action,
152
- fn_signature]
153
-
154
- Prof::Report.add_row fn_report unless Prof::Config.quiet
155
-
156
- if @t_total > Prof::Config.t_max && action == :invoke
157
- raise RuntimeError.new Prof::Formatter.colorize(
158
- "Max execution time of #{Prof::Config.t_max}ms reached for function"\
159
- " `#{fn_name}()` (took #{@t_total.round(3)}ms)", :red)
160
- end
161
- end
162
-
163
- def fn_execution_time
164
- color = @t_total > Prof::Config.t_max ? :red : :green
165
- t_exec = "%.#{Prof::Config.precision}f" % @t_total
166
- Prof::Formatter.colorize t_exec, color
167
- end
168
-
169
- def fn_name
170
- case
171
- when function.respond_to?(:name)
172
- function.name
173
- else
174
- "Unknown function"
175
- end
176
- end
177
-
178
- def fn_args
179
- return nil if args.nil?
180
-
181
- if args.is_a? Array
182
- args.map { |a| a.inspect }.join(", ")
183
- else
184
- args.to_s[1...args.length-2]
185
- end
186
- end
187
-
188
- def fn_source
189
- return Prof::Formatter.colorize("Unknown file", :red) unless env
190
-
191
- orig_filename = env.options.fetch :original_filename, "Unknown file"
192
- filename = env.options.fetch :filename, "Unknown file"
193
-
194
- Prof::Formatter.colorize "#{File.basename(orig_filename)}:"\
195
- "#{File.basename(filename)}", :yellow
196
- end
197
-
198
- def fn_action
199
- Prof::Formatter.colorize action.capitalize, :yellow
200
- end
201
-
202
- def fn_signature
203
- "#{Prof::Formatter.colorize(fn_name, :blue)}"\
204
- "(#{Prof::Formatter.colorize(fn_args, :purple)})"
205
- end
38
+ value
206
39
  end
207
- end
208
40
 
209
- # Monkey patch Sass to utilize Profiler
210
- class Tree::Visitors::Perform
211
- alias_method :__visit_function, :visit_function
41
+ alias_method :__visit_mixin, :visit_mixin
212
42
 
213
- def visit_function(node)
214
- prof = Prof::Profiler.new(node.dup, :allocate)
43
+ def visit_mixin(node)
44
+ prof = ::SassProf::Profiler.new(node.dup, :include, node.args.dup,
45
+ @environment)
215
46
  prof.start
216
47
 
217
- value = __visit_function node
48
+ value = __visit_mixin node
218
49
 
219
50
  prof.stop
220
51
 
@@ -226,7 +57,7 @@ module Sass
226
57
  alias_method :__perform_sass_fn, :perform_sass_fn
227
58
 
228
59
  def perform_sass_fn(function, args, splat, environment)
229
- prof = Prof::Profiler.new(function.dup, :invoke, args.dup,
60
+ prof = ::SassProf::Profiler.new(function.dup, :invoke, args.dup,
230
61
  environment.dup)
231
62
  prof.start
232
63
 
@@ -245,8 +76,8 @@ module Sass
245
76
  def render
246
77
  __render
247
78
  ensure
248
- Sass::Prof::Report.print_report
249
- Sass::Prof::Report.reset_report
79
+ ::SassProf::Reporter.print_report
80
+ ::SassProf::Reporter.reset_report
250
81
  end
251
82
  end
252
83
  end
@@ -0,0 +1,22 @@
1
+ module SassProf
2
+ module Config
3
+ attr_accessor :t_max
4
+ attr_accessor :max_width
5
+ attr_accessor :output_file
6
+ attr_accessor :quiet
7
+ attr_accessor :color
8
+ attr_accessor :precision
9
+
10
+ alias_method :max_execution_time=, :t_max=
11
+ alias_method :max_execution_time, :t_max
12
+
13
+ @t_max = 100
14
+ @max_width = false
15
+ @output_file = false
16
+ @quiet = false
17
+ @color = true
18
+ @precision = 15
19
+
20
+ extend self
21
+ end
22
+ end
@@ -0,0 +1,68 @@
1
+ module SassProf
2
+ module Formatter
3
+
4
+ COLORS = Hash.new("37").merge({
5
+ :black => "30",
6
+ :red => "31",
7
+ :green => "32",
8
+ :yellow => "33",
9
+ :blue => "34",
10
+ :purple => "35",
11
+ :cyan => "36",
12
+ :white => "37",
13
+ })
14
+
15
+ def colorize(string, color)
16
+ return string.to_s unless Config.color
17
+
18
+ "\e[0;#{COLORS.fetch(color)}m#{string}\e[0m"
19
+ end
20
+
21
+ def to_table(rows)
22
+ pr = Config.precision / 3 - 5 # 5 is to account for whitespace
23
+ t_ms = rows.map { |c|
24
+ c[1].gsub(/\e\[(\d+)(;\d+)*m/, "").to_f }.reduce :+
25
+
26
+ return if t_ms.nil?
27
+
28
+ t_ss, t_ms = t_ms.divmod 1000
29
+ t_mm, t_ss = t_ss.divmod 60
30
+
31
+ # Add total execution time footer
32
+ rows << :separator
33
+ rows << [
34
+ "Total",
35
+ "%.#{pr}fm %.#{pr}fs %.#{pr}fms" % [t_mm, t_ss, t_ms],
36
+ "",
37
+ ""
38
+ ]
39
+
40
+ table = Terminal::Table.new({
41
+ :headings => ["File", "Execution Time", "Action", "Signature"],
42
+ :rows => rows
43
+ })
44
+
45
+ table
46
+ end
47
+
48
+ def truncate_row(row)
49
+ max_width = Config.max_width
50
+ tr_row = []
51
+
52
+ row.map do |col|
53
+ clean_width = col.gsub(/\e\[(\d+)(;\d+)*m/, "").length
54
+ diff = col.length - clean_width
55
+
56
+ if clean_width > max_width
57
+ tr_row << (col[0..max_width + diff] << "\e[0m...")
58
+ else
59
+ tr_row << col
60
+ end
61
+ end
62
+
63
+ tr_row
64
+ end
65
+
66
+ extend self
67
+ end
68
+ end
@@ -0,0 +1,93 @@
1
+ module SassProf
2
+ class Profiler
3
+ attr_accessor :function
4
+ attr_accessor :action
5
+ attr_accessor :args
6
+ attr_accessor :env
7
+
8
+ def initialize(function, action, args = nil, env = nil)
9
+ @function = function
10
+ @action = action
11
+ @args = args
12
+ @env = env
13
+ @t_total = 0
14
+ @t_then = 0
15
+ @t_now = 0
16
+ end
17
+
18
+ def start
19
+ @t_then = Time.now
20
+ end
21
+
22
+ def stop
23
+ @t_now = Time.now
24
+ t_delta = (@t_now.to_f - @t_then.to_f) * 1000.0
25
+ @t_then, @t_total = @t_now, t_delta
26
+
27
+ create_fn_report
28
+ end
29
+
30
+ private
31
+
32
+ def create_fn_report
33
+ fn_report = [fn_source, fn_execution_time, fn_action,
34
+ fn_signature]
35
+
36
+ Reporter.add_row fn_report unless Config.quiet
37
+
38
+ if @t_total > Config.t_max && is_performable_action?
39
+ raise RuntimeError.new Formatter.colorize(
40
+ "Max execution time of #{Config.t_max}ms reached for function"\
41
+ " `#{fn_name}()` (took #{@t_total.round(3)}ms)", :red)
42
+ end
43
+ end
44
+
45
+ def fn_execution_time
46
+ color = @t_total > Config.t_max ? :red : :green
47
+ t_exec = "%.#{Config.precision}f" % @t_total
48
+ Formatter.colorize t_exec, color
49
+ end
50
+
51
+ def fn_name
52
+ case
53
+ when function.respond_to?(:name)
54
+ function.name
55
+ else
56
+ "Unknown function"
57
+ end
58
+ end
59
+
60
+ def fn_args
61
+ return nil if args.nil?
62
+
63
+ if args.is_a? Array
64
+ args.map { |a| a.inspect }.join(", ")
65
+ else
66
+ args.to_s[1...args.length-2]
67
+ end
68
+ end
69
+
70
+ def fn_source
71
+ return Formatter.colorize("Unknown file", :red) unless env
72
+
73
+ orig_filename = env.options.fetch :original_filename, "Unknown file"
74
+ filename = env.options.fetch :filename, "Unknown file"
75
+
76
+ Formatter.colorize "#{File.basename(orig_filename)}:"\
77
+ "#{File.basename(filename)}", :yellow
78
+ end
79
+
80
+ def fn_action
81
+ Formatter.colorize action, :yellow
82
+ end
83
+
84
+ def fn_signature
85
+ "#{Formatter.colorize(fn_name, :blue)}"\
86
+ "(#{Formatter.colorize(fn_args, :purple)})"
87
+ end
88
+
89
+ def is_performable_action?
90
+ [:invoke, :include, :extend].include? action
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,30 @@
1
+ module SassProf
2
+ module Reporter
3
+ attr_accessor :rows
4
+
5
+ @rows = []
6
+
7
+ def add_row(row)
8
+ row = Formatter.truncate_row row if Config.max_width
9
+ @rows << row
10
+ end
11
+
12
+ def reset_report
13
+ @rows = []
14
+ end
15
+
16
+ def print_report
17
+ log_report if Config.output_file
18
+ puts Formatter.to_table @rows
19
+ end
20
+
21
+ def log_report
22
+ File.open(Config.output_file, "a+") do |f|
23
+ f.puts Formatter.to_table @rows.map { |r|
24
+ r.map { |col| col.gsub /\e\[(\d+)(;\d+)*m/, "" } }
25
+ end
26
+ end
27
+
28
+ extend self
29
+ end
30
+ end
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
- module Sass
4
- module Prof
5
- VERSION = "0.3.5"
6
- end
3
+ module SassProf
4
+ VERSION = "0.4.0"
7
5
  end
data/sass-prof.gemspec CHANGED
@@ -7,7 +7,7 @@ require "sass-prof/version"
7
7
 
8
8
  Gem::Specification.new do |spec|
9
9
  spec.name = "sass-prof"
10
- spec.version = Sass::Prof::VERSION
10
+ spec.version = SassProf::VERSION
11
11
  spec.authors = ["ezekg"]
12
12
  spec.email = ["ezekg@yahoo.com"]
13
13
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass-prof
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ezekg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-28 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: compass
@@ -95,6 +95,10 @@ files:
95
95
  - README.md
96
96
  - Rakefile
97
97
  - lib/sass-prof.rb
98
+ - lib/sass-prof/config.rb
99
+ - lib/sass-prof/formatter.rb
100
+ - lib/sass-prof/profiler.rb
101
+ - lib/sass-prof/reporter.rb
98
102
  - lib/sass-prof/version.rb
99
103
  - sass-prof.gemspec
100
104
  - screenshot.jpg