basechip 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/.document +5 -0
  2. data/Gemfile +20 -0
  3. data/Gemfile.lock +32 -0
  4. data/LICENSE.txt +14 -0
  5. data/README.rdoc +19 -0
  6. data/VERSION +1 -0
  7. data/bin/basechip +25 -0
  8. data/collateral/block/block.rb.erb +20 -0
  9. data/collateral/configuration/configuration.rb.erb +19 -0
  10. data/collateral/project/Gemfile +19 -0
  11. data/collateral/project/gitignore +6 -0
  12. data/collateral/project/project.rb.erb +76 -0
  13. data/collateral/project/settings.rb.erb +26 -0
  14. data/collateral/recipes/icarus.rb +73 -0
  15. data/collateral/recipes/icarus.rb.erb +88 -0
  16. data/collateral/recipes/local_cluster.rb +27 -0
  17. data/lib/array.rb +26 -0
  18. data/lib/base_chip/action.rb +309 -0
  19. data/lib/base_chip/base.rb +105 -0
  20. data/lib/base_chip/block.rb +75 -0
  21. data/lib/base_chip/bom.rb +75 -0
  22. data/lib/base_chip/bom_file.rb +45 -0
  23. data/lib/base_chip/cli.rb +371 -0
  24. data/lib/base_chip/cluster.rb +93 -0
  25. data/lib/base_chip/cluster_type.rb +45 -0
  26. data/lib/base_chip/code_area.rb +30 -0
  27. data/lib/base_chip/configuration.rb +257 -0
  28. data/lib/base_chip/dsl.rb +593 -0
  29. data/lib/base_chip/exit_error.rb +20 -0
  30. data/lib/base_chip/generator_menu.rb +64 -0
  31. data/lib/base_chip/git.rb +32 -0
  32. data/lib/base_chip/hierarchy.rb +84 -0
  33. data/lib/base_chip/install_menu.rb +89 -0
  34. data/lib/base_chip/ipc.rb +50 -0
  35. data/lib/base_chip/list_menu.rb +134 -0
  36. data/lib/base_chip/menu.rb +70 -0
  37. data/lib/base_chip/out_file.rb +68 -0
  38. data/lib/base_chip/permutation.rb +26 -0
  39. data/lib/base_chip/permute.rb +25 -0
  40. data/lib/base_chip/post.rb +26 -0
  41. data/lib/base_chip/problem.rb +33 -0
  42. data/lib/base_chip/project.rb +472 -0
  43. data/lib/base_chip/requirement.rb +26 -0
  44. data/lib/base_chip/runable.rb +36 -0
  45. data/lib/base_chip/source_language.rb +40 -0
  46. data/lib/base_chip/source_type.rb +24 -0
  47. data/lib/base_chip/statistic.rb +27 -0
  48. data/lib/base_chip/task.rb +21 -0
  49. data/lib/base_chip/task_master.rb +50 -0
  50. data/lib/base_chip/taskable.rb +77 -0
  51. data/lib/base_chip/tasker.rb +260 -0
  52. data/lib/base_chip/test.rb +202 -0
  53. data/lib/base_chip/test_list.rb +120 -0
  54. data/lib/base_chip/tool.rb +51 -0
  55. data/lib/base_chip/tool_version.rb +34 -0
  56. data/lib/base_chip/top_menu.rb +203 -0
  57. data/lib/base_chip/track_state.rb +61 -0
  58. data/lib/base_chip.rb +215 -0
  59. data/lib/dir.rb +30 -0
  60. data/lib/reporting.rb +97 -0
  61. metadata +215 -0
@@ -0,0 +1,51 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'base_chip/tool_version'
18
+
19
+ module BaseChip
20
+ class Tool
21
+ include Dsl
22
+ include Base
23
+ define_settings({:select_version => [ String ],
24
+ :default_version => [ String ]})
25
+ define_children({:tool_version => ToolVersion})
26
+
27
+ def configure
28
+ return if @configured
29
+ super
30
+ @select_version ||= @default_version
31
+ if selected_version
32
+ selected_version.configure
33
+ else
34
+ fault "Selected version '#{@select_version}' for tool '#{@name}' in '#{parent.full_name}' doesn't exist"
35
+ end
36
+ end
37
+ def selected_version
38
+ @selected_version ||= @versions[@select_version] if @versions
39
+ end
40
+ def path(str=:crazy_default_value)
41
+ if str == :crazy_default_value
42
+ @path ||= (selected_version && selected_version.path)
43
+ else
44
+ @path = str
45
+ end
46
+ end
47
+ def available_versions
48
+ versions.keys if versions
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'base_chip/test_list'
18
+
19
+ module BaseChip
20
+ class ToolVersion
21
+ include Dsl
22
+ include Base
23
+ define_settings({:install => [ Array , String ],
24
+ :packages => [ Hash ],
25
+ :path => [ Hash ]})
26
+ #define_children({:action => Action })
27
+
28
+ def configure
29
+ return if @configured
30
+ @path = "#{@project.shared_directory}/tools/#{tool.name}/#{@name}"
31
+ super
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,203 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'base_chip/menu'
18
+ module BaseChip
19
+ class TopMenu < Menu
20
+ include Cli
21
+ def ready_workload(*args)
22
+ @targets = args
23
+ BaseChip.load_environment
24
+ @project = BaseChip.project
25
+ @project.ready(@targets) if @targets.size > 0
26
+ end
27
+
28
+ option :yes , :description=>"Accept defaults on any posed questions", :type=>:boolean, :alias=>[:y]
29
+ option :modes, :description=>"Enable predefined modes" , :type=>:string , :alias=>[:m]
30
+
31
+ desc "Create a new project"
32
+ option :git, :description=>"Set up as a git repository", :type=>:boolean, :alias=>[:g,:r,:repo]
33
+ def init(project_name)
34
+ BaseChip.project = project_name
35
+ BaseChip.root = "./#{project_name}"
36
+ FileUtils.mkdir_p BaseChip.root
37
+ BaseChip.build_directory_structure(BaseChip.root, BaseChip.project_directories)
38
+ BaseChip.erb_template "#{BaseChip::GEM_DIR}/collateral/project/settings.rb.erb", "#{BaseChip.root}/base_chip/settings.rb"
39
+ FileUtils.cp "#{BaseChip::GEM_DIR}/collateral/project/gitignore" , "#{BaseChip.root}/.gitignore"
40
+ FileUtils.cd BaseChip.root
41
+
42
+ if options.git
43
+ system "git init ."
44
+ system "git add ./base_chip ./.gitignore"
45
+ system "git commit -m 'Initial automated project build by BaseChip.' ."
46
+
47
+ normal "Your project has been created.\n" +
48
+ "Your next step is probably to generate a block.\n" +
49
+ "You can learn more by entering your newly created directory, and typing:\n" +
50
+ " basechip help generate block"
51
+ end
52
+ end
53
+
54
+ desc "Generate a block, tool, testbench, etc"
55
+ sub_command :generate, GeneratorMenu
56
+
57
+ desc 'Install a recipe, plugin, or tool'
58
+ sub_command :install, InstallMenu
59
+
60
+ desc "List blocks, actions, tools, tests, etc"
61
+ long "If 'pattern' is given as a string, it must completely match the name of the block/action/test/test_list\n" +
62
+ " or one of it's parents. If surrounded by '/', the pattern will be considered a regular expression\n" +
63
+ " and will be compared to the full name of the item including it's parents' names separated by colons."
64
+ sub_command :list, ListMenu
65
+
66
+ desc 'Execute targets'
67
+ full_usage 'basechip <targets+> [options]'
68
+ default
69
+ option :work_dir , :description=>"Working directory other than cwd" , :type=>:string , :alias=>[:w]
70
+ option :max_fails , :description=>"Working directory other than cwd" , :type=>:string , :alias=>[:f]
71
+ option :max_passes , :description=>"Working directory other than cwd" , :type=>:string , :alias=>[:p]
72
+ option :repeat , :description=>"Repeat each test 'r' times" , :type=>:integer, :alias=>[:r]
73
+ option :jobs , :description=>"Number of jobs, and for which cluster", :type=>:string , :alias=>[:j]
74
+ option :seed , :description=>"Root seed for all actions" , :type=>:integer, :alias=>[:s]
75
+ option :client_of , :description=>"Internal use only" , :type=>:string
76
+ option :client_id , :description=>"Internal use only" , :type=>:integer
77
+ option :opc , :description=>"Internal use only" , :type=>:string
78
+ option :opi , :description=>"Internal use only" , :type=>:string
79
+ def exec(*args)
80
+ begin
81
+ fault "Repeat is a planned feature" if BaseChip.options.repeat
82
+
83
+ args << 'all' if options.client_of && args.size == 0
84
+ ready_workload(*args)
85
+
86
+ @project.enable_tracking(options.opc,options.opi) if options.opc
87
+ @project.tasker.clusters = @project.dereference_clusters
88
+ @project.tasker.client_of = options.client_of
89
+ @project.tasker.client_id = options.client_id || 0
90
+
91
+ if options.client_of
92
+ @project.tasker.run
93
+ else
94
+ if @targets.size > 0
95
+ begin
96
+ @project.run_all_readied
97
+ # @project.track_complete 'pass'
98
+ rescue Reporting::Fault => e
99
+ # @project.track_complete 'fail', e.message
100
+ exit 1
101
+ rescue RuntimeError => e
102
+ # @project.track_complete 'fail', e.message
103
+ p e
104
+ raise e
105
+ end
106
+ end
107
+ end
108
+ rescue Interrupt # quetly handle the interrupt of clients
109
+ raise unless options.client_of
110
+ end
111
+ end
112
+
113
+ desc 'rerun targets. Some output remains'
114
+ def rerun(bundle_path)
115
+ fault "#{bundle_path} does not exist" unless File.exist?(bundle_path)
116
+ case bundle_path
117
+ when /(.*)\.tgz$/
118
+ puts "Unzipping #{bundle_path}"
119
+ system "tar -zxvf #{bundle_path}"
120
+ bundle_path = $1
121
+ end
122
+ fault "#{bundle_path}/rerun.yaml does not exist" unless File.exist?("#{bundle_path}/rerun.yaml")
123
+ rerun_hash = YAML.load(File.read("#{bundle_path}/rerun.yaml"))
124
+ BaseChip.options.seed ||= rerun_hash['seed' ]
125
+ BaseChip.options.modes ||= rerun_hash['modes']
126
+ BaseChip.options. append_arguments = (BaseChip.options. append_arguments || []) + (rerun_hash[' append_arguments'] || [])
127
+ BaseChip.options.replace_arguments = (BaseChip.options.replace_arguments || []) + (rerun_hash['replace_arguments'] || [])
128
+ BaseChip.options. append_arguments = nil if BaseChip.options. append_arguments.empty?
129
+ BaseChip.options.replace_arguments = nil if BaseChip.options.replace_arguments.empty?
130
+ ready_workload(rerun_hash['full_name'])
131
+ @project.workload.first.directory "#{@project.workload.first.directory}.rerun"
132
+ @project.run_all_readied
133
+ end
134
+
135
+ desc 'Clean targets. Some output remains'
136
+ usage '<targets+> [options]'
137
+ def clean(*args)
138
+ ready_workload(*args)
139
+ @project.workload.each do |w|
140
+ w.clean
141
+ end
142
+ end
143
+
144
+ desc 'Destroy all output relate to targets'
145
+ usage '<targets+> [options]'
146
+ def clobber(*args)
147
+ ready_workload(*args)
148
+ @project.workload.each do |w|
149
+ w.clobber
150
+ end
151
+ end
152
+
153
+ # desc 'Return completion options for a command'
154
+ # def complete
155
+ # args = BaseChip.options. append_arguments
156
+ # current = BaseChip.options.replace_arguments[0]
157
+ # args.shift
158
+
159
+ # out = []
160
+ # tasks = TopMenu.cli.tasks.keys.map{|s|s.to_s}
161
+
162
+ # # if args.empty?
163
+ # # if current
164
+ # # tasks = TopMenu.cli.tasks.keys.map{|s|s.to_s}
165
+ # # if tasks.include? current
166
+ # # puts current
167
+ # # return
168
+ # # end
169
+ # # else
170
+ # # if tasks.include? current
171
+ # # puts current
172
+ # # return
173
+ # # end
174
+ # # end
175
+ # # end
176
+ # # case args[0]
177
+ # # when (*%w{clean clobber})
178
+ # # out += BaseChip.blocks.map{|b|b.name}
179
+ # # else
180
+ # # ready_workload('all')
181
+ # # out += TopMenu.cli.tasks.keys
182
+ # # out += BaseChip.blocks.map{|b|b.name}
183
+ # # end
184
+
185
+ # if self.class.workload_commands.include? argv[0]
186
+ # ready_workload('all')
187
+ # if current
188
+ # else
189
+ # out += BaseChip.blocks.map{|b|b.name.to_s}.keep_if{|b| b=~ /^#{current}/}
190
+ # end
191
+ # end
192
+ # puts out.join(" ")
193
+ # end
194
+ # def self.workload_commands
195
+ # return @@workload_commands if @@workload_commands
196
+ # @@workload_commands = [nil]
197
+ # self.cli.tasks.each do |k,v|
198
+ # @@workload_commands << k.to_s if v.usage =~ /targets/
199
+ # end
200
+ # @@workload_commands
201
+ # end
202
+ end
203
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'base_chip/problem'
18
+ module BaseChip
19
+ module TrackState
20
+ def self.included mod
21
+ mod.extend TrackState::ClassMethods
22
+ mod.class_eval do
23
+ include TrackState::InstanceMethods
24
+ attr_accessor :state
25
+ attr_accessor :problem
26
+ attr_accessor :problems
27
+ end
28
+ end
29
+ module ClassMethods
30
+ end
31
+ module InstanceMethods
32
+ def pass! ; @state ||= 'pass' end
33
+ def warning!(f,s); np(f,s); @state = 'warning' if @state.nil? or @state.pass? end
34
+ def error!( f,s); np(f,s); @state = (@state =~ /fault/) ? 'error && fault' : 'error' end
35
+ def fault!( f,s); np(f,s); @state = (@state =~ /error/) ? 'error && fault' : 'fault' end
36
+
37
+ def pass? ; @state == 'pass' end
38
+ def warning? ; @state == 'warning' end
39
+ def error? ; @state =~ /fault/ end
40
+ def fault? ; @state =~ /error/ end
41
+
42
+ def np(file,signature)
43
+ return if @problem
44
+ @problem = Problem.new
45
+ @problem.file = file
46
+ @problem.signature = signature
47
+ @problem
48
+ end
49
+
50
+ def take_state(thing)
51
+ return if @problem
52
+ @state = thing.state
53
+ @problem = thing.problem
54
+ end
55
+
56
+ def first_error ; @problem && @problem.to_s end
57
+ def first_signature ; @problem && @problem.signature end
58
+ def first_problem_file ; @problem && @problem.file end
59
+ end
60
+ end
61
+ end
data/lib/base_chip.rb ADDED
@@ -0,0 +1,215 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'fileutils'
18
+ require 'open3'
19
+ require 'erb'
20
+ # require "bundler/setup"
21
+
22
+ require 'archive/tar/minitar'
23
+ require 'active_support/inflector'
24
+ require 'dir'
25
+
26
+ require 'base_chip/ipc.rb'
27
+ require 'base_chip/taskable'
28
+ require 'base_chip/task'
29
+ require 'base_chip/tasker'
30
+ require 'base_chip/task_master'
31
+
32
+ require 'base_chip/cli'
33
+ require 'base_chip/base'
34
+ require 'base_chip/dsl'
35
+ require 'base_chip/tool'
36
+ require 'base_chip/project'
37
+ require 'base_chip/generator_menu'
38
+ require 'base_chip/list_menu'
39
+ require 'base_chip/install_menu'
40
+ require 'base_chip/top_menu'
41
+ require 'base_chip/git'
42
+ module BaseChip
43
+ include Reporting
44
+
45
+ RANDOM_NAME_PIECES = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a
46
+ RANDOM_NAME_PIECES_SIZE = RANDOM_NAME_PIECES.size
47
+ def self.random_string(size=10)
48
+ str = ''
49
+ size.times do
50
+ str += RANDOM_NAME_PIECES[rand(RANDOM_NAME_PIECES_SIZE)]
51
+ end
52
+ str
53
+ end
54
+
55
+ GEM_DIR = File.expand_path('../..', File.realpath(__FILE__))
56
+ def self.root=(root) ; @root = root ; end
57
+ def self.root ; @root ; end
58
+ def self.project=(project) ; @project = project ; end
59
+
60
+ @@options = OpenStruct.new
61
+ def self.options
62
+ @@options
63
+ end
64
+
65
+ def self.find_root(dir = nil, passive=false)
66
+ dir ||= @work_dir ||= Dir.pwd
67
+ @dirs_to_top = []
68
+ loop do
69
+ @dirs_to_top << dir
70
+ break if File.exist? dir + '/base_chip/settings.rb'
71
+
72
+ if dir == '/'
73
+ return nil if passive
74
+ fault "Couldn't find file 'base_chip/settings.rb' in any directory above #{Dir.pwd}.\n" +
75
+ "'base_chip/settings.rb' is expected to reside at the top of the checked " +
76
+ "out project, and is generated using the command 'base_chip init'."
77
+ end
78
+ dir = File.expand_path(dir + '/../')
79
+ end
80
+ $project_root = @root = dir
81
+ end
82
+
83
+ def self.build_directory_structure(dir, array)
84
+ array.each do |subdir|
85
+ FileUtils.mkdir_p dir + "/" + subdir
86
+ end
87
+ end
88
+ def self.erb_template(in_file, out_file)
89
+ erb = ERB.new(File.read in_file)
90
+ erb.filename = in_file
91
+ File.open(out_file,'w') do |f|
92
+ f.print(erb.result)
93
+ end
94
+ end
95
+
96
+ def self. project_directories ; @@project_directories end
97
+ def self. block_directories ; @@block_directories end
98
+ def self.configuration_directories ; @@configuration_directories end
99
+ @@common_directories = %w{
100
+ base_chip/tools
101
+ base_chip/recipes
102
+ base_chip/actions
103
+ base_chip/test_lists
104
+ documentation
105
+ } # base_chip/configurations questionable FIXME
106
+ @@configuration_directories =
107
+ @@common_directories +
108
+ %w{
109
+ rtl/verilog
110
+ rtl/headers
111
+ rtl/vhdl
112
+ rtl/systemc
113
+ gates
114
+ testbench/verilog
115
+ testbench/headers
116
+ testbench/classes
117
+ testbench/vhdl
118
+ testbench/systemc
119
+ synthesis
120
+ timing
121
+ sw
122
+ }
123
+ @@block_directories =
124
+ @@configuration_directories +
125
+ %w{
126
+ base_chip/configurations
127
+ }
128
+ @@project_directories =
129
+ @@common_directories +
130
+ %w{
131
+ base_chip/plugins
132
+ base_chip/subprojects
133
+ base_chip/blocks
134
+ base_chip/configurations
135
+ base_chip/cluster_types
136
+ }
137
+
138
+ def self.project(name = nil, &blk)
139
+ if name
140
+ @project = Project.new
141
+ @project.name = name
142
+ @project.blks << blk
143
+ else
144
+ @project
145
+ end
146
+ end
147
+ # SAFE TO DELETE? def self.action(name, &b)
148
+ # SAFE TO DELETE? @action_builders ||= {}
149
+ # SAFE TO DELETE? @action_builders[name] ||= []
150
+ # SAFE TO DELETE? @action_builders[name] << b
151
+ # SAFE TO DELETE? end
152
+ def self.load_environment
153
+ find_root
154
+ file = "#{BaseChip.root}/base_chip/settings.rb"
155
+ instance_eval(File.read(file),file)
156
+ file = '~/.basechip'
157
+ instance_eval(File.read(file),file) if File.exist? file
158
+ @project.configure
159
+ end
160
+
161
+ def self.blocks
162
+ @project.blocks.values
163
+ end
164
+ def self.get_children(parents, child_name)
165
+ a = []
166
+ parents.each do |item|
167
+ item.configure
168
+ tmp = item.send(child_name)
169
+ next unless tmp
170
+ a += tmp.values
171
+ end
172
+ a.uniq!
173
+ a
174
+ end
175
+ def self.configurations ; @configurations ||= get_children(self.blocks , :configurations) end
176
+ def self.actions ; @actions ||= get_children(self.configurations , :actions ) end
177
+ def self.test_lists ; @test_lists ||= get_children(self.configurations , :test_lists ) end
178
+ def self.tests ; @tests ||= get_children(self.test_lists , :tests ) end
179
+ def self.tools ; @tools ||= get_children(self.configurations , :tools ) end
180
+
181
+ def self.version_control
182
+ @version_control ||= (Git.new(root) if File.exist?("#{root}/.git"))
183
+ end
184
+
185
+ @@random_generator = nil
186
+ def self.random_generator
187
+ @@random_generator ||= if @@options.seed
188
+ Random.new(@@options.seed )
189
+ else
190
+ Random.new(rand(0x1_0000_0000))
191
+ end
192
+ end
193
+ def self.new_random_generator
194
+ if @@options.seed
195
+ random_generator
196
+ else
197
+ Random.new(random_generator.rand(0x1_0000_0000))
198
+ end
199
+ end
200
+ end
201
+
202
+ unless $BASE_CHIP_INCLUDE_MODE
203
+ if BaseChip.find_root(nil,true)
204
+ Dir.glob("#{BaseChip.root}/base_chip/plugins/*").each do |dir|
205
+ file = "#{dir}/lib/#{File.basename(dir)}.rb"
206
+ if File.exist?(file)
207
+ require file
208
+ else
209
+ raise "#{file} doesn't exist within plugin folder #{dir}"
210
+ end
211
+ end
212
+ end
213
+ BaseChip::TopMenu.new.run_cli
214
+ end
215
+
data/lib/dir.rb ADDED
@@ -0,0 +1,30 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ class Dir
18
+ @@pushd_stack = []
19
+ def self.pushd(d)
20
+ @@pushd_stack << Dir.pwd
21
+ Dir.chdir d
22
+ end
23
+ def self.popd
24
+ if d = @@pushd_stack.pop
25
+ Dir.chdir d
26
+ else
27
+ raise "directory stack empty, pwd = #{Dir.pwd}"
28
+ end
29
+ end
30
+ end
data/lib/reporting.rb ADDED
@@ -0,0 +1,97 @@
1
+ # Copyright 2011 Tommy Poulter
2
+ #
3
+ # This file is part of basechip.
4
+ #
5
+ # basechip is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License version 3 as
7
+ # published by the Free Software Foundation.
8
+ #
9
+ # basechip is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with basechip. If not, see <http://www.gnu.org/licenses/>.
16
+
17
+ require 'drb'
18
+ require 'base_chip/problem'
19
+
20
+ module BaseChip
21
+ class ReportingError < RuntimeError
22
+ attr :message
23
+ attr :file
24
+ attr :bundle
25
+ def initialize(message,file=nil,bundle=nil)
26
+ if message.is_a? Problem
27
+ @message = message.signature
28
+ @file = message.file
29
+ @bundle = message.bundle
30
+ else
31
+ @message = message
32
+ @file = file
33
+ @bundle = bundle
34
+ end
35
+ end
36
+ end
37
+ module Reporting
38
+ class Fault < RuntimeError;
39
+ # attr_accessor :msg
40
+ # def initialize(msg)
41
+ # @msg = msg
42
+ # end
43
+ end
44
+ def self.included mod
45
+ mod.extend Reporting::Methods
46
+ mod.class_eval do
47
+ include Reporting::Methods
48
+ end
49
+ end
50
+ module Methods
51
+ def error(msg)
52
+ re = ReportingError.new(msg)
53
+ message "error", re.message, :red
54
+ raise re
55
+ end
56
+ def fault(msg,exception_msg=nil)
57
+ message "fault", msg, :red # = "#{Process.pid} #{$0} #{ARGV.join( ' ' )} #{msg}"
58
+ DRb.stop_service
59
+ # raise Fault, (exception_msg || msg) # FIXME -- when to raise?
60
+ exit 0
61
+ end
62
+ def normal(msg)
63
+ puts msg unless $quiet
64
+ end
65
+ def verbose(msg)
66
+ puts msg if $verbose
67
+ end
68
+ def debug(msg)
69
+ message "Debug", msg if $debug
70
+ end
71
+ def message(type,msg,color = nil)
72
+ clear_line if self.respond_to? :clear_line
73
+ ostring = case color
74
+ when :red ; ""
75
+ when :green ; ""
76
+ when nil ; ''
77
+ else raise
78
+ end
79
+ msg.chomp!
80
+ if msg =~ /\n/
81
+ ostring += "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
82
+ ostring += "+++++ #{type}: (Multi-line) +++++++++++++++++++++++++++++++++++++++\n"
83
+ ostring += "#{msg}\n"
84
+ ostring += "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"
85
+ else
86
+ ostring += "#{type}: #{msg}"
87
+ end
88
+ ostring += "" if color
89
+ puts ostring
90
+ ostring
91
+ end
92
+ def class_string
93
+ self.class.to_s.gsub(/BaseChip::/,'')
94
+ end
95
+ end
96
+ end
97
+ end