tinkit 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/LICENSE +176 -0
  2. data/README +11 -0
  3. data/Rakefile +75 -0
  4. data/lib/glue_envs/couchrest/couchrest_attachment_handler.rb +260 -0
  5. data/lib/glue_envs/couchrest/couchrest_files_mgr.rb +198 -0
  6. data/lib/glue_envs/couchrest_glue_env.rb +536 -0
  7. data/lib/glue_envs/files_mgr_base.rb +51 -0
  8. data/lib/glue_envs/filesystem/filesystem_files_mgr.rb +187 -0
  9. data/lib/glue_envs/filesystem_glue_env.rb +395 -0
  10. data/lib/glue_envs/mysql/mysql_files_mgr.rb +175 -0
  11. data/lib/glue_envs/mysql_glue_env.rb +428 -0
  12. data/lib/glue_envs/sdb_s3/sdb_s3_files_mgr.rb +314 -0
  13. data/lib/glue_envs/sdb_s3_glue_env.rb +248 -0
  14. data/lib/helpers/camel.rb +21 -0
  15. data/lib/helpers/filesystem_helpers.rb +27 -0
  16. data/lib/helpers/hash_helpers.rb +74 -0
  17. data/lib/helpers/log_helper.rb +34 -0
  18. data/lib/helpers/mime_types_new.rb +126 -0
  19. data/lib/helpers/old_more_open_struct.rb +28 -0
  20. data/lib/helpers/require_helper.rb +45 -0
  21. data/lib/helpers/tk_escape.rb +17 -0
  22. data/lib/midas/bufs_data_structure.rb +84 -0
  23. data/lib/midas/node_element_operations.rb +264 -0
  24. data/lib/tinkit.rb +38 -0
  25. data/lib/tinkit_base_node.rb +733 -0
  26. data/lib/tinkit_node_factory.rb +47 -0
  27. data/spec/couchrest_files_mgr_spec.rb +551 -0
  28. data/spec/couchrest_glue_spec.rb +246 -0
  29. data/spec/filesystem_files_mgr_spec.rb +236 -0
  30. data/spec/filesystem_glue_spec.rb +243 -0
  31. data/spec/filesystem_helpers_spec.rb +42 -0
  32. data/spec/helpers/bufs_node_builder.rb +17 -0
  33. data/spec/helpers/bufs_sample_dataset.rb +160 -0
  34. data/spec/helpers/bufs_test_environments.rb +81 -0
  35. data/spec/helpers/tmp_view_cleaner.rb +15 -0
  36. data/spec/lib_helpers/tk_escape_spec.rb +45 -0
  37. data/spec/mysql_files_mgr_spec.rb +250 -0
  38. data/spec/mysql_glue_spec.rb +214 -0
  39. data/spec/node_element_operations_spec.rb +392 -0
  40. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec1.rb +82 -0
  41. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec2.rb +68 -0
  42. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec3.rb +80 -0
  43. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec4.rb +110 -0
  44. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec5.rb +84 -0
  45. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec6.rb +83 -0
  46. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec7.rb +101 -0
  47. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec8.rb +92 -0
  48. data/spec/sdb_s3_files_mgr_spec/sdb_s3_files_mgr_spec_all.rb +266 -0
  49. data/spec/sdb_s3_glue_spec.rb +230 -0
  50. data/spec/tinkit_node_factory_spec.rb +1108 -0
  51. metadata +114 -0
@@ -0,0 +1,243 @@
1
+ #require helper for cleaner require statements
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), '../lib/helpers/require_helper')
3
+
4
+ require Tinkit.glue 'filesystem_glue_env'
5
+
6
+ FilesystemGlueSpecDir = File.expand_path('../sandbox_for_specs/file_system_specs/glue_spec')
7
+
8
+ describe FilesystemEnv::GlueEnv, "Initialization" do
9
+ before(:each) do
10
+ #set up env
11
+ persist_env = { :host => nil,
12
+ :path => FilesystemGlueSpecDir,
13
+ :user_id => 'fs_glue_user'}
14
+
15
+ @persist_env = {:name => :filesystem_glue_test, :env => persist_env}
16
+
17
+ key_fields = { :required_keys => [:my_category],
18
+ :primary_key => :my_category }
19
+
20
+ @data_model_bindings = { :key_fields => key_fields,
21
+ :views => nil }
22
+
23
+ end
24
+
25
+ after(:each) do
26
+ fs_dir = File.dirname(@persist_env[:env][:path])
27
+ FileUtils.rm_rf(fs_dir) if fs_dir
28
+ end
29
+
30
+ it "should initialize properly" do
31
+ filesystem_glue_obj = FilesystemEnv::GlueEnv.new(@persist_env, @data_model_bindings)
32
+ #@data_dir = filesystem_glue_obj.user_datastore_location
33
+
34
+ #filesystem_glue_obj.dbh.connected?.should == true
35
+
36
+ filesystem_glue_obj.user_id.should == @persist_env[:env][:user_id]
37
+ filesystem_glue_obj.required_instance_keys.should == @data_model_bindings[:key_fields][:required_keys]
38
+ filesystem_glue_obj.required_save_keys.should == @data_model_bindings[:key_fields][:required_keys]
39
+ filesystem_glue_obj.node_key.should == @data_model_bindings[:key_fields][:primary_key]
40
+ filesystem_glue_obj.metadata_keys.should == [filesystem_glue_obj.persist_layer_key,
41
+ filesystem_glue_obj.version_key,
42
+ filesystem_glue_obj.namespace_key]
43
+ base_dir = ".model"
44
+ path = @persist_env[:env][:path]
45
+ user_id = @persist_env[:env][:user_id]
46
+ filesystem_glue_obj.user_datastore_location.should == File.join(path, user_id, base_dir)
47
+ filesystem_glue_obj._files_mgr_class.class.should_not == nil #The file manager class will handle file attachments
48
+ end
49
+
50
+ end
51
+
52
+ describe FilesystemEnv::GlueEnv, "Persistent Layer Basic Operations" do
53
+
54
+ before(:each) do
55
+ #set up env
56
+ persist_env = { :host => nil,
57
+ :path => FilesystemGlueSpecDir,
58
+ :user_id => 'fs_glue_user'}
59
+
60
+ #name isn't used in these specs, since that's used by the node factory to select the glue env
61
+ #but shown for clarity
62
+ @persist_env = {:name => :filesystem, :env => persist_env}
63
+
64
+ key_fields = { :required_keys => [:my_id],
65
+ :primary_key => :my_id }
66
+
67
+ @data_model_bindings = { :key_fields => key_fields,
68
+ :views => nil }
69
+
70
+ @filesystem_glue_obj = FilesystemEnv::GlueEnv.new(@persist_env, @data_model_bindings)
71
+ end
72
+
73
+ after(:all) do
74
+ fs_dir = File.dirname(@persist_env[:env][:path])
75
+ FileUtils.rm_rf(fs_dir) if fs_dir
76
+ end
77
+
78
+ it "should persist data and be able to retrieve it" do
79
+ @filesystem_glue_obj.should_not == nil
80
+ #:id was defined as the primary key
81
+ data1 = {:my_id => "test_id1", :data => "test data"}
82
+ empty_data = @filesystem_glue_obj.get(data1[:my_id]) #hasn't been saved yet
83
+ empty_data.should == []
84
+ @filesystem_glue_obj.save(data1)
85
+ #Don't use native get_attributes, use obj's get, it will block until save is finished
86
+ persisted_data = @filesystem_glue_obj.get(data1[:my_id])
87
+ persisted_data.should_not == nil
88
+ #p persisted_data
89
+ persisted_data[:my_id].should == data1[:my_id]
90
+ persisted_data[:data].should == data1[:data]
91
+ end
92
+
93
+ it "should be able to delete data" do
94
+ data1 = {:my_id => "test_id1", :data => "test data1"}
95
+ data2 = {:my_id => "test_id2", :data => "test data2"}
96
+ @filesystem_glue_obj.save(data1)
97
+ @filesystem_glue_obj.save(data2)
98
+ persisted_data1 = @filesystem_glue_obj.get(data1[:my_id])
99
+ persisted_data2 = @filesystem_glue_obj.get(data2[:my_id])
100
+ persisted_data1[:data].should == "test data1"
101
+ persisted_data2[:data].should == "test data2"
102
+ @filesystem_glue_obj.destroy_node({:my_id => data2[:my_id]})
103
+ persisted_data1 = @filesystem_glue_obj.get(data1[:my_id])
104
+ persisted_data2 = @filesystem_glue_obj.get(data2[:my_id])
105
+ persisted_data1[:data].should == "test data1"
106
+ persisted_data2.should == []
107
+ end
108
+ end
109
+
110
+ describe FilesystemEnv::GlueEnv, "Persistent Layer Collection Operations" do
111
+
112
+ before(:each) do
113
+ #set up env
114
+ persist_env = { :host => nil,
115
+ :path => FilesystemGlueSpecDir,
116
+ :user_id => 'fs_glue_user'}
117
+
118
+ #name isn't used in these specs, since that's used by the node factory to select the glue env
119
+ #but shown for clarity
120
+ @persist_env = {:name => :filesystem, :env => persist_env}
121
+
122
+ key_fields = { :required_keys => [:my_id],
123
+ :primary_key => :my_id }
124
+
125
+ @data_model_bindings = { :key_fields => key_fields,
126
+ :views => nil }
127
+
128
+ @filesystem_glue_obj = FilesystemEnv::GlueEnv.new(@persist_env, @data_model_bindings)
129
+ end
130
+
131
+ after(:each) do
132
+ fs_dir = File.dirname(@persist_env[:env][:path])
133
+ FileUtils.rm_rf(fs_dir) if fs_dir
134
+ end
135
+
136
+ it "should be able to query all" do
137
+ data1 = {:my_id => "test_id1", :data => "test data1"}
138
+ data2 = {:my_id => "test_id2", :data => "test data2"}
139
+ @filesystem_glue_obj.save(data1)
140
+ @filesystem_glue_obj.save(data2)
141
+
142
+ results = @filesystem_glue_obj.query_all
143
+ #results.should == 'blah'
144
+ results.each do |raw_data|
145
+ case raw_data[:my_id]
146
+ when "test_id1"
147
+ raw_data[:data].should == "test data1"
148
+ when "test_id2"
149
+ raw_data[:data].should == "test data2"
150
+ else
151
+ raise "Unknown dataset"
152
+ end#case
153
+ end#each
154
+ end
155
+
156
+ it "should be able to find matching data" do
157
+ data1 = {:my_id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
158
+ data2 = {:my_id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
159
+ data3 = {:my_id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
160
+ data_list = [data1, data2, data3]
161
+ data_list.each {|data| @filesystem_glue_obj.save(data)}
162
+
163
+ result1 = @filesystem_glue_obj.find_nodes_where(:my_id, :equals, "test_id1")
164
+ result1.size.should == 1
165
+ result1.first[:my_id].should == "test_id1"
166
+
167
+ result2 = @filesystem_glue_obj.find_nodes_where(:my_id, :equals, "oops")
168
+ result2.should be_empty
169
+
170
+ result3 = @filesystem_glue_obj.find_nodes_where(:data, :equals, "test data2")
171
+ result3.size.should == 2
172
+ ["test_id2", "test_id3"].should include result3.first[:my_id]
173
+ ["test_id2", "test_id3"].should include result3.last[:my_id]
174
+
175
+ result4 = @filesystem_glue_obj.find_nodes_where(:tags, :equals, ['c', 'd', 'e'])
176
+ result4.size.should == 1
177
+ result4.first[:my_id].should == "test_id2"
178
+ end
179
+
180
+ it "should be able to find containting data" do
181
+ data1 = {:my_id => "test_id1", :data => "test data1", :tags => ['a', 'b', 'c']}
182
+ data2 = {:my_id => "test_id2", :data => "test data2", :tags => ['c', 'd', 'e']}
183
+ data3 = {:my_id => "test_id3", :data => "test data2", :tags => ['c', 'b', 'z']}
184
+ data_list = [data1, data2, data3]
185
+ data_list.each {|data| @filesystem_glue_obj.save(data)}
186
+
187
+ result1 = @filesystem_glue_obj.find_nodes_where(:my_id, :contains, "test_id2")
188
+ result1.size.should == 1
189
+ result1.first[:my_id].should == "test_id2"
190
+
191
+ result2 = @filesystem_glue_obj.find_nodes_where(:tags, :contains, "c")
192
+ result2.size.should == 3
193
+
194
+ result3 = @filesystem_glue_obj.find_nodes_where(:tags, :contains, "b")
195
+ result3.size.should == 2
196
+ ["test_id1", "test_id3"].should include result3.first[:my_id]
197
+ ["test_id1", "test_id3"].should include result3.last[:my_id]
198
+
199
+ result4 = @filesystem_glue_obj.find_nodes_where(:tags, :contains, "oops")
200
+ result4.should be_empty
201
+ end
202
+
203
+ it "should be able to delete in bulk" do
204
+ data1 = {:my_id => "test_id1", :data => "delete me"}
205
+ data2 = {:my_id => "test_id2", :data => "keep me"}
206
+ data3 = {:my_id => "test_id3", :data => "delete me too"}
207
+ @filesystem_glue_obj.save(data1)
208
+ @filesystem_glue_obj.save(data2)
209
+ @filesystem_glue_obj.save(data3)
210
+
211
+ results = @filesystem_glue_obj.query_all
212
+ results.each do |raw_data|
213
+ case raw_data[:my_id]
214
+ when "test_id1"
215
+ raw_data[:data].should == "delete me"
216
+ when "test_id2"
217
+ raw_data[:data].should == "keep me"
218
+ when "test_id3"
219
+ raw_data[:data].should == "delete me too"
220
+ else
221
+ raise "Unknown dataset"
222
+ end#case
223
+ end#each
224
+
225
+ raw_rcds_to_delete = [data1, data3]
226
+ @filesystem_glue_obj.destroy_bulk(raw_rcds_to_delete)
227
+
228
+ results = @filesystem_glue_obj.query_all
229
+ #puts "Destroy Bulk results: #{results.inspect}"
230
+ results.each do |raw_data|
231
+ case raw_data[:my_id]
232
+ when "test_id1"
233
+ raise "Oops should have been deleted"
234
+ when "test_id2"
235
+ raw_data[:data].should == "keep me"
236
+ when "test_id3"
237
+ raise "Oops should have been deleted"
238
+ else
239
+ raise "Unknown dataset"
240
+ end#case
241
+ end#each
242
+ end#it
243
+ end
@@ -0,0 +1,42 @@
1
+ #require helper for cleaner require statements
2
+ require File.join(File.dirname(__FILE__), '../lib/helpers/require_helper')
3
+
4
+ require Tinkit.helpers 'filesystem_helpers'
5
+
6
+ require 'fileutils'
7
+
8
+ describe DirFilter do
9
+ before(:each) do
10
+ root_test_dir = '/tmp'
11
+ working_dir = 'dir_filter_tests'
12
+ @basenames_to_make = ['keep1',
13
+ 'keep2',
14
+ '.dot_file',
15
+ 'ignore_this_file',
16
+ 'ignore_this_file_too',
17
+ 'another_file_to_ignore',
18
+ 'skip_this_one_too',
19
+ 'but_dont_skip_this_one']
20
+
21
+ @working_path = File.join(root_test_dir, working_dir)
22
+ @files_to_make = @basenames_to_make.map{|b| File.join(@working_path, b)}
23
+ #create directory for tests
24
+ FileUtils.mkdir_p(@working_path)
25
+ FileUtils.touch(@files_to_make)
26
+ end
27
+
28
+ after(:each) do
29
+ FileUtils.rm_rf(@working_path)
30
+ end
31
+
32
+ it "should have made files to test with" do
33
+ expected_entries = @basenames_to_make + [".", ".."]
34
+ Dir.entries(@working_path).sort.should == expected_entries.sort
35
+ end
36
+
37
+ it "should filter appropriate entries" do
38
+ filter = DirFilter.new([/ignore/, /^skip/])
39
+ filter.filter_entries(@working_path).sort.should == ['but_dont_skip_this_one', 'keep1', 'keep2']
40
+ end
41
+
42
+ end
@@ -0,0 +1,17 @@
1
+ module TinkitNodeBuilder
2
+ DefaultDocParams = {:my_category => 'default',
3
+ :parent_categories => ['default_parent'],
4
+ :description => 'default description'}
5
+
6
+ def get_default_params
7
+ DefaultDocParams.dup #to avoid a couchrest weirdness don't use the params directly
8
+ end
9
+
10
+ def make_doc_no_attachment(override_defaults={})
11
+ #default_params = {:my_category => 'default',
12
+ # :parent_categories => ['default_parent'],
13
+ # :description => 'default description'}
14
+ init_params = get_default_params.merge(override_defaults)
15
+ return TinkitBaseNode.new(init_params)
16
+ end
17
+ end
@@ -0,0 +1,160 @@
1
+ SampleDataSpec = File.dirname(__FILE__)
2
+ require File.join(SampleDataSpec, 'bufs_test_environments')
3
+
4
+ node_db_name = "http://127.0.0.1:5984/sample_data/"
5
+ SampleCouchDB = CouchRest.database!(node_db_name)
6
+ SampleCouchDB.compact!
7
+
8
+ FileSystem = "/home/bufs/bufs/sandbox_for_specs/sample_data"
9
+
10
+
11
+ module MakeUserClasses
12
+ @user1_id = "SampleCouchUser001"
13
+ @user2_id = "SampleCouchUser002"
14
+ @user3_id = "SampleFileSysUser003"
15
+ @user4_id = "SampleFileSysUser004"
16
+ node_class_id1 = "TinkitInfoNode#{@user1_id}"
17
+ node_class_id2 = "TinkitInfoNode#{@user2_id}"
18
+ node_class_id3 = "TinkitFile#{@user3_id}"
19
+ node_class_id4 = "TinkitFile#{@user4_id}"
20
+ couchpath = SampleCouchDB.uri
21
+ couchhost = SampleCouchDB.host
22
+ node_env1 = NodeHelper.env_builder("couchrest", node_class_id1, @user1_id, couchpath, couchhost)
23
+ node_env2 = NodeHelper.env_builder("couchrest", node_class_id2, @user2_id, couchpath, couchhost)
24
+ node_env3 = NodeHelper.env_builder("filesystem", node_class_id3, @user3_id, FileSystem)
25
+ node_env4 = NodeHelper.env_builder("filesystem", node_class_id4, @user4_id, FileSystem)
26
+ User1Class = TinkitNodeFactory.make(node_env1)
27
+ User2Class = TinkitNodeFactory.make(node_env2)
28
+ User3Class = TinkitNodeFactory.make(node_env3)
29
+ User4Class = TinkitNodeFactory.make(node_env4)
30
+ end
31
+
32
+
33
+ #file list
34
+ #---------------------------------
35
+ #- Test Filenames and References -
36
+ #---------------------------------
37
+ #binary_data_pptx -> test_files/spec_test1.pptx
38
+ #binary_data_spaces_in_fname_pptx -> test_files/spec test2 v1.3.pptx
39
+ #binary_data2_docx -> test_files/spec test2.docx
40
+ #binary_data3_pptx -> test_files/spec_test3.pptx
41
+ #fresh_file -> test_files/test_modified_time_fresh.txt
42
+ #simple_text_file -> test_files/simple_text_file1.txt
43
+ #simple_text_file2 -> test_files/simple text file 2.txt
44
+ #simple_text_file3 -> test_files/simple text file 3.txt
45
+ #simple_text_file4 -> test_files/simple text file 4.txt
46
+ #stale_file -> test_files/test_modified_time_stale.txt
47
+ #strange_characters_in_file_name -> test_files/Test%_+- .,^^,. -+_%.txt
48
+
49
+ module SampleDataSets
50
+ module Sample1
51
+ data_set = {}
52
+ keys = [:a, :aa, :ab, :ac, :aaa, :b, :ba, :bb, :bc, :bbb, :bcc, :c, :cc]
53
+ keys.each {|key| data_set[key] ={} } #set all to hash
54
+
55
+ data_set[:a][:my_category] = 'a'
56
+ data_set[:a][:parent_categories] = ['aa']
57
+
58
+ data_set[:aa][:my_category] = 'aa'
59
+ data_set[:aa][:parent_categories] = ['a']
60
+ data_set[:aa][:files] = ['simple_text_file', 'binary_data_pptx']
61
+
62
+ data_set[:ab][:my_category] = 'ab'
63
+ data_set[:ab][:parent_categories] = ['a', 'aaa', 'bb', 'just_a_label2']
64
+
65
+ data_set[:ac][:my_category] = 'ac'
66
+ data_set[:ac][:parent_categories] = ['a']
67
+ data_set[:ac][:files] = ['binary_data_spaces_in_fname_pptx']
68
+ data_set[:ac][:links] = [['google', 'http://www.google.com']]
69
+
70
+ data_set[:aaa][:my_category] = 'aaa'
71
+ data_set[:aaa][:parent_categories] = ['aa', 'just_a_label']
72
+
73
+ data_set[:b][:my_category] = 'b'
74
+ data_set[:b][:parent_categories] = ['just_a_label']
75
+ data_set[:b][:files] = ['simple_text_file2', 'simple_text_file3']
76
+ data_set[:b][:links] = [['yahoo', 'http://www.yahoo.com'], ['google', 'http://www.google.com']]
77
+
78
+ data_set[:ba][:my_category] = 'ba'
79
+ data_set[:ba][:parent_categories] = ['b', 'ab']
80
+ data_set[:ba][:files] = ['simple_text_file']
81
+ data_set[:ba][:links] = [['yahoo2', 'http://www.yahoo.com'], ['google', 'http://www.google.com']]
82
+
83
+ data_set[:bb][:my_category] = 'bb'
84
+ data_set[:bb][:parent_categories] = ['b']
85
+ data_set[:bb][:files] = ['strange_characters_in_file_name']
86
+
87
+ data_set[:bc][:my_category] = 'bc'
88
+ data_set[:bc][:parent_categories] = ['b', 'bbb', 'just_a_label2']
89
+
90
+ data_set[:bbb][:my_category] = 'bbb'
91
+ data_set[:bbb][:parent_categories] = ['bb', 'aaa']
92
+
93
+ data_set[:bcc][:my_category] = 'bcc'
94
+ data_set[:bcc][:parent_categories] = ['bc']
95
+ data_set[:bcc][:links] = [[['MeFi'], 'http:\\www.metafilter.com']]
96
+
97
+ data_set[:c][:my_category] = 'c'
98
+ data_set[:c][:parent_categories] = []
99
+ data_set[:cc][:my_category] = 'cc'
100
+ data_set[:cc][:parent_categories] = ['c']
101
+ data_set[:cc][:files] = ['simple_text_file']
102
+ data_set[:cc][:links] = [['google2', 'http:\\www.google.com']]
103
+
104
+ DataSet = data_set
105
+ end
106
+ end
107
+
108
+ module PopulatePersistenceModels
109
+ include MakeUserClasses
110
+ include SampleDataSets
111
+ include NodeHelpers
112
+
113
+ @user_classes = [User1Class, User2Class, User3Class, User4Class]
114
+ @test_files = TinkitFixtures.test_files
115
+
116
+ #stupid hack so I don't have to go change existing stuff
117
+ class Dummy
118
+ include NodeHelpers
119
+ end
120
+
121
+ def self.convert_links_to_hash(links)
122
+ link_hash = {}
123
+ return unless links
124
+ links.each do |link_pair|
125
+ link_hash[link_pair[1]] = link_pair[0]
126
+ end
127
+ link_hash
128
+ end
129
+
130
+ def self.add_data_set_to_model(data_set = Sample1::DataSet)
131
+ data_set.each do |node, node_data|
132
+ params = { :my_category => node_data[:my_category],
133
+ :parent_categories => node_data[:parent_categories],
134
+ :links => self.convert_links_to_hash(node_data[:links]),
135
+ :description => "test"}
136
+ raise "Params Issue with :my_category #{params.inspect}" unless node_data[:my_category]
137
+ raise "Params Issue with :parent_categories #{params.inspect}" unless node_data[:parent_categories]
138
+ @user_classes.each do |user_class|
139
+ node = Dummy.new.make_doc_no_attachment(user_class, params)
140
+ node.description = "from: #{node.my_GlueEnv.user_id}"
141
+
142
+ #add files to node
143
+ if node_data[:files]
144
+ file_references = node_data[:files]
145
+ file_data = file_references.map{|ref| {:src_filename => @test_files[ref]}}
146
+ node.files_add(file_data)
147
+ end
148
+
149
+ #Another Hack to be able to find the user as root in a tree
150
+ user_id = user_class.myGlueEnv.user_id
151
+ if node.my_category == 'a'|| node.my_category == 'b'|| node.my_category == 'c'
152
+ node.parent_categories_add(user_id)
153
+ end
154
+ node.__save
155
+ end
156
+ end
157
+ @user_classes
158
+ end
159
+
160
+ end