Guest User

Untitled

a guest
Mar 5th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.95 KB | None | 0 0
  1. require 'pp'
  2. require 'yaml'
  3.  
  4. class Bjorm
  5. attr_accessor :path, :tables, :extension
  6.  
  7. def initialize(path='./', extension="tbl")
  8. @extension = extension
  9. @path = File.join(File.dirname(__FILE__), path)
  10. @tables = {}
  11. end
  12.  
  13. def add_table(name, columns=[])
  14. a = BjormTable.new(@path, @extension, name, columns)
  15. yield a if block_given?
  16. @tables[name] = a
  17. a
  18. end
  19.  
  20. def load_table(name)
  21. file = File.join( @path, "#{name}.#{@extension}")
  22. table = YAML.load_file(file)
  23. @tables[name] = table
  24. table
  25. end
  26. end
  27.  
  28. class BjormTable
  29. attr_accessor :name, :columns, :file
  30.  
  31. def initialize(path, extension, name, columns)
  32. @name = name
  33. @file = File.join(File.dirname(__FILE__), path, "#{name}.#{extension}")
  34. @columns = Hash.new {|h,k| h[k] = {}}
  35. @records = {}
  36. columns.each { |column,klass| @columns[column]['class'] = klass.to_s }
  37. end
  38.  
  39. def column(name,klass)
  40. @columns[name]['class'] = klass.to_s
  41. end
  42.  
  43. def serialize
  44. File.open(@file, 'w+') { |f| f << self.to_yaml }
  45. end
  46.  
  47. def add_record(key,hash, &block)
  48. unless @records.has_key? key
  49. @records[key] = {}
  50. hash.each {|column,data|
  51. if @columns.has_key? column
  52. @records[key][column] = data if data.is_a? Object.const_get(@columns[column]['class'])
  53. end
  54. }
  55. @records[key]
  56. else
  57. raise "Key already exists!"
  58. end
  59. end
  60.  
  61. def insert(hash = {})
  62. key = @records.keys.max
  63. if key.nil?
  64. key = 1
  65. else
  66. key += 1
  67. end
  68. record = add_record(key,hash)
  69. yield record if block_given?
  70. end
  71.  
  72. def project(keys)
  73. records = @records.inject({}) { |hsh, (key, data)| hsh.update(key => data.reject { |k,v| ! keys.include?(k) }) }
  74. end
  75.  
  76. def select(*keys, &block)
  77. unless keys.empty?
  78. records = project(keys)
  79. else
  80. records = @records
  81. end
  82.  
  83. if block_given?
  84. records.delete_if { |key, value| not block.call(value)}
  85. else
  86. records
  87. end
  88. end
  89.  
  90. def find(key)
  91. @records[key]
  92. end
  93. end
  94.  
  95. if __FILE__ == $0
  96. require "test/unit"
  97.  
  98. class TestBjorm < Test::Unit::TestCase
  99. def setup
  100. @db = Bjorm.new('./','ttbl')
  101. @table = BjormTable.new('./', 'ttbl', :shows, :name => String, :director => String, :author => String)
  102. File.delete(@table.file) if File.exists?(@table.file)
  103. end
  104.  
  105. def test_add_table
  106. assert_equal @db.tables.size, 0
  107. table = @db.add_table(:shows, :name => String, :director => String, :author => String)
  108. assert_equal @db.tables.size, 1
  109. assert_equal @db.tables[:shows], table
  110. end
  111.  
  112. def test_add_table_with_block
  113. assert_equal @db.tables.size, 0
  114.  
  115. table = @db.add_table('people') { |t|
  116. t.column 'name', String
  117. t.column 'age', String
  118. }
  119.  
  120. assert_equal @db.tables.size, 1
  121. assert_equal @db.tables['people'], table
  122. assert @db.tables['people'].columns.has_key?('name')
  123. end
  124.  
  125. def test_load_table
  126. @table.add_record(1, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  127. @table.serialize
  128.  
  129. assert_equal(0, @db.tables.size)
  130. @db.load_table(:shows)
  131. assert_equal(1, @db.tables.size)
  132.  
  133. File.delete(@table.file)
  134. end
  135. end
  136.  
  137. class TestBjormTable < Test::Unit::TestCase
  138. def setup
  139. @table = BjormTable.new('./', 'ttbl', :shows, :name => String, :director => String, :author => String)
  140. class<<@table
  141. attr_accessor :records
  142. end
  143. end
  144.  
  145. def test_new_table
  146. assert_equal @table.file, File.join(File.dirname(__FILE__), './shows.ttbl')
  147. assert_equal @table.columns, {:name => {'class' => 'String'}, :director => {'class' => 'String'}, :author => {'class' => 'String'}}
  148. end
  149.  
  150. def test_add_record
  151. assert_equal @table.records.size, 0
  152. @table.add_record(1, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  153. assert_equal @table.records.size, 1
  154. assert_raise(RuntimeError) { @table.add_record(1, :pie) }
  155. end
  156.  
  157. def test_insert
  158. assert_equal @table.records.size, 0
  159. @table.insert(:name => 'Proof', :director => 'Mad', :author => 'Dave')
  160. assert_equal @table.records.size, 1
  161. assert_equal @table.select.keys.max, 1
  162. @table.add_record(22, :name => 'wow', :director => 'huh', :author => 'damn')
  163. @table.insert(:name => 'cat', :author => 'dog', :director => 'horse')
  164. assert_equal @table.select.keys.max, 23
  165. end
  166.  
  167. def test_insert_with_block
  168. assert_equal @table.records.size, 0
  169. @table.insert do |record|
  170. record[:name] = 'No Exit'
  171. record[:author] = 'Sarte'
  172. record[:director] = 'Southwest'
  173. end
  174. assert_equal @table.records.size, 1
  175. end
  176.  
  177. def test_column
  178. assert_equal 3, @table.columns.size
  179. @table.column :drama, :Symbol
  180. assert_equal 4, @table.columns.size
  181. assert_equal({'class' => 'Symbol'}, @table.columns[:drama])
  182. end
  183.  
  184. def test_select
  185. assert_equal @table.select.size, 0
  186. @table.add_record(1, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  187. assert_equal @table.select.size, 1
  188. assert !@table.select(:name)[1].has_key?(:director)
  189. assert @table.select[1].has_key?(:director)
  190. assert_equal @table.select(:name), {1 => {:name => 'Proof'} }
  191. assert_equal @table.select, { 1 => {:name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn'} }
  192. end
  193.  
  194. def test_select_with_block
  195. @table.add_record(1, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  196. @table.add_record(2, :name => 'On The Verge', :director => 'Ellen Fenster', :author => 'unknown')
  197.  
  198. result = @table.select { |x| x[:name] == 'Proof' }
  199. assert_equal(result, { 1 => {:name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn'} } )
  200.  
  201. @table.add_record(3, :name => 'Poof', :director => 'Mdeline Ringham', :author => 'Jon Fraatz')
  202. assert_equal 1, @table.select { |x| x[:name] =~ /oof/ && x[:director] =~ /Mad/}.size
  203. end
  204.  
  205. def test_find
  206. assert_nil @table.find(2)
  207. @table.add_record(2, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  208. assert_equal @table.find(2), :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn'
  209. end
  210.  
  211. def test_serialize
  212. File.delete(@table.file) if File.exists?(@table.file)
  213.  
  214. @table.add_record(1, :name => 'Proof', :director => 'Madeline Ringham', :author => 'David Auburn')
  215.  
  216. @table.serialize
  217. assert File.exists?(@table.file)
  218.  
  219. a = YAML.load_file(@table.file)
  220. assert_instance_of(BjormTable, a)
  221. assert_equal @table.columns, a.columns
  222.  
  223. File.delete(@table.file)
  224. end
  225. end
  226. end
Add Comment
Please, Sign In to add comment