nera 0.4.0 → 0.5.0

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.
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.5.0
2
+ * 1 major enhancement:
3
+ * Routines to remove, dump, and import simulators are implemented.
4
+ Dumped data can be imported to another database.
5
+ * 2 bug fixes:
6
+
7
+
1
8
  == 0.4.0
2
9
  * 1 major enhancement:
3
10
  * A new format is adopted in parameters_table.
data/lib/nera/nera_cui.rb CHANGED
@@ -74,7 +74,7 @@ HEADER
74
74
  r[:name]
75
75
  end
76
76
  names.unshift("go to Jobs layer")
77
- names += ["show logs", "exit"]
77
+ names += ["show logs", "remove a simulator", "dump a simulator", "import a simulator", "exit"]
78
78
  selected = 0
79
79
  Dir.chdir( slc.path_to_sim_layer) {
80
80
  selected = Dialog::select_one_or_return_string( names, "Select a simulator.")
@@ -83,12 +83,46 @@ HEADER
83
83
  return :simulator_layer
84
84
  end
85
85
  }
86
- if names[selected] == "go to Jobs layer"
86
+ case names[selected]
87
+ when "go to Jobs layer"
87
88
  return :job_layer
88
- elsif names[selected] == "show logs"
89
+ when "show logs"
89
90
  system "less #{slc.path_to_log_file}"
90
91
  return :simulator_layer
91
- elsif names[selected] == "exit"
92
+ when "remove a simulator"
93
+ sim_names = ["Cancel"] + slc.list.map do |r| r[:name] end
94
+ selected = Dialog::select_one( sim_names, "Select a simulator to be removed.")
95
+ return :simulator_layer if selected == 0
96
+ flag = slc.remove_simulator( sim_names[selected])
97
+ if flag
98
+ Dialog::message("Simulator \"#{sim_names[selected]}\" have been successfully removed from the database.")
99
+ else
100
+ Dialog::message("Failed to remove the simulator \"#{sim_names[selected]}\". There are uncompleted jobs.")
101
+ end
102
+ return :simulator_layer
103
+ when "dump a simulator"
104
+ sim_names = ["Cancel"] + slc.list.map do |r| r[:name] end
105
+ selected = Dialog::select_one( sim_names, "Select a simulator to be dumped.")
106
+ return :simulator_layer if selected == 0
107
+ flag = slc.dump_simulator( sim_names[selected])
108
+ if flag
109
+ Dialog::message("Data for the simulator \"#{sim_names[selected]}\" have been successfully dumped.")
110
+ else
111
+ Dialog::message("Failed to dump the simulator \"#{sim_names[selected]}\". There are uncompleted jobs.")
112
+ end
113
+ return :simulator_layer
114
+ when "import a simulator"
115
+ list = ["Cancel"] + slc.importable_simulators
116
+ selected = Dialog::select_one( list, "Select a simulator to be dumped.")
117
+ return :simulator_layer if selected == 0
118
+ flag = slc.import_simulator( list[selected])
119
+ if flag
120
+ Dialog::message("Simulator \"#{list[selected]}\" have been successfully imported.")
121
+ else
122
+ Dialog::message("Failed to import the simulator \"#{sim_names[selected]}\".")
123
+ end
124
+ return :simulator_layer
125
+ when "exit"
92
126
  return :exit
93
127
  else
94
128
  @simulator_class = names[selected]
@@ -21,6 +21,18 @@ module NERA
21
21
  def self.inherited_simulators
22
22
  return @@inherited
23
23
  end
24
+
25
+ def self.remove_simulator( sim_class)
26
+ raise ArgumentError unless sim_class.is_a?(Class)
27
+ @@inherited -= [ sim_class ]
28
+ end
29
+
30
+ def self.add_simulator( sim_class)
31
+ raise ArgumentError unless sim_class.is_a?(Class)
32
+ @@inherited << sim_class
33
+ @@inherited.uniq!
34
+ end
35
+
24
36
  end
25
37
 
26
38
  end
@@ -1,6 +1,8 @@
1
1
  require 'nera_db_folders'
2
2
  require 'nera_simulator_records'
3
3
  require 'nera_parameter_records'
4
+ require 'nera_job_records'
5
+ require 'pathname'
4
6
 
5
7
  module NERA
6
8
 
@@ -21,22 +23,24 @@ module NERA
21
23
 
22
24
  NERA::Simulator.inherited_simulators.each do |sim|
23
25
  next if list.find do |rec| rec[:name] == sim.to_s end
26
+ mapped = NERA::ParameterRecords::ATTRIBUTES_PART.map do |att| att[0] end
24
27
  found = sim::Parameters.find do |p|
25
- p[0] == :in_trashbox? or p[0] == :created_at or p[0] == :updated_at
28
+ mapped.include?(p[0])
29
+ # p[0] == :in_trashbox? or p[0] == :created_at or p[0] == :updated_at
26
30
  end
27
31
  next if found
28
32
  register_a_simulator( sim)
29
33
  end
30
34
  end
31
-
35
+
32
36
  def list
33
37
  @sim_records.list
34
38
  end
35
-
39
+
36
40
  def path_to_sim_layer
37
41
  @db_folders.path_to_simulator_layer
38
42
  end
39
-
43
+
40
44
  def get_class_by_name( sim_name)
41
45
  raise ArgumentError unless sim_name.is_a?(String)
42
46
  found = NERA::Simulator.inherited_simulators.find do |sim|
@@ -68,6 +72,172 @@ module NERA
68
72
  @db_folders.path_to_log_file
69
73
  end
70
74
 
75
+ def remove_simulator( sim_name)
76
+ flag = true
77
+ sim_class = get_class_by_name( sim_name)
78
+ return nil unless sim_class
79
+ sim_id = (list.find do |rec| rec[:name] == sim_name end)[:id]
80
+ return nil unless sim_id
81
+ job_records = NERA::JobRecords.new( @db_folders.path_to_jobs_table )
82
+ job_records.transaction {
83
+ @sim_records.transaction {
84
+ # check uncompleted jobs
85
+ found = job_records.list_all.find do |rec| rec[:simulator] == sim_name end
86
+ if found
87
+ flag = nil
88
+ return
89
+ end
90
+ # destroy the record
91
+ f = @sim_records.destroy( sim_id)
92
+ raise "Couldn't destroy the record #{sim_id} in simulators table" unless f
93
+ # compression
94
+ path1 = @db_folders.path_to_parameter_layer( sim_class)
95
+ path2 = File.dirname( @db_folders.path_to_parameters_table( sim_class) )
96
+ path3 = File.join( @db_folders.path_to_simulator_layer, "Simulator_classes", "#{sim_name}.rb")
97
+ raise "Couldn't find #{path1}" unless File.directory?(path1)
98
+ raise "Couldn't find #{path2}" unless File.directory?(path2)
99
+ raise "Couldn't find #{path3}" unless File.exist?(path3)
100
+ base_path = Pathname.new( @db_folders.path_to_simulator_layer ).realpath
101
+ path1 = Pathname.new( path1).realpath.relative_path_from( base_path).to_s
102
+ path2 = Pathname.new( path2).realpath.relative_path_from( base_path).to_s
103
+ path3 = Pathname.new( path3).realpath.relative_path_from( base_path).to_s
104
+ Dir.chdir(base_path) {
105
+ tar_file = "#{sim_id}_#{sim_name}.tar"
106
+ cmd = "tar cf #{tar_file} #{path1} #{path2} #{path3}"
107
+ system cmd
108
+ raise "command \"#{cmd}\" failed." unless $? == 0
109
+ bz2_file = tar_file + '.bz2'
110
+ FileUtils.rm( bz2_file) if File.exist?( bz2_file )
111
+ cmd = "bzip2 #{tar_file}"
112
+ system cmd
113
+ raise "command \"#{cmd}\" failed." unless $? == 0
114
+ FileUtils.rm_r( path1)
115
+ FileUtils.rm_r( path2)
116
+ FileUtils.rm( path3)
117
+ }
118
+ # remove inherited classes
119
+ NERA::Simulator.remove_simulator( sim_class)
120
+ # keep a log
121
+ @db_folders.logger.info(self.class.to_s) {
122
+ "removed the simulator (#{sim_class.to_s})"
123
+ }
124
+ }
125
+ }
126
+ return flag
127
+ end
128
+
129
+ def dump_simulator( sim_name, job_records = nil)
130
+ flag = true
131
+ sim_class = get_class_by_name( sim_name)
132
+ return nil unless sim_class
133
+ sim_id = (list.find do |rec| rec[:name] == sim_name end)[:id]
134
+ return nil unless sim_id
135
+ job_records = NERA::JobRecords.new( @db_folders.path_to_jobs_table ) unless job_records.is_a?(NERA::JobRecords)
136
+ job_records.transaction {
137
+ @sim_records.transaction {
138
+ # check uncompleted jobs
139
+ found = job_records.list_all.find do |rec| rec[:simulator] == sim_name end
140
+ if found
141
+ flag = nil
142
+ return
143
+ end
144
+ # destroy the record
145
+ # f = @sim_records.destroy( sim_id)
146
+ # raise "Couldn't destroy the record #{sim_id} in simulators table" unless f
147
+ # compression
148
+ path1 = @db_folders.path_to_parameter_layer( sim_class)
149
+ path2 = File.dirname( @db_folders.path_to_parameters_table( sim_class) )
150
+ path3 = File.join( @db_folders.path_to_simulator_layer, "Simulator_classes", "#{sim_name}.rb")
151
+ raise "Couldn't find #{path1}" unless File.directory?(path1)
152
+ raise "Couldn't find #{path2}" unless File.directory?(path2)
153
+ raise "Couldn't find #{path3}" unless File.exist?(path3)
154
+ base_path = Pathname.new( @db_folders.path_to_simulator_layer ).realpath
155
+ path1 = Pathname.new( path1).realpath.relative_path_from( base_path).to_s
156
+ path2 = Pathname.new( path2).realpath.relative_path_from( base_path).to_s
157
+ path3 = Pathname.new( path3).realpath.relative_path_from( base_path).to_s
158
+ Dir.chdir(base_path) {
159
+ tar_file = "#{sim_id}_#{sim_name}.tar"
160
+ cmd = "tar cf #{tar_file} #{path1} #{path2} #{path3}"
161
+ system cmd
162
+ raise "command \"#{cmd}\" failed." unless $? == 0
163
+ bz2_file = tar_file + '.bz2'
164
+ FileUtils.rm( bz2_file) if File.exist?( bz2_file )
165
+ cmd = "bzip2 #{tar_file}"
166
+ system cmd
167
+ raise "command \"#{cmd}\" failed." unless $? == 0
168
+ # FileUtils.rm_r( path1)
169
+ # FileUtils.rm_r( path2)
170
+ # FileUtils.rm( path3)
171
+ }
172
+ # remove inherited classes
173
+ # NERA::Simulator.remove_simulator( sim_class)
174
+ # keep a log
175
+ @db_folders.logger.info(self.class.to_s) {
176
+ "dumped the simulator (#{sim_class.to_s})"
177
+ }
178
+ }
179
+ }
180
+ return flag
181
+ end
182
+
183
+
184
+ def importable_simulators
185
+ sim_names = @sim_records.list.map do |rec| rec[:name] end
186
+
187
+ Dir.chdir( @db_folders.path_to_simulator_layer ) {
188
+ candidates = Dir.glob( "[0-9]*_[A-Z]*.tar.bz2").find_all do |file|
189
+ file =~ /^([0-9]+)_([A-Z]\w*)\.tar\.bz2/ and !(sim_names.include?($2))
190
+ end
191
+ # found = candidates.find_all do |file|
192
+ # file =~ /^([0-9]+)_([A-Z]\w*)\.tar\.bz2/ and
193
+ # !(@sim_records.list.include? do |rec| rec[:name] == $2 end)
194
+ # end
195
+ return candidates
196
+ }
197
+ end
198
+
199
+ def import_simulator( sim_file)
200
+ flag = true
201
+ return nil unless sim_file =~ /^([0-9]+)_([A-Z]\w*)\.tar\.bz2/
202
+ return nil unless File.exist?( File.join(@db_folders.path_to_simulator_layer,sim_file) )
203
+ sim_name = $2
204
+ job_records = NERA::JobRecords.new( @db_folders.path_to_jobs_table )
205
+
206
+ job_records.transaction {
207
+ @sim_records.transaction {
208
+ # check name overlap
209
+ if @sim_records.list.find do |rec| rec[:name] == sim_name end
210
+ flag = nil
211
+ return
212
+ end
213
+ raise "must not happen" if File.directory?( File.join( @db_folders.path_to_simulator_layer, sim_name ) )
214
+ raise "must not happen" if File.directory?( File.join( File.dirname(@db_folders.path_to_simulators_table), sim_name) )
215
+ raise "must not happen" if File.exist?( File.join( @db_folders.path_to_simulator_layer, "Simulator_classes", "#{sim_name}.rb") )
216
+ # decompress the file
217
+ Dir.chdir(@db_folders.path_to_simulator_layer) {
218
+ # cmd = "bunzip2 #{sim_file}"
219
+ # system cmd
220
+ # raise "command \"#{cmd}\" failed." unless $? == 0
221
+ tar_file = sim_file.sub(/\.bz2$/,'')
222
+ cmd = "tar xjf #{sim_file}"
223
+ system cmd
224
+ raise "command \"#{cmd}\" failed." unless $? == 0
225
+ }
226
+ # load simulator definition
227
+ require File.join( @db_folders.path_to_simulator_layer, "Simulator_classes", "#{sim_name}.rb")
228
+ sim_class = sim_name.split(/::/).inject(Object) {|c,name| c.const_get(name) }
229
+ raise "invalid definition of simulator class #{sim_name}" unless sim_class.is_a?(Class)
230
+ NERA::Simulator.add_simulator( sim_class)
231
+ flag = @sim_records.add( sim_class)
232
+ # keep a log
233
+ @db_folders.logger.info(self.class.to_s) {
234
+ "imported the simulator (#{sim_class.to_s})"
235
+ }
236
+ }
237
+ }
238
+ return flag
239
+ end
240
+
71
241
  end
72
242
 
73
243
  end
data/lib/nera.rb CHANGED
@@ -22,5 +22,5 @@ require 'nera_simulator_records'
22
22
  require 'nera_remote_connector'
23
23
 
24
24
  module NERA
25
- VERSION = '0.4.0'
25
+ VERSION = '0.5.0'
26
26
  end
@@ -23,4 +23,24 @@ class TC_NERA_SIMULATOR < Test::Unit::TestCase
23
23
  end
24
24
  assert(a)
25
25
  end
26
+
27
+ def test_remove_simulator
28
+ sim1 = NERA::Simulator.inherited_simulators
29
+ NERA::Simulator.remove_simulator( Ising)
30
+ sim2 = NERA::Simulator.inherited_simulators
31
+ assert_equal( [Heisenberg, XY], sim2)
32
+ assert_raise(ArgumentError) {
33
+ NERA::Simulator.remove_simulator( "Ising")
34
+ }
35
+ end
36
+
37
+ def test_add_simulator
38
+ NERA::Simulator.remove_simulator( Ising)
39
+ NERA::Simulator.add_simulator( Ising)
40
+ sim2 = NERA::Simulator.inherited_simulators
41
+ assert_equal( [Heisenberg, XY, Ising], sim2)
42
+ assert_raise(ArgumentError) {
43
+ NERA::Simulator.add_simulator( "Ising")
44
+ }
45
+ end
26
46
  end
@@ -8,9 +8,13 @@ class TC_NERA_SIM_LAYER_CONTROLLER < Test::Unit::TestCase
8
8
  FileUtils.mkdir(@testdir)
9
9
  FileUtils.chdir(@testdir)
10
10
  @db_folder = "nera_db"
11
+ NERA::Simulator.add_simulator( Ising)
12
+ NERA::Simulator.add_simulator( Heisenberg)
11
13
  NERA::DbFolders.create_db( @db_folder)
12
14
  @dbf = NERA::DbFolders.new( @db_folder)
13
15
  @slc = NERA::SimulatorLayerController.new( @db_folder)
16
+ FileUtils.touch(File.join(@db_folder,"Simulator_classes","Ising.rb") )
17
+ FileUtils.touch(File.join(@db_folder,"Simulator_classes","Heisenberg.rb") )
14
18
  end
15
19
 
16
20
  def teardown
@@ -63,6 +67,112 @@ class TC_NERA_SIM_LAYER_CONTROLLER < Test::Unit::TestCase
63
67
  def test_path_to_log_file
64
68
  path = @slc.path_to_log_file
65
69
  assert_equal( @db_folder + "/Tables/logfile.txt", path)
70
+ end
71
+
72
+ def test_remove_simulator
73
+ assert( File.exist?( File.join(@db_folder,"Simulator_classes","Ising.rb") ) )
74
+ assert_nil( @slc.remove_simulator( "unknown_simulator") )
75
+
76
+ # create a job
77
+ plc = NERA::ParameterLayerController.new( @db_folder, "Ising")
78
+ pid = plc.create_a_new_parameter_set( {} )
79
+ rlc = NERA::RunLayerController.new( @db_folder, "Ising", pid)
80
+ jid = rlc.create_jobs( 1)
81
+ assert_nil( @slc.remove_simulator( "Ising") )
82
+ assert( @slc.list.find do |rec| rec[:name] == "Ising" end )
83
+ assert( rlc.cancel_jobs( jid ) )
84
+
85
+ # check raise
86
+ FileUtils.rm( File.join(@db_folder,"Simulator_classes","Ising.rb") )
87
+ assert_raise(RuntimeError) {
88
+ @slc.remove_simulator("Ising")
89
+ }
90
+ assert( @slc.list.find do |rec| rec[:name] == "Ising" end )
91
+ FileUtils.touch( File.join(@db_folder,"Simulator_classes","Ising.rb") )
92
+
93
+ # remove a simulator
94
+ assert( @slc.remove_simulator( "Ising") )
95
+ assert( !File.directory?( File.join(@db_folder,"Ising") ) )
96
+ assert( !File.directory?( File.join(@db_folder,"Tables","Ising") ) )
97
+ assert( !File.exist?( File.join(@db_folder,"Simulator_classes","Ising.rb") ) )
98
+ assert( Dir.glob("#{@db_folder}/[1-9]_Ising.tar.bz2").size > 0 )
99
+ assert_nil( @slc.list.find do |rec| rec[:name] == "Ising" end )
100
+ assert_nil( @slc.get_class_by_name("Ising") )
101
+
102
+ # dump before remove
103
+ assert( @slc.dump_simulator("Heisenberg") )
104
+ assert( @slc.remove_simulator("Heisenberg") )
105
+ end
66
106
 
107
+ def test_dump_simulator
108
+ assert_nil( @slc.dump_simulator( "unknown_simulator") )
109
+
110
+ # create a job
111
+ plc = NERA::ParameterLayerController.new( @db_folder, "Ising")
112
+ pid = plc.create_a_new_parameter_set( {} )
113
+ rlc = NERA::RunLayerController.new( @db_folder, "Ising", pid)
114
+ jid = rlc.create_jobs( 1)
115
+ assert_nil( @slc.dump_simulator( "Ising") )
116
+ assert_equal( 0, Dir.glob("#{@db_folder}/[1-9]_Ising.tar.bz2").size)
117
+ assert( rlc.cancel_jobs( jid ) )
118
+
119
+ # check raise
120
+ FileUtils.rm( File.join(@db_folder,"Simulator_classes","Ising.rb") )
121
+ assert_raise(RuntimeError) {
122
+ @slc.dump_simulator("Ising")
123
+ }
124
+ assert( @slc.list.find do |rec| rec[:name] == "Ising" end )
125
+ FileUtils.touch( File.join(@db_folder,"Simulator_classes","Ising.rb") )
126
+
127
+ # remove a simulator
128
+ assert( @slc.dump_simulator( "Ising") )
129
+ assert( File.directory?( File.join(@db_folder,"Ising") ) )
130
+ assert( File.directory?( File.join(@db_folder,"Tables","Ising") ) )
131
+ assert( File.exist?( File.join(@db_folder,"Simulator_classes","Ising.rb") ) )
132
+ assert( Dir.glob("#{@db_folder}/[1-9]_Ising.tar.bz2").size > 0 )
133
+ assert( @slc.list.find do |rec| rec[:name] == "Ising" end )
134
+ assert( @slc.get_class_by_name("Ising") )
135
+ # dump again
136
+ assert( @slc.dump_simulator( "Ising") )
137
+ end
138
+
139
+ def test_importable_simulators
140
+ assert_equal( [], @slc.importable_simulators)
141
+ @slc.remove_simulator( "Ising")
142
+ list = @slc.importable_simulators
143
+ assert_equal( 1, list.size )
144
+ assert_match( /^[1-2]_Ising\.tar\.bz2$/, list[0] )
145
+ @slc.remove_simulator( "Heisenberg")
146
+ list = @slc.importable_simulators
147
+ assert_equal( 2, list.size )
148
+ assert( list.find do |l| l =~ /^[1-2]_Ising\.tar\.bz2$/ end )
149
+ assert( list.find do |l| l =~ /^[1-2]_Heisenberg\.tar\.bz2$/ end)
150
+ found = list.find do |l| l =~ /^[1-2]_Ising\.tar\.bz2$/ end
151
+ @slc.import_simulator( found)
152
+ list = @slc.importable_simulators
153
+ assert_equal( 1, list.size )
154
+ assert_match( /^[1-2]_Heisenberg\.tar\.bz2$/, list[0] )
155
+
156
+ FileUtils.touch( File.join(@db_folder,"3_Ising.tar.bz2") )
157
+ list2 = @slc.importable_simulators
158
+ assert_equal( list2, list)
159
+ FileUtils.rm( File.join(@db_folder,"3_Ising.tar.bz2") )
160
+ end
161
+
162
+ def test_import_simulator
163
+ assert_nil( @slc.import_simulator("1_Unknown.tar.bz2") )
164
+ @slc.remove_simulator("Ising")
165
+ fname = @slc.importable_simulators[0]
166
+ assert( @slc.import_simulator(fname) )
167
+ assert( File.directory?( File.join(@db_folder,"Ising") ) )
168
+ assert( File.exist?( File.join(@db_folder,"Ising","parameters.yml") ) )
169
+ assert( File.directory?( File.join(@db_folder,"Tables","Ising") ) )
170
+ assert( File.exist?( File.join(@db_folder,"Tables","Ising","parameters.pstore") ) )
171
+ assert( File.exist?( File.join(@db_folder,"Simulator_classes","Ising.rb") ) )
172
+ assert( Dir.glob( File.join(@db_folder,"[1-9]_Ising.tar.bz2")).size > 0 )
173
+ found = @slc.list.find do |rec| rec[:name] == "Ising" end
174
+ assert_equal( 3, found[:id] )
175
+ assert_equal( Ising, @slc.get_class_by_name("Ising") )
67
176
  end
177
+
68
178
  end
data/website/index.html CHANGED
@@ -34,7 +34,7 @@
34
34
  <div class="sidebar">
35
35
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/nera"; return false'>
36
36
  <p>Get Version</p>
37
- <a href="http://rubyforge.org/projects/nera" class="numbers">0.4.0</a>
37
+ <a href="http://rubyforge.org/projects/nera" class="numbers">0.5.0</a>
38
38
  </div>
39
39
  </div>
40
40
  <h2>What</h2>
@@ -59,14 +59,14 @@ Classifying the result data into folders, keeping a note of what we have done, c
59
59
  <p>The trunk repository is <code>svn://rubyforge.org/var/svn/nera/trunk</code> for anonymous access.</p>
60
60
  <h3>Build and test instructions</h3>
61
61
  <pre>cd nera
62
- rake test
62
+ ruby test/runner.rb
63
63
  rake install_gem</pre>
64
64
  <h2>License</h2>
65
65
  <p>This code is free to use under the terms of the <span class="caps">GPL</span> license.</p>
66
66
  <h2>Contact</h2>
67
67
  <p>Comments are welcome. Send an email to <a href="mailto:murase_at_serow.t.u-tokyo.ac.jp">Yohsuke Murase</a></p>
68
68
  <p class="coda">
69
- <a href="murase@serow.t.u-tokyo.ac.jp">Yohsuke Murase</a>, 26th November 2009<br>
69
+ <a href="murase@serow.t.u-tokyo.ac.jp">Yohsuke Murase</a>, 28th November 2009<br>
70
70
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
71
71
  </p>
72
72
  </div>
data/website/index.txt CHANGED
@@ -41,7 +41,7 @@ The trunk repository is <code>svn://rubyforge.org/var/svn/nera/trunk</code> for
41
41
  h3. Build and test instructions
42
42
 
43
43
  <pre>cd nera
44
- rake test
44
+ ruby test/runner.rb
45
45
  rake install_gem</pre>
46
46
 
47
47
 
@@ -34,7 +34,7 @@
34
34
  <div class="sidebar">
35
35
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/nera"; return false'>
36
36
  <p>Get Version</p>
37
- <a href="http://rubyforge.org/projects/nera" class="numbers">0.4.0</a>
37
+ <a href="http://rubyforge.org/projects/nera" class="numbers">0.5.0</a>
38
38
  </div>
39
39
  </div>
40
40
  <p>The database created by nera is a hierarchical database which consists of three layers.<br />
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nera
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yohsuke Murase
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-26 00:00:00 +09:00
12
+ date: 2009-11-28 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency