ydim 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,347 @@
1
+ #!/usr/bin/env ruby
2
+ # TestRootSession -- ydim -- 10.01.2006 -- hwyss@ywesee.com
3
+
4
+
5
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
6
+
7
+ require 'test/unit'
8
+ require 'test/stub/odba'
9
+ require 'ydim/root_session'
10
+ require 'flexmock'
11
+
12
+ module YDIM
13
+ class TestRootSession < Test::Unit::TestCase
14
+ include FlexMock::TestCase
15
+ def setup
16
+ @user = FlexMock.new
17
+ @session = RootSession.new(@user)
18
+ @serv = FlexMock.new
19
+ @session.serv = @serv
20
+ end
21
+ def assert_logged(*levels, &block)
22
+ @mock_logger = flexmock("logger")
23
+ levels.uniq.each { |level|
24
+ @mock_logger.should_receive(level).times(levels.select { |l|
25
+ l == level}.size).and_return { |usr, blc|
26
+ assert_equal('user', usr)
27
+ blc.call
28
+ }
29
+ }
30
+ @user.should_receive(:unique_id).and_return { 'user' }
31
+ @serv.should_receive(:logger).and_return { @mock_logger }
32
+ block.call
33
+ end
34
+ def test_add_items
35
+ config = FlexMock.new('config')
36
+ config.should_receive(:vat_rate).and_return { 7.6 }
37
+ invoice = FlexMock.new('invoice')
38
+ invoice.should_receive(:suppress_vat).and_return { false }
39
+ @serv.should_receive(:config).and_return { config }
40
+ flexstub(Invoice).should_receive(:find_by_unique_id)\
41
+ .with('123').and_return(invoice)
42
+ items = [
43
+ { :quantity => 1, :unit => 'St�ck', :text => 'Item 1', :price => 10.00,
44
+ :vat_rate => 7.6, :data => {}, :time => Time.now, :expiry_time => nil},
45
+ { :quantity => 2, :unit => 'St�ck', :text => 'Item 2', :price => 20.00,
46
+ :vat_rate => 7.6, :data => {}, :time => Time.now, :expiry_time => nil},
47
+ { :quantity => 3, :unit => 'St�ck', :text => 'Item 3', :price => 30.00,
48
+ :vat_rate => 7.6, :data => {}, :time => Time.now, :expiry_time => nil},
49
+ { :quantity => 4, :unit => 'St�ck', :text => 'Item 4', :price => 40.00,
50
+ :vat_rate => 7.6, :data => {}, :time => Time.now, :expiry_time => nil},
51
+ ]
52
+ added_items = []
53
+ invoice.should_receive(:add_item).and_return { |item|
54
+ assert_instance_of(Item, item)
55
+ added_items.push(item)
56
+ }
57
+ invoice.should_receive(:items).and_return { added_items }
58
+ invoice.should_receive(:odba_store, 1).and_return {}
59
+ retval = nil
60
+ assert_logged(:debug, :debug) {
61
+ retval = @session.add_items(123, items)
62
+ }
63
+ assert_equal(added_items, retval)
64
+ end
65
+ def test_autoinvoice
66
+ inv = flexmock('autoinvoice')
67
+ flexstub(AutoInvoice).should_receive(:find_by_unique_id)\
68
+ .with("123").times(1).and_return(inv)
69
+ retval = nil
70
+ assert_logged(:debug) {
71
+ retval = @session.autoinvoice(123)
72
+ }
73
+ assert_equal(inv, retval)
74
+ end
75
+ def test_autoinvoice__invalid_id
76
+ inv = flexmock('autoinvoice')
77
+ flexstub(AutoInvoice).should_receive(:find_by_unique_id)\
78
+ .times(1)
79
+ retval = nil
80
+ assert_logged(:debug, :error) {
81
+ assert_raises(IndexError) {
82
+ @session.autoinvoice(123)
83
+ }
84
+ }
85
+ end
86
+ def test_collect_garbage
87
+ inv1 = flexmock('Invoice1')
88
+ inv1.should_receive(:deleted).and_return(true)
89
+ inv1.should_receive(:info).and_return('info1')
90
+ inv1.should_receive(:odba_delete).times(1)\
91
+ .and_return { assert(true) }
92
+ inv1.should_receive(:debitor_id).and_return(2)
93
+ inv2 = flexmock('Invoice2')
94
+ inv2.should_receive(:deleted).and_return(false)
95
+ inv2.should_receive(:debitor_id).and_return(3)
96
+ flexstub(Invoice).should_receive(:odba_extent)\
97
+ .and_return { |blk| [inv1, inv2].each(&blk) }
98
+ res = nil
99
+ assert_logged(:info) {
100
+ res = @session.collect_garbage
101
+ }
102
+ assert_equal(['info1'], res)
103
+ end
104
+ def test_collect_garbage__debitor
105
+ inv1 = flexmock('Invoice1')
106
+ inv1.should_receive(:deleted).and_return(true)
107
+ inv1.should_receive(:info).and_return('info1')
108
+ inv1.should_receive(:odba_delete).times(1)\
109
+ .and_return { assert(true) }
110
+ inv1.should_receive(:debitor_id).and_return(2)
111
+ inv2 = flexmock('Invoice2')
112
+ inv2.should_receive(:deleted).and_return(true)
113
+ inv2.should_receive(:debitor_id).and_return(3)
114
+ flexstub(Invoice).should_receive(:odba_extent)\
115
+ .and_return { |blk| [inv1, inv2].each(&blk) }
116
+ res = nil
117
+ assert_logged(:info) {
118
+ res = @session.collect_garbage(2)
119
+ }
120
+ assert_equal(['info1'], res)
121
+ end
122
+ def test_create_autoinvoice
123
+ factory = FlexMock.new
124
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("1")
125
+ @serv.should_receive(:factory).and_return { factory }
126
+ assert_logged(:debug, :debug, :debug, :debug, :error) {
127
+ assert_raises(IndexError) { @session.create_autoinvoice(1) }
128
+ }
129
+ debitor = flexmock('Debitor')
130
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("2")\
131
+ .and_return(debitor)
132
+ factory.should_receive(:create_autoinvoice).and_return { |deb|
133
+ assert_equal(debitor, deb)
134
+ 'invoice created by Factory'
135
+ }
136
+ invoice = nil
137
+ assert_nothing_raised { invoice = @session.create_autoinvoice(2) }
138
+ assert_equal('invoice created by Factory', invoice)
139
+ end
140
+ def test_create_debitor
141
+ id_server = FlexMock.new
142
+ @serv.should_receive(:id_server).and_return { id_server }
143
+ id_server.should_receive(:next_id).and_return { |key|
144
+ assert_equal(:debitor, key)
145
+ 23
146
+ }
147
+ debitor = nil
148
+ deb = flexmock('Debitor')
149
+ flexstub(Debitor).should_receive(:new).and_return(deb)
150
+ deb.should_receive(:odba_store).times(1).and_return {
151
+ assert(true)
152
+ deb
153
+ }
154
+ assert_logged(:info) {
155
+ debitor = @session.create_debitor
156
+ }
157
+ assert_equal(deb, debitor)
158
+ end
159
+ def test_create_invoice
160
+ factory = FlexMock.new
161
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("1")
162
+ @serv.should_receive(:factory).and_return { factory }
163
+ assert_logged(:debug, :debug, :debug, :debug, :error) {
164
+ assert_raises(IndexError) { @session.create_invoice(1) }
165
+ }
166
+ debitor = flexmock('Debitor')
167
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("2")\
168
+ .and_return(debitor)
169
+ factory.should_receive(:create_invoice).and_return { |deb|
170
+ assert_equal(debitor, deb)
171
+ 'invoice created by Factory'
172
+ }
173
+ invoice = nil
174
+ assert_nothing_raised { invoice = @session.create_invoice(2) }
175
+ assert_equal('invoice created by Factory', invoice)
176
+ end
177
+ def test_currency_converter
178
+ conv = flexmock('converter')
179
+ conv.should_receive(:drb_dup).and_return {
180
+ assert(true)
181
+ 'duplicate'
182
+ }
183
+ @serv.should_receive(:currency_converter).and_return(conv)
184
+ res = nil
185
+ assert_logged(:debug) { res = @session.currency_converter }
186
+ assert_equal('duplicate', res)
187
+ end
188
+ def test_debitor
189
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("1")
190
+ assert_logged(:debug, :error) {
191
+ assert_raises(IndexError) { @session.debitor(1) }
192
+ }
193
+ debitor = flexmock('Debitor')
194
+ flexstub(Debitor).should_receive(:find_by_unique_id).with("2")\
195
+ .and_return(debitor)
196
+ assert_logged(:debug) {
197
+ assert_equal(debitor, @session.debitor(2))
198
+ }
199
+ end
200
+ def test_debitors
201
+ flexstub(Debitor).should_receive(:odba_extent).and_return(['deb1'])
202
+ res = nil
203
+ assert_logged(:debug) { res = @session.debitors }
204
+ assert_equal(['deb1'], res)
205
+ end
206
+ def test_delete_autoinvoice
207
+ inv = flexmock('autoinvoice')
208
+ inv.should_receive(:odba_delete).times(1)
209
+ flexstub(AutoInvoice).should_receive(:find_by_unique_id)\
210
+ .with("17").times(1).and_return(inv)
211
+ assert_logged(:debug, :debug) {
212
+ @session.delete_autoinvoice(17)
213
+ }
214
+ end
215
+ def test_delete_item
216
+ invoice = FlexMock.new
217
+ item1 = FlexMock.new
218
+ item1.should_receive(:index).and_return { 0 }
219
+ item2 = FlexMock.new
220
+ item2.should_receive(:index).and_return { 1 }
221
+ item3 = FlexMock.new
222
+ item3.should_receive(:index).and_return { 2 }
223
+ items = [item1, item2, item3]
224
+ flexstub(Invoice).should_receive(:find_by_unique_id)\
225
+ .with('3').and_return(invoice)
226
+ invoice.should_receive(:items).and_return { items }
227
+ invoice.should_receive(:odba_store, 1).and_return {}
228
+ retval = nil
229
+ assert_logged(:debug, :debug) {
230
+ retval = @session.delete_item(3, 1)
231
+ }
232
+ assert_equal([item1,item3], retval)
233
+ end
234
+ def test_generate_invoice
235
+ factory = flexmock('factory')
236
+ @serv.should_receive(:factory).and_return(factory)
237
+ generated = flexmock('invoice')
238
+ inv = flexmock('autoinvoice')
239
+ factory.should_receive(:generate_invoice)\
240
+ .with(inv).times(1).and_return {
241
+ assert(true)
242
+ generated
243
+ }
244
+ flexstub(AutoInvoice).should_receive(:find_by_unique_id)\
245
+ .with("17").times(1).and_return(inv)
246
+ res = nil
247
+ assert_logged(:info, :debug) {
248
+ res = @session.generate_invoice(17)
249
+ }
250
+ assert_equal(generated, res)
251
+ end
252
+ def test_invoice__error
253
+ inv = flexmock('invoice')
254
+ flexstub(Invoice).should_receive(:find_by_unique_id)\
255
+ .and_return(inv)
256
+ res = nil
257
+ assert_logged(:debug) {
258
+ res = @session.invoice(17)
259
+ }
260
+ assert_equal(inv, res)
261
+ end
262
+ def test_invoice__error
263
+ flexstub(Invoice).should_receive(:find_by_unique_id)
264
+ assert_logged(:debug, :error) {
265
+ assert_raises(IndexError) {
266
+ @session.invoice(17)
267
+ }
268
+ }
269
+ end
270
+ def test_invoice_infos
271
+ inv1 = flexmock('invoice1')
272
+ inv1.should_receive(:status).and_return('selectable')
273
+ inv1.should_receive(:info).and_return('info1')
274
+ inv2 = flexmock('invoice2')
275
+ inv2.should_receive(:status).and_return('not selectable')
276
+ flexstub(Invoice).should_receive(:search_by_status)\
277
+ .with('selectable').and_return([inv1])
278
+ res = nil
279
+ assert_logged(:debug) {
280
+ res = @session.invoice_infos('selectable')
281
+ }
282
+ assert_equal(['info1'], res)
283
+ end
284
+ def test_search_debitors
285
+ debitors = flexstub(Debitor)
286
+ debitor = FlexMock.new
287
+ debitors.should_receive(:search_by_exact_email).and_return { |email|
288
+ res = []
289
+ res.push(debitor) if(email == 'test@ywesee.com')
290
+ res
291
+ }
292
+ debitors.should_receive(:search_by_exact_name).and_return { |name|
293
+ res = []
294
+ res.push(debitor) if(name == 'ywesee GmbH')
295
+ res
296
+ }
297
+ assert_logged(:debug) {
298
+ assert_equal([], @session.search_debitors('Unknown Name'))
299
+ }
300
+ assert_logged(:debug) {
301
+ assert_equal([], @session.search_debitors('unknown@ywesee.com'))
302
+ }
303
+ assert_logged(:debug) {
304
+ assert_equal([debitor], @session.search_debitors('ywesee GmbH'))
305
+ }
306
+ assert_logged(:debug) {
307
+ assert_equal([debitor], @session.search_debitors('test@ywesee.com'))
308
+ }
309
+ end
310
+ def test_send_invoice
311
+ inv = flexmock('invoice')
312
+ flexstub(Invoice).should_receive(:find_by_unique_id)\
313
+ .with('17').and_return(inv)
314
+ @serv.should_receive(:config).and_return('cnf')
315
+ flexstub(Mail).should_receive(:send_invoice).with('cnf', inv)
316
+ assert_logged(:info, :debug) {
317
+ @session.send_invoice(17)
318
+ }
319
+ end
320
+ def test_update_item__invoice
321
+ item = flexmock('item')
322
+ inv = flexmock('invoice')
323
+ inv.should_receive(:item).with(4).and_return(item)
324
+ inv.should_receive(:odba_store).times(1)\
325
+ .and_return { assert(true) }
326
+ flexstub(Invoice).should_receive(:find_by_unique_id)\
327
+ .with('12').and_return(inv)
328
+ item.should_receive(:update).with({:foo => 'bar'})
329
+ assert_logged(:debug, :debug) {
330
+ @session.update_item(12, 4, {:foo => 'bar'})
331
+ }
332
+ end
333
+ def test_update_item__autoinvoice
334
+ item = flexmock('item')
335
+ inv = flexmock('invoice')
336
+ inv.should_receive(:item).with(4).and_return(item)
337
+ inv.should_receive(:odba_store).times(1)\
338
+ .and_return { assert(true) }
339
+ flexstub(AutoInvoice).should_receive(:find_by_unique_id)\
340
+ .with('12').and_return(inv)
341
+ item.should_receive(:update).with({:foo => 'bar'})
342
+ assert_logged(:debug, :debug) {
343
+ @session.update_item(12, 4, {:foo => 'bar'}, :autoinvoice)
344
+ }
345
+ end
346
+ end
347
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # TestRootUser -- ydim -- 10.01.2006 -- hwyss@ywesee.com
3
+
4
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
5
+
6
+ require 'test/unit'
7
+ require 'ydim/root_user'
8
+
9
+ module YDIM
10
+ class TestRootUser < Test::Unit::TestCase
11
+ def setup
12
+ @user = RootUser.new(:root)
13
+ end
14
+ def test_session
15
+ session = @user.new_session
16
+ assert_instance_of(RootSession, session)
17
+ assert_equal('root', session.whoami)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env ruby
2
+ # TestServer -- ydim -- 10.01.2006 -- hwyss@ywesee.com
3
+
4
+
5
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
6
+
7
+ require 'test/unit'
8
+ require 'test/stub/odba'
9
+ require 'flexmock'
10
+ require 'ydim/server'
11
+
12
+ module YDIM
13
+ class TestServer < Test::Unit::TestCase
14
+ def setup
15
+ @config = FlexMock.new
16
+ @config.should_receive(:autoinvoice_hour).and_return { nil }
17
+ @config.should_receive(:currency_update_hour).and_return { nil }
18
+ @logger = FlexMock.new('logger')
19
+ @logger.should_ignore_missing
20
+ @server = Server.new(@config, @logger)
21
+ @needle = @server.instance_variable_get('@serv')
22
+ @datadir = File.expand_path('tmp', File.dirname(__FILE__))
23
+ end
24
+ def test_config
25
+ assert_equal(@config, @needle.config)
26
+ end
27
+ def test_root_user__file_relative
28
+ FileUtils.mkdir_p(@datadir)
29
+ @config.should_receive(:root_name).and_return { 'Root' }
30
+ @config.should_receive(:root_email).and_return { 'test@ywesee.com' }
31
+ @config.should_receive(:root_key).and_return { "root_dsa.pub" }
32
+ @config.should_receive(:conf_dir).and_return { @datadir }
33
+ filepath = File.join(@datadir, "root_dsa.pub")
34
+ key = OpenSSL::PKey::DSA.new(8)
35
+ File.open(filepath, 'w') { |fh|
36
+ fh.puts(key.public_key.to_s)
37
+ }
38
+ auth_server = nil
39
+ assert_nothing_raised {
40
+ auth_server = @needle.auth_server
41
+ }
42
+ assert_instance_of(RRBA::Server, auth_server)
43
+ root = auth_server.instance_variable_get('@root')
44
+ assert_equal('Root', root.name)
45
+ assert_equal('test@ywesee.com', root.email)
46
+ assert(root.public_key.sysverify('test', key.syssign('test')))
47
+ ensure
48
+ FileUtils.rm_r(@datadir) if File.exist?(@datadir)
49
+ end
50
+ def test_root_user__file_absolute
51
+ FileUtils.mkdir_p(@datadir)
52
+ @config.should_receive(:root_name).and_return { 'Root' }
53
+ @config.should_receive(:root_email).and_return { 'test@ywesee.com' }
54
+ @config.should_receive(:root_key).and_return {
55
+ File.join(@datadir, "absolute_dsa.pub")
56
+ }
57
+ @config.should_receive(:conf_dir).and_return { @datadir }
58
+ filepath = File.join(@datadir, "absolute_dsa.pub")
59
+ key = OpenSSL::PKey::DSA.new(8)
60
+ File.open(filepath, 'w') { |fh|
61
+ fh.puts(key.public_key.to_s)
62
+ }
63
+ auth_server = nil
64
+ assert_nothing_raised {
65
+ auth_server = @needle.auth_server
66
+ }
67
+ assert_instance_of(RRBA::Server, auth_server)
68
+ root = auth_server.instance_variable_get('@root')
69
+ assert_equal('Root', root.name)
70
+ assert_equal('test@ywesee.com', root.email)
71
+ assert(root.public_key.sysverify('test', key.syssign('test')))
72
+ ensure
73
+ FileUtils.rm_r(@datadir) if File.exist?(@datadir)
74
+ end
75
+ def test_root_user__dump
76
+ key = OpenSSL::PKey::DSA.new(8)
77
+ @config.should_receive(:root_name).and_return { 'Root' }
78
+ @config.should_receive(:root_email).and_return { 'test@ywesee.com' }
79
+ @config.should_receive(:root_key).and_return {
80
+ key.public_key.to_s
81
+ }
82
+ @config.should_receive(:conf_dir).and_return { @datadir }
83
+ auth_server = nil
84
+ assert_nothing_raised {
85
+ auth_server = @needle.auth_server
86
+ }
87
+ assert_instance_of(RRBA::Server, auth_server)
88
+ root = auth_server.instance_variable_get('@root')
89
+ assert_equal('Root', root.name)
90
+ assert_equal('test@ywesee.com', root.email)
91
+ assert(root.public_key.sysverify('test', key.syssign('test')))
92
+ end
93
+ def test_login_ok
94
+ debug_messages = ''
95
+ info_messages = ''
96
+ error_messages = ''
97
+ @logger.should_receive(:debug).and_return { |msg, block|
98
+ debug_messages << msg << "\n" }
99
+ @logger.should_receive(:info).and_return { |msg, block|
100
+ info_messages << msg << "\n" }
101
+ @logger.should_receive(:error).and_return { |msg, block|
102
+ error_messages << msg << "\n" }
103
+ @logger.should_receive(:error).and_return { |msg, block| flunk(msg) }
104
+ key = OpenSSL::PKey::DSA.new(8)
105
+ @config.should_receive(:root_name).and_return { 'Root' }
106
+ @config.should_receive(:root_email).and_return { 'test@ywesee.com' }
107
+ @config.should_receive(:root_key).and_return {
108
+ key.public_key.to_s
109
+ }
110
+ @config.should_receive(:conf_dir).and_return { @datadir }
111
+ client = FlexMock.new
112
+ client.should_receive(:__drburi).and_return { 'druby://localhost:0' }
113
+ session = @server.login(client, :root) { |challenge|
114
+ key.syssign(challenge)
115
+ }
116
+ assert_instance_of(RootSession, session)
117
+ end
118
+ def test_login_fail
119
+ debug_messages = ''
120
+ info_messages = ''
121
+ error_messages = ''
122
+ @logger.should_receive(:debug).and_return { |msg, block|
123
+ debug_messages << msg << "\n" }
124
+ @logger.should_receive(:info).and_return { |msg, block|
125
+ info_messages << msg << "\n" }
126
+ @logger.should_receive(:error).and_return { |msg, block|
127
+ error_messages << msg << "\n" }
128
+ key = OpenSSL::PKey::DSA.new(8)
129
+ @config.should_receive(:root_name).and_return { 'Root' }
130
+ @config.should_receive(:root_email).and_return { 'test@ywesee.com' }
131
+ @config.should_receive(:root_key).and_return {
132
+ key.public_key.to_s
133
+ }
134
+ @config.should_receive(:conf_dir).and_return { @datadir }
135
+ client = FlexMock.new
136
+ client.should_receive(:__drburi).and_return { 'druby://localhost:0' }
137
+ assert_raises(OpenSSL::PKey::DSAError) {
138
+ @server.login(client, :root) { |challenge| challenge }
139
+ }
140
+ end
141
+ end
142
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ydim
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - Masaomi Hatakeyama, Zeno R.R. Davatz
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-20 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: hoe
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 47
30
+ segments:
31
+ - 2
32
+ - 8
33
+ - 0
34
+ version: 2.8.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ description: ywesee distributed invoice manager, Ruby
38
+ email:
39
+ - mhatakeyama@ywesee.com, zdavatz@ywesee.com
40
+ executables:
41
+ - ydim-edit
42
+ - ydim-inject
43
+ - ydimd
44
+ extensions: []
45
+
46
+ extra_rdoc_files:
47
+ - History.txt
48
+ - Manifest.txt
49
+ - README.txt
50
+ - LICENSE.txt
51
+ files:
52
+ - History.txt
53
+ - Manifest.txt
54
+ - README.txt
55
+ - Rakefile
56
+ - LICENSE.txt
57
+ - bin/ydim-edit
58
+ - bin/ydim-inject
59
+ - bin/ydimd
60
+ - install.rb
61
+ - lib/ydim/autoinvoicer.rb
62
+ - lib/ydim/client.rb
63
+ - lib/ydim/config.rb
64
+ - lib/ydim/currency_converter.rb
65
+ - lib/ydim/currency_updater.rb
66
+ - lib/ydim/debitor.rb
67
+ - lib/ydim/factory.rb
68
+ - lib/ydim/invoice.rb
69
+ - lib/ydim/item.rb
70
+ - lib/ydim/mail.rb
71
+ - lib/ydim/odba.rb
72
+ - lib/ydim/root_session.rb
73
+ - lib/ydim/root_user.rb
74
+ - lib/ydim/server.rb
75
+ - lib/ydim/smtp_tls.rb
76
+ - lib/ydim/util.rb
77
+ - test/data/search.html
78
+ - test/stub/odba.rb
79
+ - test/suite.rb
80
+ - test/test_autoinvoicer.rb
81
+ - test/test_currency_converter.rb
82
+ - test/test_currency_updater.rb
83
+ - test/test_debitor.rb
84
+ - test/test_factory.rb
85
+ - test/test_invoice.rb
86
+ - test/test_item.rb
87
+ - test/test_mail.rb
88
+ - test/test_root_session.rb
89
+ - test/test_root_user.rb
90
+ - test/test_server.rb
91
+ has_rdoc: true
92
+ homepage: http://scm.ywesee.com/?p=ydim/.git;a=summary
93
+ licenses: []
94
+
95
+ post_install_message:
96
+ rdoc_options:
97
+ - --main
98
+ - README.txt
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ requirements: []
120
+
121
+ rubyforge_project: ydim
122
+ rubygems_version: 1.3.7
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: ywesee distributed invoice manager, Ruby
126
+ test_files:
127
+ - test/test_autoinvoicer.rb
128
+ - test/test_currency_converter.rb
129
+ - test/test_currency_updater.rb
130
+ - test/test_debitor.rb
131
+ - test/test_factory.rb
132
+ - test/test_invoice.rb
133
+ - test/test_item.rb
134
+ - test/test_mail.rb
135
+ - test/test_root_session.rb
136
+ - test/test_root_user.rb
137
+ - test/test_server.rb