rbbt-util 5.5.2 → 5.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTE0ZTY1ZWVjMjZjMzBlMTQzNjNlMzlmYjY1NzBjNDFjZTc1NzExMA==
4
+ YTZhNzI1NTUwMDE2ZWY3NTVkY2UyMWM3OTFlNTFjZmZkZmY5YmNkZQ==
5
5
  data.tar.gz: !binary |-
6
- OWM2NGYwNDA0ODA4Y2FiNGQzMzE4ZjUwZDBiYTdiYmM2ZGVhYTc0ZQ==
6
+ ZGQyYjgxYjg4MzgxZTk3Y2QwNTdhOWEwODUzMzk0ODJlZWY0MGMxMQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ODg1YTYxNGE5NWZkY2YyYmUzYmQ5ODlkZjQ0ZDgzZGZlNzA1YzZmNGU0NDZm
10
- YzM2OGI3Y2RiOGMwNTI0ZDAyOWFiOTRjYmY5ODVmMjJkZjBlYTVkMWI2NTJj
11
- ZGUyOGE4YWVmMjQyMzg2OGU2YzhjNjU3MDc5YTcwN2VjNDQwY2M=
9
+ YzkxYmJmYzQwMTAxMmIyMmJkZWZlZjY3ZDdiOWFkOTdmZGUwMDc1Zjc1ODE5
10
+ YjMzYmNhM2YxMzg4YjllZTAwNDZjYTc2ZmVhNDZiMzQ2YjI2MTFkNTUzODZh
11
+ YzZkYjg4NWU4ZWEwZDM2NDE3NGZhYzIxYmJkZTZiNDAzMzQ3ODM=
12
12
  data.tar.gz: !binary |-
13
- NTk5NDg5OWZhYzU4ZDA3ODJlZjJmZDU2MTk5ZmJiNzJmNThhZWZhNmMxOWFj
14
- YTY4MWI3Yjg5NmVmZWFkYTc5Mjk0OGI1YWQ3ZDc4NzJjNzIxZGE3ZTBkMjU2
15
- ODM4ZGIwNDhhMThlNzRhNDQ2M2E1Y2QxNjg4YTkyZWZmYjU1NmI=
13
+ NmI5MzRjNjFjYzcwOThhZTc2Njg2MmViZmFlNWNlOTFiYWI4N2NjM2E3MzBi
14
+ MjY0ZWVhMzY4ZmMxNTI5ZjE4OTFiMTA2Mzg3YzFlNmJkZTU4NjE1MmYwZjdh
15
+ NjhhNGU4NTdmNzFkOTA2OGUzNzUyMjc5ZTU0ZjA4NzUxZTc2Yjg=
data/bin/rbbt_Rutil.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rbbt-util'
3
+ require 'rbbt/util/R'
4
+
5
+ STDOUT.write File.join(R::LIB_DIR, "util.R")
3
6
 
4
- STDOUT.write Rbbt.share.lib.R["util.R"].find
data/etc/app.d/base.rb ADDED
@@ -0,0 +1,34 @@
1
+ #{{{ MODULES AND HELPERS
2
+ register Sinatra::RbbtRESTMain
3
+ register Sinatra::RbbtRESTEntity
4
+ register Sinatra::RbbtRESTWorkflow
5
+ register Sinatra::RbbtRESTFileServer
6
+ register Sinatra::RbbtRESTKnowledgeBase
7
+ helpers Sinatra::RbbtMiscHelpers
8
+
9
+ #{{{ SESSIONS
10
+ use Rack::Session::Cookie, :key => 'rack.session',
11
+ :path => '/',
12
+ :expire_after => 2592000,
13
+ :secret => 'StudyExplorer secret!!'
14
+
15
+
16
+ #{{{ DIRECTORIES
17
+ local_var = Rbbt.var.find
18
+ set :cache_dir , local_var.sinatra.cache.find
19
+ set :file_dir , local_var.sinatra.files.find
20
+ set :permalink_dir , local_var.sinatra.permalink.find
21
+ set :favourites_dir , local_var.sinatra.favourites.find
22
+ set :favourite_lists_dir , local_var.sinatra.favourite_lists
23
+ set :favourite_maps_dir , local_var.sinatra.favourite_maps
24
+
25
+ #{{{ WORKFLOWS
26
+
27
+ if Rbbt.etc.workflows.find.exists?
28
+ Rbbt.etc.workflows.find.read.split("\n").each do |workflow|
29
+ Workflow.require_workflow workflow
30
+ add_workflow Kernel.const_get(workflow), true
31
+ end
32
+ end
33
+
34
+
@@ -0,0 +1,40 @@
1
+ Rbbt.etc.requires.read.split("\n").each do |file|
2
+ next if file.empty?
3
+ Log.debug("requiring #{ file }")
4
+ require file
5
+ end if Rbbt.etc.requires.exists?
6
+
7
+
8
+ Entity.entity_list_cache = Rbbt.var.find.sinatra.entity_lists
9
+ Entity.entity_map_cache = Rbbt.var.find.sinatra.entity_maps
10
+ Entity.entity_property_cache = Rbbt.var.find.sinatra.entity_properties
11
+
12
+ Rbbt.etc.entities.read.split("\n").each do |name|
13
+ next if name.empty?
14
+ mod = Kernel.const_get name
15
+ Log.debug("Including Entity::REST for #{ name }")
16
+ mod.module_eval do
17
+ include Entity::REST
18
+ end
19
+ end if Rbbt.etc.entities.exists?
20
+
21
+ $annotation_repo = Rbbt.var.find(:lib).sinatra.annotation_repo.find
22
+ Rbbt.etc.persit_properties.yaml.each do |name,list|
23
+ next if name.empty?
24
+ mod = Kernel.const_get name
25
+ mod.module_eval do
26
+ list.each do |elem|
27
+ prop, type, repo = elem.split(",").collect{|e| e.strip}
28
+
29
+ Log.debug("Persist #{name} #{prop}: #{[type, repo].compact * ", "}")
30
+ if repo == 'repo'
31
+ options = {:annotation_repo => $annotation_repo}
32
+ else
33
+ options = {}
34
+ end
35
+ persist prop, type, options
36
+ end
37
+ end
38
+ end if Rbbt.etc.persit_properties.exists?
39
+
40
+
@@ -0,0 +1,10 @@
1
+ #{{{ FINDER
2
+ finder = Finder.new
3
+ if ENV['RBBT_FINDER']
4
+ finder.add_instance(KEGG.pathways, :grep => '^hsa\|^#', :fields => ["Pathway Name"], :namespace => "Hsa/jun2011", :fix => Proc.new{|l| l.sub(/ - Homo sapiens.*/,'')})
5
+ finder.add_instance(Organism.lexicon("Hsa/jun2011"), :persist => true, :namespace => "Hsa/jun2011", :grep => '^LRG_', :invert_grep => true)
6
+ end
7
+ set :finder, finder
8
+ Log.debug("Finder started with: #{finder.instances.length} instances")
9
+
10
+
data/etc/app.d/init.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'zurb-foundation'
2
+ require 'modular-scale'
3
+
4
+ require 'rbbt'
5
+ require 'rbbt/rest/main'
6
+ require 'rbbt/rest/entity'
7
+ require 'rbbt/rest/workflow'
8
+ require 'rbbt/rest/file_server'
9
+ require 'rbbt/rest/helpers'
10
+
11
+ YAML::ENGINE.yamler = 'syck' if defined? YAML::ENGINE and YAML::ENGINE.respond_to? :yamler
@@ -0,0 +1,9 @@
1
+ EntityRESTHelpers.entity_resources.unshift Rbbt.www.views.find
2
+ RbbtRESTHelpers.template_resources.unshift Rbbt.www.views.find
3
+ RbbtRESTHelpers.add_sass_load_path "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets"
4
+ RbbtRESTHelpers.add_sass_load_path "#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/scss/"
5
+ RbbtRESTHelpers.add_sass_load_path "#{Gem.loaded_specs['modular-scale'].full_gem_path}/stylesheets/"
6
+ RbbtRESTHelpers.javascript_resources << Path.setup("#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/js/foundation")
7
+ RbbtRESTHelpers.javascript_resources << Path.setup("#{Gem.loaded_specs['zurb-foundation'].full_gem_path}/js/vendor")
8
+
9
+
data/lib/rbbt.rb CHANGED
@@ -4,9 +4,3 @@ module Rbbt
4
4
  extend Resource
5
5
  pkgdir = 'rbbt'
6
6
  end
7
-
8
- #Open.cachedir = Rbbt.var.cache["open-remote"].find :user
9
- #TmpFile.tmpdir = Rbbt.tmp.find :user
10
- #FileCache.cachedir = Rbbt.var.cache.filecache.find :user
11
- #Persist.cachedir = Rbbt.var.cache.persistence.find :user
12
-
@@ -2,7 +2,14 @@ require 'json'
2
2
 
3
3
  module Annotated
4
4
 
5
- def self.load(object, info)
5
+ def self.flatten(array)
6
+ return array if array.nil? or array.empty?
7
+ return array.flatten if AnnotatedArray === array
8
+ return array if array.compact.collect{|e| e.info }.uniq.length > 1
9
+ array.compact.first.annotate(array.flatten).tap{|a| a.extend AnnotatedArray }
10
+ end
11
+
12
+ def self.load_entity(object, info)
6
13
  annotation_types = info.delete(:annotation_types) || info.delete("annotation_types") || []
7
14
  annotation_types = annotation_types.split("|") if String === annotation_types
8
15
 
@@ -34,9 +41,23 @@ module Annotated
34
41
  end
35
42
  end
36
43
 
44
+ def self.load_info(fields, values)
45
+ info = {}
46
+ fields.each_with_index do |field,i|
47
+ next if field == "literal"
48
+ if field == "JSON"
49
+ JSON.parse(values[i]).each do |key, value|
50
+ info[key.to_sym] = value
51
+ end
52
+ else
53
+ info[field.to_sym] = resolve_array(values[i])
54
+ end
55
+ end
56
+ info
57
+ end
58
+
37
59
  def self.load_tsv_values(id, values, *fields)
38
60
  fields = fields.flatten
39
- info = {}
40
61
  literal_pos = fields.index "literal"
41
62
 
42
63
  object = case
@@ -49,36 +70,18 @@ module Annotated
49
70
  object = resolve_array(object)
50
71
 
51
72
  if Array === values.first
52
- Misc.zip_fields(values).collect do |list|
53
- fields.each_with_index do |field,i|
54
- next if field == "literal"
55
- if field == "JSON"
56
- JSON.parse(list[i]).each do |key, value|
57
- info[key.to_sym] = value
58
- end
59
- else
60
- info[field.to_sym] = resolve_array(list[i])
61
- end
62
- end
73
+ Misc.zip_fields(values).collect do |v|
74
+ info = load_info(fields, v)
63
75
  end
64
76
  else
65
- fields.each_with_index do |field,i|
66
- next if field == "literal"
67
- if field == "JSON"
68
- JSON.parse(values[i]).each do |key, value|
69
- info[key.to_sym] = value
70
- end
71
- else
72
- info[field.to_sym] = resolve_array(values[i])
73
- end
74
- end
77
+ info = load_info(fields, values)
75
78
  end
76
79
 
77
- self.load(object, info)
80
+ self.load_entity(object, info)
78
81
 
79
82
  object
80
83
  end
81
-
84
+
82
85
  def self.load_tsv(tsv)
83
86
  tsv.with_unnamed do
84
87
  annotated_entities = tsv.collect do |id, values|
@@ -104,7 +107,7 @@ module Annotated
104
107
  fields = AnnotatedArray === annotations ? annotations.annotations : annotations.compact.first.annotations
105
108
  fields << :annotation_types
106
109
 
107
- when (fields == [:literal] and not annotations.empty?)
110
+ when (fields == [:literal] and not annotations.compact.empty?)
108
111
  fields << :literal
109
112
 
110
113
  when (fields == [:all] and Annotated === annotations)
@@ -112,9 +115,9 @@ module Annotated
112
115
  fields << :annotated_array if AnnotatedArray === annotations
113
116
  fields << :literal
114
117
 
115
- when (fields == [:all] and not annotations.empty?)
118
+ when (fields == [:all] and not annotations.compact.empty?)
116
119
  raise "Input array must be annotated or its elements must be" if not Annotated === annotations.compact.first and not Array === annotations.compact.first
117
- raise "Input array must be annotated or its elements must be. No duble arrays of singly annotated entities." if not Annotated === annotations.compact.first and Array === annotations.compact.first
120
+ raise "Input array must be annotated or its elements must be. No double arrays of singly annotated entities." if not Annotated === annotations.compact.first and Array === annotations.compact.first
118
121
  fields = [:annotation_types] + (Annotated === annotations ?
119
122
  annotations.annotations:
120
123
  annotations.compact.first.annotations)
data/lib/rbbt/entity.rb CHANGED
@@ -97,7 +97,6 @@ module Entity
97
97
  define_method ary_name, &block
98
98
 
99
99
  define_method name do |*args|
100
- #ary_name = "_ary_" << __method__.to_s
101
100
  case
102
101
  when Array === self
103
102
  self.send(ary_name, *args)
@@ -55,6 +55,7 @@ module Path
55
55
  end
56
56
 
57
57
  SEARCH_PATHS = {
58
+ :current => File.join(File.expand_path('.'), "{TOPLEVEL}", "{SUBPATH}"),
58
59
  :user => File.join(ENV['HOME'], ".{PKGDIR}", "{TOPLEVEL}", "{SUBPATH}"),
59
60
  :global => File.join('/', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
60
61
  :local => File.join('/usr/local', "{TOPLEVEL}", "{PKGDIR}", "{SUBPATH}"),
@@ -81,7 +82,7 @@ module Path
81
82
 
82
83
  path = nil
83
84
  if where.nil?
84
- %w(user local global lib).each do |w|
85
+ %w(current user local global lib).each do |w|
85
86
  w = w.to_sym
86
87
  next unless search_paths.include? w
87
88
  path = find(w, caller_lib, search_paths)
data/lib/rbbt/util/R.rb CHANGED
@@ -3,7 +3,7 @@ require 'rbbt/tsv'
3
3
 
4
4
  module R
5
5
 
6
- LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'../../../share/lib/R')
6
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'../../../share/Rlib')
7
7
  UTIL = File.join(LIB_DIR, 'util.R')
8
8
 
9
9
  def self.run(command, options = {})
@@ -37,12 +37,12 @@ source('#{UTIL}');
37
37
 
38
38
  def self.interactive(script, options = {})
39
39
  TmpFile.with_file do |init_file|
40
- Open.write(init_file) do |file|
41
- file.puts "# Loading basic rbbt environment"
42
- file.puts "library(utils);\n"
43
- file.puts "source('#{R::UTIL}');\n"
44
- file.puts
45
- file.puts script
40
+ Open.write(init_file) do |f|
41
+ f.puts "# Loading basic rbbt environment"
42
+ f.puts "library(utils);\n"
43
+ f.puts "source('#{R::UTIL}');\n"
44
+ f.puts
45
+ f.puts script
46
46
  end
47
47
  CMD.cmd("env R_PROFILE='#{init_file}' xterm \"$RHOME/bin/R\"")
48
48
  end
@@ -97,6 +97,7 @@ if (! is.null(data)){ rbbt.tsv.write('#{f}', data); }
97
97
 
98
98
  def R_interactive(pre_script = nil)
99
99
  TmpFile.with_file do |f|
100
+ Log.debug{"R Script:\n" << pre_script }
100
101
  TmpFile.with_file(pre_script) do |script_file|
101
102
  Open.write(f, self.to_s)
102
103
  script = "data_file = '#{f}';\n"
@@ -21,10 +21,11 @@ end
21
21
  module Misc
22
22
  class FieldNotFoundError < StandardError;end
23
23
 
24
+
24
25
  def self.correct_icgc_mutation(pos, ref, mut_str)
25
26
  mut = mut_str
26
27
  mut = '-' * (mut_str.length - 1) if mut =~/^-[ACGT]/
27
- mut = "+" << mut if ref == '-'
28
+ mut = "+" << mut if ref == '-'
28
29
  [pos, [mut]]
29
30
  end
30
31
 
@@ -1123,7 +1124,7 @@ end
1123
1124
  mod
1124
1125
  end
1125
1126
 
1126
- def self.string2hash(string)
1127
+ def self.string2hash_old(string)
1127
1128
 
1128
1129
  options = {}
1129
1130
  string.split(/#/).each do |str|
@@ -1133,37 +1134,112 @@ end
1133
1134
  option, value = str, true
1134
1135
  end
1135
1136
 
1136
- option = option.sub(":",'').to_sym if option.chars.first == ':'
1137
- value = value.sub(":",'').to_sym if String === value and value.chars.first == ':'
1137
+ option = option.sub(":",'').to_sym if option.chars.first == ':'
1138
+ value = value.sub(":",'').to_sym if String === value and value.chars.first == ':'
1138
1139
 
1139
- if value == true
1140
- options[option] = option.to_s.chars.first != '!'
1141
- else
1142
- options[option] = Thread.start do
1143
- $SAFE = 0;
1144
- case
1145
- when value =~ /^(?:true|T)$/i
1146
- true
1147
- when value =~ /^(?:false|F)$/i
1148
- false
1149
- when Symbol === value
1150
- value
1151
- when (String === value and value =~ /^\/(.*)\/$/)
1152
- Regexp.new /#{$1}/
1153
- else
1154
- begin
1155
- Kernel.const_get value
1156
- rescue
1157
- begin
1158
- raise if value =~ /[a-z]/ and defined? value
1159
- eval(value)
1160
- rescue Exception
1161
- value
1140
+ if value == true
1141
+ options[option] = option.to_s.chars.first != '!'
1142
+ else
1143
+ options[option] = Thread.start do
1144
+ $SAFE = 0;
1145
+ case
1146
+ when value =~ /^(?:true|T)$/i
1147
+ true
1148
+ when value =~ /^(?:false|F)$/i
1149
+ false
1150
+ when Symbol === value
1151
+ value
1152
+ when (String === value and value =~ /^\/(.*)\/$/)
1153
+ Regexp.new /#{$1}/
1154
+ else
1155
+ begin
1156
+ Kernel.const_get value
1157
+ rescue
1158
+ begin
1159
+ raise if value =~ /[a-z]/ and defined? value
1160
+ eval(value)
1161
+ rescue Exception
1162
+ value
1163
+ end
1162
1164
  end
1163
1165
  end
1164
- end
1165
- end.value
1166
+ end.value
1167
+ end
1166
1168
  end
1169
+
1170
+ options
1171
+ end
1172
+
1173
+ def self.string2hash(string)
1174
+ options = {}
1175
+
1176
+ string.split('#').each do |str|
1177
+ key, sep, value = str.partition "="
1178
+
1179
+ key = key[1..-1].to_sym if key[0] == ":"
1180
+
1181
+ options[key] = true and next if value.empty?
1182
+ options[key] = value[1..-1].to_sym and next if value[0] == ":"
1183
+ options[key] = Regexp.new(/#{value[1..-2]}/) and next if value[0] == "/" and value[-1] == "/"
1184
+ options[key] = value[1..-2] and next if value =~ /^['"].*['"]$/
1185
+ options[key] = value.to_i and next if value =~ /^\d+$/
1186
+ options[key] = value.to_f and next if value =~ /^\d*\.\d+$/
1187
+ options[key] = true and next if value == "true"
1188
+ options[key] = false and next if value == "false"
1189
+ options[key] = value and next
1190
+
1191
+ options[key] = begin
1192
+ saved_safe = $SAFE
1193
+ $SAFE = 0
1194
+ eval(value)
1195
+ rescue Exception
1196
+ value
1197
+ ensure
1198
+ $SAFE = saved_safe
1199
+ end
1200
+ end
1201
+
1202
+ return options
1203
+
1204
+ options = {}
1205
+ string.split(/#/).each do |str|
1206
+ if str.match(/(.*)=(.*)/)
1207
+ option, value = $1, $2
1208
+ else
1209
+ option, value = str, true
1210
+ end
1211
+
1212
+ option = option.sub(":",'').to_sym if option.chars.first == ':'
1213
+ value = value.sub(":",'').to_sym if String === value and value.chars.first == ':'
1214
+
1215
+ if value == true
1216
+ options[option] = option.to_s.chars.first != '!'
1217
+ else
1218
+ options[option] = Thread.start do
1219
+ $SAFE = 0;
1220
+ case
1221
+ when value =~ /^(?:true|T)$/i
1222
+ true
1223
+ when value =~ /^(?:false|F)$/i
1224
+ false
1225
+ when Symbol === value
1226
+ value
1227
+ when (String === value and value =~ /^\/(.*)\/$/)
1228
+ Regexp.new /#{$1}/
1229
+ else
1230
+ begin
1231
+ Kernel.const_get value
1232
+ rescue
1233
+ begin
1234
+ raise if value =~ /[a-z]/ and defined? value
1235
+ eval(value)
1236
+ rescue Exception
1237
+ value
1238
+ end
1239
+ end
1240
+ end
1241
+ end.value
1242
+ end
1167
1243
  end
1168
1244
 
1169
1245
  options
File without changes
@@ -17,5 +17,10 @@ Misc.in_dir(app_dir) do
17
17
  require 'rack'
18
18
  ENV["RBBT_FINDER"] = "true" if options.include?(:finder)
19
19
  ENV["RACK_ENV"] = options[:environment] if options.include?(:environment)
20
- Rack::Server.start(options.merge(:config => 'config.ru'))
20
+
21
+ if File.exists? 'config.ru'
22
+ Rack::Server.start(options.merge(:config => 'config.ru'))
23
+ else
24
+ Rack::Server.start(options.merge(:config => Rbbt.share['config.ru'].find))
25
+ end
21
26
  end
@@ -70,7 +70,7 @@ class TestAnnotations < Test::Unit::TestCase
70
70
  annotation_str = "Annotation String"
71
71
  info = {:annotation_str => annotation_str, :annotation_types => [AnnotatedString]}
72
72
 
73
- Annotated.load(str, info)
73
+ Annotated.load_entity(str, info)
74
74
  assert_equal annotation_str, str.annotation_str
75
75
  end
76
76
 
@@ -2,7 +2,7 @@ require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helpe
2
2
  require 'rbbt/util/R'
3
3
 
4
4
  class TestR < Test::Unit::TestCase
5
- def _test_sum
5
+ def test_sum
6
6
  assert_equal "6", R.run('cat(3+3)').read.split(/\n/).last
7
7
  end
8
8
 
@@ -81,9 +81,16 @@ class TestMisc < Test::Unit::TestCase
81
81
  assert_equal(true, Misc.string2hash("true")["true"])
82
82
  assert_equal(1, Misc.string2hash("a=1")["a"])
83
83
  assert_equal('b', Misc.string2hash("a=b")["a"])
84
- assert_equal('d', Misc.string2hash("a=b#c=d#:h=j")["c"])
85
- assert_equal('j', Misc.string2hash("a=b#c=d#:h=j")[:h])
84
+ assert_equal('d', Misc.string2hash("a=b#c=d#:h='j'")["c"])
85
+ assert_equal('j', Misc.string2hash("a=b#c=d#:h='j'")[:h])
86
86
  assert_equal(:j, Misc.string2hash("a=b#c=d#:h=:j")[:h])
87
+
88
+ Misc.benchmark(1000) do
89
+ Misc.string2hash_old("a=b#c=d#:h=:j#test='1'#:num=1#:sep=/#/")
90
+ end
91
+ Misc.benchmark(1000) do
92
+ Misc.string2hash("a=b#c=d#:h=:j#test='1'#:num=1#:sep=/#/")
93
+ end
87
94
  end
88
95
 
89
96
  def test_named_array
@@ -121,9 +128,6 @@ class TestMisc < Test::Unit::TestCase
121
128
  hash = {:a => true}
122
129
  assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
123
130
 
124
- hash = {:a => Misc}
125
- assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
126
-
127
131
  hash = {:a => :b}
128
132
  assert_equal hash, Misc.string2hash(Misc.hash2string(hash))
129
133
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.2
4
+ version: 5.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
11
+ date: 2013-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -84,6 +84,11 @@ extra_rdoc_files:
84
84
  - README.rdoc
85
85
  files:
86
86
  - LICENSE
87
+ - etc/app.d/base.rb
88
+ - etc/app.d/entities.rb
89
+ - etc/app.d/finder.rb
90
+ - etc/app.d/init.rb
91
+ - etc/app.d/resources.rb
87
92
  - lib/rbbt-util.rb
88
93
  - lib/rbbt.rb
89
94
  - lib/rbbt/annotations.rb
@@ -138,8 +143,8 @@ files:
138
143
  - lib/rbbt/workflow/step.rb
139
144
  - lib/rbbt/workflow/task.rb
140
145
  - lib/rbbt/workflow/usage.rb
146
+ - share/Rlib/util.R
141
147
  - share/install/software/lib/install_helpers
142
- - share/lib/R/util.R
143
148
  - share/rbbt_commands/app/start
144
149
  - share/rbbt_commands/conf/web_user/add
145
150
  - share/rbbt_commands/conf/web_user/list