cxxproject 0.5.76 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/Rakefile.rb +116 -116
  2. data/bin/cxx +10 -10
  3. data/lib/cxxproject/buildingblocks/binary_library.rb +39 -39
  4. data/lib/cxxproject/buildingblocks/building_block.rb +251 -234
  5. data/lib/cxxproject/buildingblocks/command_line.rb +79 -86
  6. data/lib/cxxproject/buildingblocks/custom_building_block.rb +39 -39
  7. data/lib/cxxproject/buildingblocks/executable.rb +246 -258
  8. data/lib/cxxproject/buildingblocks/has_dependencies_mixin.rb +83 -83
  9. data/lib/cxxproject/buildingblocks/has_includes_mixin.rb +20 -20
  10. data/lib/cxxproject/buildingblocks/has_libraries_mixin.rb +34 -34
  11. data/lib/cxxproject/buildingblocks/has_sources_mixin.rb +371 -379
  12. data/lib/cxxproject/buildingblocks/makefile.rb +153 -153
  13. data/lib/cxxproject/buildingblocks/module.rb +35 -35
  14. data/lib/cxxproject/buildingblocks/single_source.rb +33 -33
  15. data/lib/cxxproject/buildingblocks/source_library.rb +124 -111
  16. data/lib/cxxproject/errorparser/diab_compiler_error_parser.rb +40 -40
  17. data/lib/cxxproject/errorparser/diab_linker_error_parser.rb +41 -41
  18. data/lib/cxxproject/errorparser/error_parser.rb +50 -71
  19. data/lib/cxxproject/errorparser/gcc_compiler_error_parser.rb +35 -35
  20. data/lib/cxxproject/errorparser/gcc_linker_error_parser.rb +35 -35
  21. data/lib/cxxproject/errorparser/ti_compiler_error_parser.rb +30 -30
  22. data/lib/cxxproject/errorparser/ti_linker_error_parser.rb +30 -30
  23. data/lib/cxxproject/eval_context.rb +144 -144
  24. data/lib/cxxproject/ext/file.rb +71 -81
  25. data/lib/cxxproject/ext/filelist.rb +6 -6
  26. data/lib/cxxproject/ext/progressbar.rb +20 -0
  27. data/lib/cxxproject/ext/rake.rb +419 -434
  28. data/lib/cxxproject/ext/rake_dirty.rb +30 -30
  29. data/lib/cxxproject/ext/rake_listener.rb +59 -59
  30. data/lib/cxxproject/ext/stdout.rb +44 -44
  31. data/lib/cxxproject/ext/string.rb +9 -9
  32. data/lib/cxxproject/ide_interface.rb +187 -189
  33. data/lib/cxxproject/toolchain/clang.rb +39 -43
  34. data/lib/cxxproject/toolchain/colorizing_formatter.rb +99 -99
  35. data/lib/cxxproject/toolchain/diab.rb +1 -1
  36. data/lib/cxxproject/toolchain/gcc.rb +1 -1
  37. data/lib/cxxproject/toolchain/provider.rb +131 -143
  38. data/lib/cxxproject/toolchain/toolchain.rb +38 -38
  39. data/lib/cxxproject/toolchain/toolchain_benchmark.rb +23 -23
  40. data/lib/cxxproject/torake.rb +259 -218
  41. data/lib/cxxproject/utils/cleanup.rb +20 -24
  42. data/lib/cxxproject/utils/console.rb +6 -6
  43. data/lib/cxxproject/utils/exit_helper.rb +40 -40
  44. data/lib/cxxproject/utils/graphstream.rb +154 -154
  45. data/lib/cxxproject/utils/optional.rb +16 -16
  46. data/lib/cxxproject/utils/printer.rb +50 -50
  47. data/lib/cxxproject/utils/process.rb +52 -58
  48. data/lib/cxxproject/utils/progress.rb +66 -0
  49. data/lib/cxxproject/utils/progress_helper.rb +77 -0
  50. data/lib/cxxproject/utils/rbcurse.rb +284 -0
  51. data/lib/cxxproject/utils/rbcurse_executable_ext.rb +14 -0
  52. data/lib/cxxproject/utils/rbcurse_progress.rb +71 -0
  53. data/lib/cxxproject/utils/rbcurse_tasktable.rb +51 -0
  54. data/lib/cxxproject/utils/stats.rb +60 -60
  55. data/lib/cxxproject/utils/ubigraph.rb +228 -228
  56. data/lib/cxxproject/utils/utils.rb +37 -69
  57. data/lib/cxxproject/version.rb +7 -7
  58. data/lib/cxxproject.rb +23 -19
  59. data/lib/tools/Rakefile.rb.template +10 -10
  60. data/lib/tools/project.rb.template +6 -6
  61. data/lib/tools/project_wizard.rb +66 -66
  62. data/spec/building_block_spec.rb +56 -56
  63. data/spec/cxxproject_2_rake_spec.rb +186 -186
  64. data/spec/file_ext_spec.rb +30 -30
  65. data/spec/ide_interface_spec.rb +41 -41
  66. data/spec/object_dependency_spec.rb +83 -83
  67. data/spec/project_path_spec.rb +71 -71
  68. data/spec/rake_listener_ext_spec.rb +58 -58
  69. data/spec/spec_helper.rb +18 -18
  70. data/spec/string_spec.rb +11 -11
  71. data/spec/testdata/basic/exe12/project.rb +5 -5
  72. data/spec/testdata/basic/lib1/project.rb +5 -5
  73. data/spec/testdata/basic/lib2/project.rb +8 -8
  74. data/spec/testdata/multiple_levels/libs/lib1/project.rb +5 -5
  75. data/spec/testdata/multiple_levels/libs/lib2/project.rb +19 -19
  76. data/spec/testdata/multiple_levels/mainproject/basic/project.rb +8 -8
  77. data/spec/testdata/onlyOneHeader/Rakefile.rb +4 -4
  78. data/spec/testdata/onlyOneHeader/project.rb +4 -4
  79. data/spec/toolchain_spec.rb +29 -29
  80. metadata +116 -107
  81. checksums.yaml +0 -7
  82. data/lib/cxxproject/buildingblocks/lint.rb +0 -89
  83. data/lib/cxxproject/errorparser/gcc_lint_error_parser.rb +0 -34
  84. data/lib/cxxproject/errorparser/greenhills_compiler_error_parser.rb +0 -32
  85. data/lib/cxxproject/errorparser/greenhills_linker_error_parser.rb +0 -44
  86. data/lib/cxxproject/errorparser/keil_compiler_error_parser.rb +0 -40
  87. data/lib/cxxproject/errorparser/keil_linker_error_parser.rb +0 -30
  88. data/lib/cxxproject/toolchain/gcc_lint.rb +0 -21
  89. data/lib/cxxproject/toolchain/gcc_param.rb +0 -7
  90. data/lib/cxxproject/toolchain/greenhills.rb +0 -51
  91. data/lib/cxxproject/toolchain/keil.rb +0 -52
  92. data/lib/cxxproject/utils/valgrind.rb +0 -11
@@ -0,0 +1,77 @@
1
+ module Cxxproject
2
+ module Utils
3
+ class ProgressHelper
4
+
5
+ attr_reader :todo
6
+
7
+ attr_reader :needed_tasks
8
+
9
+ def initialize
10
+ @todo = 0.0
11
+ @needed_tasks = {}
12
+ end
13
+
14
+ def count_with_filter(name)
15
+ tasks = find_tasks_for_toplevel_task(name)
16
+ tasks.each do |t|
17
+ count(t)
18
+ end
19
+ if @todo < 1
20
+ @todo = 1
21
+ end
22
+ end
23
+
24
+ def find_tasks_for_toplevel_task(name)
25
+ regex = create_regex_for_name(name)
26
+ return filter_all_tasks(regex)
27
+ end
28
+
29
+ def create_regex_for_name(name)
30
+ res = Regexp.new(name)
31
+ res = create_regex_for_filter(name, res)
32
+ return res
33
+ end
34
+
35
+ def is_filter(name)
36
+ return name.index('filter')
37
+ end
38
+
39
+ def create_regex_for_filter(name, res)
40
+ return res unless is_filter(name)
41
+
42
+ name = name.gsub('filter', '')
43
+ if name.index('[') == nil
44
+ name = name + '.*'
45
+ else
46
+ name = name.gsub('[', '')
47
+ name = name.gsub(']', '')
48
+ end
49
+ return Regexp.new(name)
50
+ end
51
+
52
+ def filter_all_tasks(regex)
53
+ return Rake::Task::tasks.find_all do |t|
54
+ task_name = t.name
55
+ res = ((task_name.index('filter') == nil) && regex.match(task_name)!=nil)
56
+ end
57
+ end
58
+
59
+ def count(task)
60
+ task.visit() do |t|
61
+ count_needed_tasks(t)
62
+ true
63
+ end
64
+ end
65
+
66
+ def count_needed_tasks(t)
67
+ c = t.progress_count
68
+ if c && c > 0
69
+ if t.needed? && @needed_tasks[t.name] == nil
70
+ @needed_tasks[t.name] = true
71
+ @todo += c
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,284 @@
1
+ module Cxxproject
2
+ module Utils
3
+ define_rbcurse_ui = lambda do
4
+ require 'rake'
5
+ require 'ncurses'
6
+ require 'rbcurse'
7
+
8
+ require 'rbcurse/rtable'
9
+ require 'rbcurse/table/tablecellrenderer'
10
+ require 'rbcurse/rsplitpane'
11
+ require 'rbcurse/rtextview'
12
+ require 'cxxproject/ext/rake_listener'
13
+ require 'cxxproject/utils/rbcurse_progress'
14
+ require 'cxxproject/utils/rbcurse_tasktable'
15
+
16
+ include RubyCurses
17
+
18
+ Rake::TaskManager.record_task_metadata = true
19
+
20
+ class RakeGui
21
+ def initialize
22
+ require 'cxxproject/utils/rbcurse_executable_ext'
23
+ Cxxproject::ColorizingFormatter.enabled = false
24
+ Rake::Task.output_disabled = true
25
+
26
+ $log = Logger.new(File.join("./", "view.log"))
27
+ $log.level = Logger::ERROR
28
+ @data_stack = []
29
+ @path_stack = []
30
+ end
31
+
32
+ def self.keycode(s)
33
+ return s[0].to_i
34
+ end
35
+
36
+ def create_table
37
+ @col_names = ['name', 'desc']
38
+ return TaskTable.new(self) do
39
+ name 'my table'
40
+ title 'my table'
41
+ cell_editing_allowed false
42
+ end
43
+ end
44
+
45
+ def reenable_including_prerequisites(task)
46
+ task.visit() do |t|
47
+ t.reenable
48
+ true
49
+ end
50
+ end
51
+
52
+ def invoke(table)
53
+ t = table.get_value_at(table.focussed_row, 0)
54
+ @progress_helper = ProgressHelper.new
55
+ complete_task_name = t.name
56
+ args = []
57
+ if @progress_helper.is_filter(t.name)
58
+ args = [get_string('please input filterpattern', 20, '.*')]
59
+ complete_task_name = "#{t.name}[#{args[0]}]"
60
+ end
61
+ @progress_helper.count_with_filter(complete_task_name)
62
+
63
+ @progress.max = @progress_helper.todo
64
+ Rake::add_listener(self)
65
+ reenable_including_prerequisites(t)
66
+ t.invoke(args)
67
+ Rake::remove_listener(self)
68
+ show_details_for(table.focussed_row)
69
+ table.repaint_all(true)
70
+ end
71
+
72
+ def after_execute(name)
73
+ needed_tasks = @progress_helper.needed_tasks
74
+ if needed_tasks[name]
75
+ task = Rake::Task[name]
76
+ @progress.title = task.name
77
+ @progress.inc(task.progress_count)
78
+ @form.repaint
79
+ end
80
+ end
81
+
82
+ def details(table)
83
+ t = table.get_value_at(table.focussed_row, 0)
84
+ pre = t.prerequisite_tasks
85
+ if pre.size > 0
86
+ push_table_data(pre, t.name)
87
+ table.set_focus_on 0
88
+
89
+ show_details_for(0)
90
+ end
91
+ end
92
+
93
+ def repaint_and_next_char
94
+ @form.repaint
95
+ @window.wrefresh
96
+ return @window.getchar
97
+ end
98
+
99
+ def process_input_events
100
+ ch = repaint_and_next_char
101
+ while ch != RakeGui.keycode('q')
102
+ $log.error "entered key: #{ch}"
103
+ case ch
104
+ when RakeGui.keycode('a')
105
+ @h_split.set_divider_location(@h_split.divider_location+1)
106
+ when RakeGui.keycode('s')
107
+ @h_split.set_divider_location(@h_split.divider_location-1)
108
+ else
109
+ @form.handle_key(ch)
110
+ end
111
+ ch = repaint_and_next_char
112
+ end
113
+ end
114
+
115
+ def push_table_data(task_data, new_path=nil)
116
+ @path_stack.push(new_path) if new_path
117
+ set_breadcrumbs
118
+
119
+ @data_stack.push(task_data)
120
+ set_table_data(task_data)
121
+ end
122
+ def set_table_data(task_data)
123
+ size = size()
124
+ new_data = task_data.map{|t|[t, t.comment]}
125
+ @table.set_data new_data, @col_names
126
+ tcm = @table.table_column_model
127
+ first_col_width = task_data.map{|t|t.name.size}.max
128
+ tcm.column(0).width(first_col_width)
129
+ tcm.column(1).width(size[0]-first_col_width-3)
130
+ end
131
+ def set_breadcrumbs
132
+ crumbs = File.join(@path_stack.map{|i|"(#{i})"}.join('/'))
133
+ @breadcrumbs.text = crumbs
134
+ @breadcrumbs.repaint_all(true)
135
+ end
136
+ def pop_data
137
+ if @data_stack.size > 1
138
+ @path_stack.pop
139
+ set_breadcrumbs
140
+
141
+ popped = @data_stack.pop
142
+ top= @data_stack.last
143
+ set_table_data(top)
144
+ end
145
+ end
146
+
147
+ def size
148
+ return @window.default_for(:width), @window.default_for(:height)
149
+ end
150
+
151
+ def show_details_for(row)
152
+ buffer = StringIO.new
153
+ t = @table.get_value_at(row, 0)
154
+ t.visit do |t|
155
+ if t.output_string && t.output_string.length > 0
156
+ buffer.puts(t.output_string)
157
+ end
158
+ if t.failure
159
+ true
160
+ else
161
+ false
162
+ end
163
+ end
164
+ @output.set_content(buffer.string)
165
+ @output.set_focus_on(0)
166
+ @output.repaint_all(true)
167
+ end
168
+
169
+ def start_editor_for_task(t)
170
+ file_name = t.name
171
+ return unless File.exists?(file_name)
172
+
173
+ start_editor(file_name, 0, 0)
174
+ end
175
+
176
+ def start_editor(file, line, column)
177
+ $log.error "starting editor for #{file}:#{line}"
178
+ editor = ENV['EDITOR']
179
+ editor = 'vi' unless editor
180
+ cmd = "#{editor} +#{line} #{file}"
181
+ shell_out(cmd)
182
+ end
183
+
184
+ def shell_out(cmd)
185
+ @window.hide
186
+ Ncurses.endwin
187
+ system(cmd)
188
+ Ncurses.refresh
189
+ @window.show
190
+ end
191
+
192
+ def create_breadcrumbs(size)
193
+ @breadcrumbs = Label.new @form do
194
+ name 'breadcrumbs'
195
+ row 0
196
+ col 0
197
+ width size[0]
198
+ height 1
199
+ end
200
+ @breadcrumbs.display_length(size[0])
201
+ @breadcrumbs.text = ''
202
+ end
203
+
204
+ def create_splitpane(size)
205
+ @h_split = SplitPane.new @form do
206
+ name 'mainpane'
207
+ row 1
208
+ col 0
209
+ width size[0]
210
+ height size[1]-3
211
+ orientation :HORIZONTAL_SPLIT
212
+ end
213
+ end
214
+
215
+ def create_output_view(size)
216
+ @output = TextView.new nil
217
+ @output.set_content('')
218
+ @output.configure do
219
+ bind_key(RakeGui.keycode('e')) do |code|
220
+ line = selected_item
221
+ file_pattern = '(.*?):(\d+):(\d*):? '
222
+ error_pattern = Regexp.new("#{file_pattern}(error: .*)")
223
+ warning_pattern = Regexp.new("#{file_pattern}(warning: .*)")
224
+ md = error_pattern.match(line)
225
+ md = warning_pattern.match(line) unless md
226
+ if md
227
+ file_name = md[1]
228
+ line = md[2]
229
+ col = md[3]
230
+ rake_gui.start_editor(file_name, line, col)
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ def create_components(size)
237
+ create_breadcrumbs(size)
238
+ @progress = Progress.new(@form, size)
239
+ create_splitpane(size)
240
+ @table = create_table
241
+ push_table_data(Rake::Task.tasks.select {|t|t.comment})
242
+
243
+ create_output_view(size)
244
+ end
245
+
246
+ def wire_components
247
+ @h_split.first_component(@table)
248
+ @h_split.second_component(@output)
249
+ @h_split.set_resize_weight(0.50)
250
+ end
251
+
252
+ def run
253
+ rake_gui = self
254
+ begin
255
+ VER::start_ncurses
256
+
257
+ @window = VER::Window.root_window
258
+ @form = Form.new @window
259
+
260
+ create_components(size())
261
+ wire_components
262
+
263
+ @table.bind(:TABLE_TRAVERSAL_EVENT) do |e|
264
+ rake_gui.show_details_for(e.newrow)
265
+ end
266
+
267
+ process_input_events
268
+ rescue => e
269
+ puts e
270
+ end
271
+ @window.destroy if @window
272
+ VER::stop_ncurses
273
+ end
274
+ end
275
+
276
+ task :ui do
277
+ RakeGui.new.run
278
+ end
279
+
280
+ end
281
+
282
+ optional_package(define_rbcurse_ui, nil)
283
+ end
284
+ end
@@ -0,0 +1,14 @@
1
+ module Cxxproject
2
+ module Utils
3
+ class Executable
4
+ def run_command(task, command)
5
+ require 'open3'
6
+ stdin, stdout, stderr = Open3.popen3(command)
7
+ puts "StdOut:"
8
+ puts stdout.readlines
9
+ puts "StdErr:"
10
+ puts stderr.readlines
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,71 @@
1
+ module Cxxproject
2
+ module Utils
3
+ class Progress
4
+ def initialize(form, size)
5
+ @width = size[0]
6
+ initialize_progress(form, size)
7
+ initialize_title(form, size)
8
+ max = 100
9
+ end
10
+
11
+ def initialize_progress(form, size)
12
+ @progress = Label.new form do
13
+ name 'progress'
14
+ row size[1]-1
15
+ col 0
16
+ width size[0]
17
+ height 1
18
+ end
19
+ @progress.display_length(@width)
20
+ @progress.text = ' '*@width
21
+ end
22
+
23
+ def initialize_title(form, size)
24
+ @title = Label.new form do
25
+ name 'title'
26
+ row size[1]-2
27
+ col 0
28
+ width size[0]
29
+ height 1
30
+ end
31
+ @title.display_length(@widget)
32
+ @title.text = 'Idle'
33
+ end
34
+
35
+ def title=(t)
36
+ @title_text = t
37
+ format_title
38
+ end
39
+
40
+ def inc(i)
41
+ @current += i
42
+ format_title
43
+ format_progress
44
+ end
45
+
46
+ def percentage
47
+ return @current.to_f / @max.to_f
48
+ end
49
+
50
+ def format_progress
51
+ total = (percentage * @width.to_f).to_i
52
+ text = "#" * total
53
+ @progress.text = text
54
+ @progress.repaint_all(true)
55
+ end
56
+
57
+ def format_title
58
+ format = "%3d%% - worked on %s "
59
+ @title.text = sprintf(format, (percentage*100).to_i, @title_text)
60
+ @title.repaint_all(true)
61
+ end
62
+
63
+ def max=(f)
64
+ @max = f.to_f
65
+ @current = 0.0
66
+ format_progress
67
+ format_title
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,51 @@
1
+ module Cxxproject
2
+ module Utils
3
+ class TaskTable < Table
4
+ def initialize(rake_gui, form=nil, config={}, &block)
5
+ super(form, config, &block)
6
+ @rake_gui = rake_gui
7
+ activate_keybindings
8
+ end
9
+ def activate_keybindings
10
+ configure do
11
+ bind_key(RakeGui.keycode('r')) do
12
+ @rake_gui.invoke(self)
13
+ end
14
+ bind_key(RakeGui.keycode('d')) do
15
+ @rake_gui.details(self)
16
+ end
17
+ bind_key(RakeGui.keycode('e')) do
18
+ task = get_value_at(focussed_row, 0)
19
+ @rake_gui.start_editor_for_task(task)
20
+ end
21
+ [RakeGui.keycode('p'), KEY_BACKSPACE, 127].each do |code|
22
+ bind_key(code) do
23
+ @rake_gui.pop_data
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def get_cell_renderer(row, col)
30
+ renderer = super(row, col)
31
+ content = get_value_at(row, 0)
32
+ if renderer.nil?
33
+ renderer = get_default_cell_renderer_for_class(content.class.to_s) if renderer.nil?
34
+ column = @table_column_model.column(col)
35
+ renderer.display_length column.width if column
36
+ end
37
+
38
+ if content && content.failure
39
+ renderer.color('red')
40
+ renderer.bgcolor('black')
41
+ else
42
+ renderer.color('white')
43
+ renderer.bgcolor('black')
44
+ end
45
+ return renderer
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
@@ -1,60 +1,60 @@
1
- module Cxxproject
2
- module Utils
3
- define_stats = lambda do
4
- require 'haml'
5
-
6
- def count_sources(bbs)
7
- return bbs.inject(0) do |memo, bb|
8
- memo += bb.sources.size if bb.kind_of?(HasSources)
9
- memo
10
- end
11
- end
12
- def print_sources(io, bbs, indent)
13
- io.puts(indent + '%div.details')
14
- bbs.each do |bb|
15
- if bb.kind_of?(HasSources)
16
- io.puts(indent + " %p Sources of #{bb.name}: #{bb.sources.size}")
17
- io.puts(indent + ' %ul')
18
- bb.sources.each do |s|
19
- io.puts(indent + " %li #{s}")
20
- end
21
- end
22
- end
23
- end
24
-
25
- def handle_exe(io, bb, indent)
26
- if bb.kind_of?(Executable)
27
- io.puts(indent + "%h1")
28
- bbs = bb.all_dependencies.map{|name|ALL_BUILDING_BLOCKS[name]}
29
- io.puts(indent + " %p.details_toggle Executable '#{bb.name}' total sources: #{count_sources(bbs)}")
30
- print_sources(io, bbs, indent + ' '*2)
31
- end
32
- end
33
-
34
- directory 'build'
35
-
36
- desc 'print building block stats'
37
- task :stats => 'build' do
38
- io = StringIO.new
39
- io.puts('%html')
40
- io.puts(' %head')
41
- io.puts(' %title Some Stats')
42
- io.puts(' %script{ :type => "text/javascript", :src=>"http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"}')
43
- io.puts(' :javascript')
44
- io.puts(' $(document).ready(function() {$("div.details").hide();$("p.details_toggle").click(function() {$(this).siblings().last().toggle();});});')
45
- io.puts(' %body')
46
- res = ALL_BUILDING_BLOCKS.inject(io) do |memo, pair|
47
- key, bb = pair
48
- handle_exe(memo, bb, ' '*4)
49
- memo
50
- end
51
- engine = Haml::Engine.new(res.string)
52
- File.open(File.join('build','stats.out.html'), 'w') do |out|
53
- out.puts(engine.render)
54
- end
55
- end
56
- end
57
-
58
- optional_package(define_stats, nil)
59
- end
60
- end
1
+ module Cxxproject
2
+ module Utils
3
+ define_stats = lambda do
4
+ require 'haml'
5
+
6
+ def count_sources(bbs)
7
+ return bbs.inject(0) do |memo, bb|
8
+ memo += bb.sources.size if bb.kind_of?(HasSources)
9
+ memo
10
+ end
11
+ end
12
+ def print_sources(io, bbs, indent)
13
+ io.puts(indent + '%div.details')
14
+ bbs.each do |bb|
15
+ if bb.kind_of?(HasSources)
16
+ io.puts(indent + " %p Sources of #{bb.name}: #{bb.sources.size}")
17
+ io.puts(indent + ' %ul')
18
+ bb.sources.each do |s|
19
+ io.puts(indent + " %li #{s}")
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def handle_exe(io, bb, indent)
26
+ if bb.kind_of?(Executable)
27
+ io.puts(indent + "%h1")
28
+ bbs = bb.all_dependencies.map{|name|ALL_BUILDING_BLOCKS[name]}
29
+ io.puts(indent + " %p.details_toggle Executable '#{bb.name}' total sources: #{count_sources(bbs)}")
30
+ print_sources(io, bbs, indent + ' '*2)
31
+ end
32
+ end
33
+
34
+ directory 'build'
35
+
36
+ desc 'print building block stats'
37
+ task :stats => 'build' do
38
+ io = StringIO.new
39
+ io.puts('%html')
40
+ io.puts(' %head')
41
+ io.puts(' %title Some Stats')
42
+ io.puts(' %script{ :type => "text/javascript", :src=>"http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"}')
43
+ io.puts(' :javascript')
44
+ io.puts(' $(document).ready(function() {$("div.details").hide();$("p.details_toggle").click(function() {$(this).siblings().last().toggle();});});')
45
+ io.puts(' %body')
46
+ res = ALL_BUILDING_BLOCKS.inject(io) do |memo, pair|
47
+ key, bb = pair
48
+ handle_exe(memo, bb, ' '*4)
49
+ memo
50
+ end
51
+ engine = Haml::Engine.new(res.string)
52
+ File.open(File.join('build','stats.out.html'), 'w') do |out|
53
+ out.puts(engine.render)
54
+ end
55
+ end
56
+ end
57
+
58
+ optional_package(define_stats, nil)
59
+ end
60
+ end