xmlconv 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c6a24f6d6cdd84cdc5b6a296d8ccbfbd88af72b
4
- data.tar.gz: f219d53770b60d0c948e19bb4a1c5713b47f2b33
3
+ metadata.gz: 1a0cc0602375720c02d07d9739b38ff86f435f38
4
+ data.tar.gz: 7f3d6a5737221b3f8a6edde132d0371930f7b155
5
5
  SHA512:
6
- metadata.gz: c10f57a89fbb486b195d75cc69ae9cb404c7dac81ba50f144a832f1a0ea4e16576d1a2a1d077527fb34598f052bf1cb55cf20e1b87123e94c45105626b3a62e5
7
- data.tar.gz: 8f3c45d6f4395ef50201dd2701981b738f1dd441ddd78750a3c964ef46e8f447075825a4ad9b86b364c030ce4222d19579cdbd6ba0353684e172da4050e5a27a
6
+ metadata.gz: 433c00703555c1a93a404bf2b9214422598e1a7d13123a161ee1b2eb48a99108f20515099c7b401168511f3d59d4ac8b13cb5e1a1aee9c73cb923205d705cf19
7
+ data.tar.gz: 4e8b6f90feec79de4276ba716b4418dfe5cfc33cddeea9981ab2b3df03ef7e5ddaa55f053b3d22cc3a3825174d405d2c080737a468ad6046fe17ea0131f7dd8b
data/.travis.yml ADDED
@@ -0,0 +1,25 @@
1
+ language: ruby
2
+
3
+ bundler_args: --without debugger
4
+
5
+ cache: bundler
6
+ sudo: false
7
+
8
+ before_install:
9
+ - gem --version
10
+
11
+ script: bundle exec test/suite.rb
12
+
13
+ rvm:
14
+ - 2.3.1
15
+ - 2.4.0
16
+ - ruby-head
17
+
18
+ matrix:
19
+ allow_failures:
20
+ - rvm: ruby-head
21
+
22
+ notifications:
23
+ email:
24
+ recipients:
25
+ - ngiger@ywesee.com
data/Gemfile CHANGED
@@ -2,8 +2,6 @@ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  group :debugger do
5
- if RUBY_VERSION.match(/^2/)
6
- gem 'pry-byebug'
7
- gem 'pry-doc'
8
- end
5
+ gem 'pry-byebug'
6
+ gem 'pry-doc'
9
7
  end
data/History.txt CHANGED
@@ -1,7 +1,12 @@
1
+ === 1.1.1 / 06.06.2017
2
+
3
+ * Adapted to use the rack based SBSM
4
+ * Require Ruby >= 2.0 and mail gem
5
+
1
6
  === 1.1.0 / 02.09.2016
2
7
 
3
- * Revert fixing base_url as non-flavoerd url on 1.0.8
4
- * It must be supported in SBSM (Now xmlconv works with flavor in url)
8
+ * Removed use of TMail/Net:SMTP in lib/xmlconv/util/destination.rb
9
+ * Various fixes for passing the tests
5
10
 
6
11
  === 1.0.9 / 25.07.2016
7
12
 
@@ -24,6 +24,7 @@ module XmlConv
24
24
  'access' => {},
25
25
  'commission' => 0.3, ## Commission in percent
26
26
  'config' => default_config_files,
27
+ 'bbmb_url' => 'druby://localhost:12004',
27
28
  'db_name' => 'xmlconv',
28
29
  'db_user' => 'xmlconv',
29
30
  'db_auth' => '',
@@ -38,6 +39,7 @@ module XmlConv
38
39
  'mail_from' => 'xmlconv@ywesee.com',
39
40
  'pass_hash' => nil,
40
41
  'polling_file' => conf_dir,
42
+ 'polling_interval' => nil,
41
43
  'program_name' => 'XmlConv2',
42
44
  'project_root' => data_dir,
43
45
  'plugin_dir' => File.expand_path('conversion', code_dir),
@@ -49,9 +51,17 @@ module XmlConv
49
51
  'ssh_known_hosts_file'=> File.expand_path('known_hosts', conf_dir),
50
52
  'target_format_fs' => ',',
51
53
  'target_format_rs' => "\n",
54
+ 'smtp_server' => 'smtp.gmail.com',
55
+ 'smtp_user' => 'nouser@nowhere.com',
56
+ 'smtp_domain' => 'no.domain.com',
57
+ 'smtp_authtype' => 'plain',
58
+ 'smtp_port' => '587',
59
+ 'smtp_pass' => 'thisIsNotApassword',
52
60
  'ydim_id' => nil,
53
61
  'ydim_config' => nil,
54
62
  'vat_rate' => 7.6,
63
+ 'reader' => 'XundartBdd',
64
+ 'writer' => 'BddCsv',
55
65
  }
56
66
 
57
67
  config = RCLConf::RCLConf.new(ARGV, defaults)
@@ -5,6 +5,7 @@
5
5
  module XmlConv
6
6
  module I2
7
7
  class Header
8
+ TRANSACTION_TIME_FORMAT = '%Y%m%d%H%M'
8
9
  attr_accessor :recipient_id, :filename, :prefix, :transaction_id
9
10
  attr_reader :suffix
10
11
  def initialize(recipient_id = 'EPIN_PL')
@@ -13,7 +14,7 @@ module XmlConv
13
14
  time = Time.now
14
15
  # msec = sprintf('%03i', (time.to_f * 1000).to_i % 100)
15
16
  #@transaction_id = time.strftime("%Y%m%d%H%M#{msec}")
16
- @transaction_id = time.strftime("%Y%m%d%H%M")
17
+ @transaction_id = time.strftime(TRANSACTION_TIME_FORMAT)
17
18
  end
18
19
  def suffix=(suffix)
19
20
  @suffix = "_" << suffix.to_s
@@ -6,7 +6,7 @@ require 'xmlconv/i2/date'
6
6
  module XmlConv
7
7
  module I2
8
8
  class Position
9
- attr_accessor :number, :article_ean, :qty, :customer_id, :price, :unit,
9
+ attr_accessor :number, :article_ean, :qty, :customer_id, :price, :unit,
10
10
  :pharmacode, :free_text
11
11
  attr_reader :delivery_date
12
12
  def delivery_date=(date)
@@ -17,7 +17,7 @@ module XmlConv
17
17
  output = <<-EOS
18
18
  500:#{@number}
19
19
  EOS
20
- #501:#{@article_ean}
20
+ # output << "501:#{@article_ean}\n"
21
21
  [@customer_id, @pharmacode].compact.each { |id|
22
22
  #output << sprintf("502:%s\n", id)
23
23
  output << sprintf("501:%s\n", id)
@@ -14,14 +14,14 @@ module XmlConv
14
14
  end
15
15
  def transaction
16
16
  if((id = @session.user_input(:transaction_id)) \
17
- && (transaction = @session.transaction(id)))
17
+ && (transaction = @session.persistence_layer.transaction(id)))
18
18
  Transaction.new(@session, transaction)
19
19
  else
20
20
  self
21
21
  end
22
22
  end
23
23
  def home
24
- Transactions.new(@session, @session.transactions)
24
+ Transactions.new(@session, @session.persistence_layer.transactions)
25
25
  end
26
26
  end
27
27
  end
@@ -9,17 +9,38 @@ module XmlConv
9
9
  module State
10
10
  class Login < SBSM::State
11
11
  VIEW = View::Login
12
+ def initialize(session, model)
13
+ if session.request_method.eql?('POST')
14
+ session.request_params
15
+ xml_src = "#{session.request_params.keys.first} #{session.request_params.values.first}"
16
+ unless xml_src.length == 0
17
+ transaction = XmlConv::Util::Transaction.new
18
+ transaction.domain = session.server_name
19
+ transaction.input = xml_src
20
+ transaction.reader = 'SunStoreBdd'
21
+ transaction.writer = XmlConv::CONFIG.writer
22
+ poll_config = YAML.load_file(XmlConv::CONFIG.polling_file)
23
+ transaction.destination = XmlConv::Util::Destination.book(poll_config.destination)
24
+ transaction.partner = File.basename(session.request_path)
25
+ transaction.origin = session.request_origin
26
+ transaction.postprocs.push(['Soap', 'update_partner'])
27
+ transaction.postprocs.push(['Bbmb2', 'inject', XmlConv::CONFIG.bbmb_url, 'customer_id'])
28
+ res = session.app.execute_with_response(transaction)
29
+ end
30
+ end
31
+ super
32
+ end
12
33
  def login
13
34
  if(@session.login)
14
- Transactions.new(@session, @session.transactions)
35
+ Transactions.new(@session, @session.persistence_layer.transactions)
15
36
  else
16
37
  self
17
38
  end
18
39
  end
19
40
  def transaction
20
41
  if((id = @session.user_input(:transaction_id)) \
21
- && (transaction = @session.transaction(id)))
22
- TransactionLogin.new(@session, transaction)
42
+ && (transaction = @session.persistence_layer.transaction(id)))
43
+ TransactionLogin.new(@session.persistence_layer, transaction)
23
44
  else
24
45
  self
25
46
  end
@@ -29,7 +50,7 @@ module XmlConv
29
50
  VIEW = View::Login
30
51
  def login
31
52
  if(@session.login)
32
- Transaction.new(@session, @model)
53
+ Transaction.new(@session.persistence_layer, @model)
33
54
  else
34
55
  self
35
56
  end
@@ -3,15 +3,20 @@
3
3
  # XmlConv::Application -- xmlconv -- 29.09.2011 -- mhatakeyama@ywesee.com
4
4
  # XmlConv::Application -- xmlconv2 -- 07.06.2004 -- hwyss@ywesee.com
5
5
 
6
- require 'sbsm/drbserver'
6
+ require 'drb/drb'
7
+ require 'odba'
8
+ require 'csv'
9
+ require 'sbsm/admin_server'
10
+ require 'xmlconv/config'
7
11
  require 'xmlconv/state/global'
8
12
  require 'xmlconv/util/invoicer'
9
13
  require 'xmlconv/util/polling_manager'
10
14
  require 'xmlconv/util/session'
11
15
  require 'xmlconv/util/transaction'
12
16
  require 'xmlconv/util/validator'
17
+ require 'odba/connection_pool'
18
+ require 'xmlconv/util/autoload'
13
19
  require 'thread'
14
- require 'odba'
15
20
  require 'xmlconv/model/bdd'
16
21
 
17
22
  module XmlConv
@@ -58,7 +63,7 @@ module XmlConv
58
63
  transaction_id = transaction_id.to_i
59
64
  if((last_id = @transactions.last.transaction_id) \
60
65
  && (last_id >= transaction_id))
61
- start = (transaction_id - last_id - 1)
66
+ start = (transaction_id - last_id - 1)
62
67
  if(start + @transactions.size < 0)
63
68
  start = 0
64
69
  end
@@ -68,7 +73,7 @@ module XmlConv
68
73
  end
69
74
  end
70
75
  def send_invoice(time_range, date = Date.today)
71
- transactions = @transactions.select { |trans|
76
+ transactions = @transactions.select { |trans|
72
77
  time_range.include?(trans.commit_time)
73
78
  }
74
79
  Util::Invoicer.run(time_range, transactions, date)
@@ -88,31 +93,51 @@ module XmlConv
88
93
  end
89
94
  end
90
95
 
91
- class XmlConvApp < SBSM::DRbServer
92
- ENABLE_ADMIN = true
93
- SESSION = XmlConv::Util::Session
94
- VALIDATOR = XmlConv::Util::Validator
95
- POLLING_INTERVAL = 60 #* 15
96
- attr_reader :polling_thread, :dispatch_queue, :dispatcher_thread
97
- def initialize
98
- @system = ODBA.cache.fetch_named('XmlConv', self) {
99
- XmlConv::Util::Application.new
100
- }
101
- @system.init
96
+ def XmlConv.start_server
97
+ XmlConv::Util.autoload(XmlConv::CONFIG.plugin_dir, 'plugin')
98
+ XmlConv::Util.autoload(XmlConv::CONFIG.postproc_dir, 'postproc')
99
+ Mail.defaults do
100
+ delivery_method(:smtp, address: XmlConv::CONFIG.smtp_server, port: XmlConv::CONFIG.smtp_port,
101
+ domain: XmlConv::CONFIG.smtp_domain, user_name: XmlConv::CONFIG.smtp_user,
102
+ password: XmlConv::CONFIG.smtp_pass, authentication: XmlConv::CONFIG.smtp_authtype,
103
+ enable_starttls_auto: true)
104
+ end
105
+
106
+ ODBA.storage.dbi = ODBA::ConnectionPool.new("DBI:Pg:#{XmlConv::CONFIG.db_name}",
107
+ XmlConv::CONFIG.db_user, XmlConv::CONFIG.db_auth)
108
+ ODBA.cache.setup
109
+ puts "#{Time.now}: Prefetching cache. This may take a minute or two"
110
+ ODBA.cache.prefetch
111
+ $0 = XmlConv::CONFIG.program_name
112
+ puts "#{Time.now}: Prefetching finshed program name is #{$0}"
113
+ app = XmlConvApp.new
114
+ DRb.start_service(XmlConv::CONFIG.server_url, app)
115
+ SBSM.logger.info(XmlConv::CONFIG.program_name) { "drb-service listening on #{XmlConv::CONFIG.server_url}" }
116
+ puts "#{Time.now}: start_server done returning #{app.class}"
117
+ app
118
+ end
119
+
120
+ class XmlConvApp < SBSM::AdminServer
121
+ attr_reader :app, :persistence_layer, :polling_thread, :dispatch_queue, :dispatcher_thread
122
+ POLLING_INTERVAL = 60 #* 15
123
+ def initialize(app: XmlConv::Util::RackInterface.new)
124
+ @rack_app = app
125
+ super(app: app)
126
+ @persistence_layer = ODBA.cache.fetch_named('XmlConv', self) do XmlConv::Util::Application.new end
127
+ @persistence_layer.init
102
128
  @dispatch_queue = Queue.new
103
- if(self::class::POLLING_INTERVAL)
104
- start_polling
105
- end
129
+ @polling_interval = XmlConv::CONFIG.polling_interval || self::class::POLLING_INTERVAL
130
+ puts "@polling_interval is #{@polling_interval} @persistence_layer is #{@persistence_layer.class}"
131
+ start_polling if @polling_interval
106
132
  start_dispatcher
107
133
  start_invoicer if XmlConv::CONFIG.run_invoicer
108
- super(@system)
109
134
  end
110
135
  def dispatch(transaction)
111
136
  @dispatch_queue.push(transaction)
112
137
  end
113
138
  def execute_with_response(transaction)
114
139
  begin
115
- @system.execute(transaction)
140
+ @persistence_layer.execute(transaction)
116
141
  rescue Exception => e
117
142
  puts "rescued #{e.class}"
118
143
  end
@@ -121,21 +146,21 @@ class XmlConvApp < SBSM::DRbServer
121
146
  def start_dispatcher
122
147
  @dispatcher_thread = Thread.new {
123
148
  Thread.current.abort_on_exception = true
124
- loop {
125
- @system.execute(@dispatch_queue.pop)
149
+ loop {
150
+ @persistence_layer.execute(@dispatch_queue.pop)
126
151
  }
127
152
  }
128
153
  end
129
154
  def start_invoicer
130
155
  @invoicer_thread = Thread.new {
131
156
  Thread.current.abort_on_exception = true
132
- loop {
157
+ loop {
133
158
  this_month = Date.today
134
159
  next_month = this_month >> 1
135
160
  strt = Time.local(this_month.year, this_month.month)
136
161
  stop = Time.local(next_month.year, next_month.month)
137
162
  sleep(stop - Time.now)
138
- @system.send_invoice(strt...stop)
163
+ @persistence_layer.send_invoice(strt...stop)
139
164
  }
140
165
  }
141
166
  end
@@ -144,13 +169,13 @@ class XmlConvApp < SBSM::DRbServer
144
169
  Thread.current.abort_on_exception = true
145
170
  loop {
146
171
  begin
147
- XmlConv::Util::PollingManager.new(@system).poll_sources
172
+ XmlConv::Util::PollingManager.new(@persistence_layer).poll_sources
148
173
  rescue Exception => exc
149
- XmlConv::LOGGER.error(XmlConv::CONFIG.program_name) {
174
+ SBSM.logger.error(XmlConv::CONFIG.program_name) {
150
175
  [exc.class, exc.message].concat(exc.backtrace).join("\n")
151
176
  }
152
177
  end
153
- sleep(self::class::POLLING_INTERVAL)
178
+ sleep(@polling_interval)
154
179
  }
155
180
  }
156
181
  end
@@ -1,29 +1,30 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Util#autoload -- xmlconv2 -- 28.08.2006 -- hwyss@ywesee.com
3
+ require 'sbsm/logger'
3
4
 
4
5
  module XmlConv
5
6
  module Util
6
7
  def Util.autoload(dir, type)
7
8
  config = XmlConv::CONFIG
8
- logger = XmlConv::LOGGER
9
+ logger = SBSM.logger
9
10
  dir = File.expand_path(dir)
10
11
  prefix = File.basename(dir)
11
12
  search_path = File.dirname(dir)
12
13
  $:.push(search_path) unless $:.include?(search_path)
13
- logger.debug(config.program_name) {
14
- "checking directory '#{dir}' for #{type}s"
14
+ logger.debug(config.program_name) {
15
+ "checking directory '#{dir}' for #{type}s"
15
16
  }
16
17
  Dir.glob(File.join(dir, '*')) { |entry|
17
18
  if(/\.(rb|so)$/.match(entry))
18
19
  keyword = File.basename(entry)
19
20
  keyword.slice!(/#{File.extname(keyword)}$/)
20
21
  rpath = File.join(prefix, keyword)
21
- logger.debug(config.program_name) {
22
- "loading #{type}: '#{rpath}' (#{File.basename(entry)})"
22
+ logger.debug(config.program_name) {
23
+ "loading #{type}: '#{rpath}' (#{File.basename(entry)})"
23
24
  }
24
25
  begin
25
26
  require rpath #File.basename(keyword)
26
- rescue
27
+ rescue
27
28
  logger.warn(config.program_name) {
28
29
  "loading #{type} '#{rpath}' failed!"
29
30
  }
@@ -16,8 +16,8 @@ module XmlConv
16
16
  attr_accessor :path, :status
17
17
  attr_reader :uri
18
18
  STATUS_COMPARABLE = {
19
- :pending_pickup => 10,
20
- :picked_up => 20,
19
+ :pending_pickup => 10,
20
+ :picked_up => 20,
21
21
  :bbmb_ok => 20,
22
22
  :http_ok => 20,
23
23
  :ftp_ok => 20,
@@ -49,7 +49,7 @@ module XmlConv
49
49
  def update_status
50
50
  end
51
51
  def status_comparable
52
- self::class::STATUS_COMPARABLE[@status].to_i
52
+ self::class::STATUS_COMPARABLE[@status].to_i
53
53
  end
54
54
  def sanitize(str)
55
55
  str.to_s.gsub(/[^a-zA-Z0-9 _.]/, '').gsub(' ', '+')
@@ -97,8 +97,8 @@ module XmlConv
97
97
  forget_credentials!
98
98
  end
99
99
  def forget_credentials!
100
- @uri = URI::HTTP.new(@uri.scheme, nil, @uri.host, @uri.port,
101
- @uri.registry, @uri.path, @uri.opaque, @uri.query, @uri.fragment)
100
+ path = /^\//.match(@uri.path) ? @uri.path : '/' + @uri.path
101
+ @uri = URI::HTTP.new(@uri.scheme, nil, @uri.host, @uri.port, @uri.registry, path, @uri.opaque, @uri.query, @uri.fragment)
102
102
  end
103
103
  def host
104
104
  @uri.host
@@ -128,17 +128,17 @@ module XmlConv
128
128
  @transport = Net::FTP
129
129
  end
130
130
  def do_deliver(delivery)
131
- @transport.open(@uri.host, @uri.user, @uri.password) { |conn|
131
+ @transport.open(@uri.host, @uri.user, @uri.password) do |conn|
132
132
  conn.chdir(@uri.path)
133
133
  deliver_to_connection(conn, delivery)
134
- }
134
+ end
135
135
  end
136
136
  def deliver_to_connection(connection, delivery, idx=nil)
137
137
  if(delivery.is_a?(Array))
138
- #delivery.each_with_index { |part, idx|
139
- delivery.each { |part|
140
- #deliver_to_connection(connection, part, idx)
141
- deliver_to_connection(connection, part)
138
+ #delivery.each_with_index { |part, idx|
139
+ delivery.each { |part|
140
+ #deliver_to_connection(connection, part, idx)
141
+ deliver_to_connection(connection, part)
142
142
  }
143
143
  else
144
144
  fh = Tempfile.new('xmlconv')
@@ -146,7 +146,7 @@ module XmlConv
146
146
  fh.flush
147
147
  target = delivery.filename
148
148
  # if(idx)
149
- #target = sprintf("%03i_%s", idx, target)
149
+ #targidxet = sprintf("%03i_%s", idx, target)
150
150
  # target.gsub!(/\.dat/, "%03i.dat" % idx)
151
151
  # target.gsub!(/(CO_\d{13})/, '\1%02d' % idx)
152
152
  # end
@@ -174,9 +174,9 @@ module XmlConv
174
174
  def do_deliver(delivery)
175
175
  if(delivery.is_a?(Array))
176
176
  worst_status = ''
177
- delivery.each { |part|
178
- do_deliver(part)
179
- ## bogostatus: assume that the more information in the string,
177
+ delivery.each { |part|
178
+ do_deliver(part)
179
+ ## bogostatus: assume that the more information in the string,
180
180
  ## the worse the status is (ok < not found)
181
181
  ## rationale: DTSTTCPW
182
182
  if(@status.to_s > worst_status.to_s)
@@ -190,7 +190,7 @@ module XmlConv
190
190
  if(@uri.user || @uri.password)
191
191
  request.basic_auth(@uri.user, @uri.password)
192
192
  end
193
- response = http.request(request, delivery.to_s)
193
+ response = http.request(request, delivery.to_s)
194
194
  status_str = response.message.downcase.gsub(/\s+/, "_")
195
195
  @status = "http_#{status_str}".intern
196
196
  }
@@ -202,23 +202,19 @@ module XmlConv
202
202
  @uri = uri
203
203
  super()
204
204
  end
205
- def deliver(delivery)
205
+ def deliver(my_body)
206
+ XmlConv::CONFIG.mail_from ||= 'dummy@nowhere.org'
206
207
  recipients = [@uri.to].compact
207
208
  recipients.uniq!
208
209
  return if(recipients.empty?)
209
- subject = 'XmlConv - Delivery'
210
- mail = TMail::Mail.new
211
- mail.set_content_type('text', 'plain', 'charset'=>'ISO-8859-1')
212
- mail.body = delivery.to_s
213
- mail.from = XmlConv::CONFIG.mail_from
214
- mail.to = recipients
215
- mail.subject = subject
216
- mail.date = Time.now
217
- mail['User-Agent'] = 'XmlConv::Util::Destination'
218
- Net::SMTP.start(XmlConv::CONFIG.mail_host) { |smtp|
219
- smtp.sendmail(mail.encoded, XmlConv::CONFIG.mail_from, recipients)
220
- }
221
- @status = :mail_ok
210
+ my_subject = 'XmlConv - Delivery'
211
+ mail = ::Mail.deliver do
212
+ from XmlConv::CONFIG.mail_from
213
+ to recipients
214
+ subject my_subject
215
+ body my_body.to_s
216
+ end
217
+ @status = :mail_ok unless mail.error_status
222
218
  odba_store
223
219
  end
224
220
  end
@@ -1,23 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Util::Mail -- XmlConv -- 23.04.2009 -- hwyss@ywesee.com
3
3
 
4
- require 'net/smtp'
5
- unless /^1\.8/.match(RUBY_VERSION)
6
- require 'mail'
7
- end
8
-
4
+ require 'mail'
9
5
  require 'xmlconv/config'
10
6
 
11
7
  module XmlConv
12
8
  module Util
13
9
  module Mail
14
- SMTP_HANDLER = Net::SMTP
15
10
  def Mail.notify recipients, my_subject, my_body
16
- unless /^1\.8/.match(RUBY_VERSION)
17
- puts "XmlConv::Util::Mail.notify #{ XmlConv::CONFIG.mail_from} -> #{recipients} subject: #{my_subject}"
18
- puts "Skipping as RUBY_VERSON is #{RUBY_VERSION}"
19
- return
20
- end
21
11
  recipients.flatten!
22
12
  recipients.compact!
23
13
  recipients.uniq!
@@ -29,6 +19,7 @@ module Mail
29
19
  subject my_subject
30
20
  body my_body
31
21
  end
22
+ puts "XmlConv::Util::Mail.notify failed #{mail.error_status}" if mail.error_status
32
23
  end
33
24
  end
34
25
  end
@@ -13,7 +13,7 @@ module XmlConv
13
13
  module Util
14
14
  class Mission
15
15
  attr_accessor :reader, :writer, :destination, :error_recipients,
16
- :debug_recipients, :backup_dir, :partner, :postprocs, :filter,
16
+ :debug_recipients, :backup_dir, :partner, :postprocs, :filter,
17
17
  :tmp_destination, :arguments
18
18
  def create_transaction
19
19
  transaction = XmlConv::Util::Transaction.new
@@ -182,17 +182,21 @@ module XmlConv
182
182
  file.close if(file)
183
183
  end
184
184
  def poll_sources
185
- load_sources { |source|
185
+ load_sources do |source|
186
186
  begin
187
187
  source.poll { |transaction|
188
188
  @system.execute(transaction)
189
189
  }
190
190
  rescue Exception => e
191
191
  subject = 'XmlConv2 - Polling-Error'
192
- body = [e.class, e.message].concat(e.backtrace).join("\n")
192
+ body = [e.class, e.message,
193
+ defined?(source.user) ? 'user '+ source.user : nil,
194
+ defined?(source.host) ? 'host '+ source.host : nil,
195
+ defined?(source.port) ? 'port '+ source.port.to_s : nil
196
+ ].compact.concat(e.backtrace).join("\n")
193
197
  Util::Mail.notify source.error_recipients, subject, body
194
198
  end
195
- }
199
+ end
196
200
  end
197
201
  end
198
202
  end
@@ -136,12 +136,12 @@ Output:
136
136
  end
137
137
  def status_comparable
138
138
  if(@destination.respond_to?(:status_comparable))
139
- @destination.status_comparable
139
+ @destination.status_comparable
140
140
  end
141
141
  end
142
142
  def update_status
143
143
  if(@destination.respond_to?(:update_status))
144
- @destination.update_status
144
+ @destination.update_status
145
145
  end
146
146
  end
147
147
  def uri
@@ -1,3 +1,3 @@
1
1
  module XmlConv
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
@@ -31,6 +31,10 @@ module XmlConv
31
31
  end
32
32
  class Login < Template
33
33
  CONTENT = LoginComposite
34
+ def to_html(context)
35
+ return "" if @session.request_method.eql?('POST')
36
+ super
37
+ end
34
38
  end
35
39
  end
36
40
  end
data/test/suite.rb CHANGED
@@ -2,8 +2,12 @@
2
2
  # TestSuite -- xmlconv2 -- 01.06.2004 -- hwyss@ywesee.com
3
3
 
4
4
  $: << File.dirname(File.expand_path(__FILE__))
5
+ begin
6
+ require 'pry'
7
+ rescue LoadError
8
+ end
5
9
 
6
- current_dir = File.dirname(__FILE__)
10
+ current_dir = File.dirname(__FILE__)
7
11
  Dir.foreach(current_dir) { |dirname|
8
12
  dirpath = File.expand_path(dirname, current_dir)
9
13
  if(/^test_/o.match(dirname) && (File.ftype(dirpath) == 'directory'))
@@ -31,8 +31,8 @@ module XmlConv
31
31
  assert_equal(expected, @header.to_s)
32
32
  end
33
33
  def test_filename
34
- expected = Time.now.strftime("#{@header.recipient_id}_%Y%m%d%H%M%S")
35
- assert_match(/#{expected}\d{3}.dat/, @header.filename)
34
+ expected = Time.now.strftime("#{@header.recipient_id}_#{Header::TRANSACTION_TIME_FORMAT}")
35
+ assert_match(/#{expected}.dat/, @header.filename)
36
36
  end
37
37
  end
38
38
  end
@@ -28,17 +28,13 @@ module XmlConv
28
28
  @position.number = '12345'
29
29
  @position.article_ean = '7654321098765'
30
30
  @position.qty = 123
31
- date = flexmock('Date')
32
- date.should_receive(:code=).and_return({})
33
- date.should_receive(:is_a?).and_return(I2::Date)
34
- @position.delivery_date = date
35
- date.should_receive(:to_s=).and_return("540:A Date\n")
31
+ @position.delivery_date = I2::Date.new(1999,12,31)
36
32
  expected = <<-EOS
37
33
  500:12345
38
- 501:7654321098765
39
34
  520:123
40
- 540:A Date
41
- EOS
35
+ 540:2
36
+ 541:19991231
37
+ EOS
42
38
  assert_equal(expected, @position.to_s)
43
39
  end
44
40
  def test_delivery_date_writer
@@ -39,6 +39,9 @@ module XmlConv
39
39
  ODBA.cache = cache
40
40
  transaction.should_receive(:transaction_id=).with(1)
41
41
  transaction.should_receive(:execute).once.and_return(transaction)
42
+ transaction.should_receive(:postprocess).once
43
+ transaction.should_receive(:error=).never
44
+ transaction.should_receive(:odba_store).once
42
45
  transaction.should_receive(:notify).once
43
46
  assert_equal([], @app.transactions)
44
47
  assert_equal(0, @app.transactions.size)
@@ -55,6 +58,9 @@ module XmlConv
55
58
  ODBA.cache = cache
56
59
  transaction.should_receive(:transaction_id=).with(1)
57
60
  transaction.should_receive(:execute).once.and_raise(Net::SMTPFatalError, 'could not send email')
61
+ transaction.should_receive(:postprocess).never
62
+ transaction.should_receive(:error=).never
63
+ transaction.should_receive(:odba_store).once
58
64
  assert_equal([], @app.transactions)
59
65
  assert_equal(0, @app.transactions.size)
60
66
  @app.execute(transaction)
@@ -70,8 +76,10 @@ module XmlConv
70
76
  ODBA.cache = cache
71
77
  transaction.should_receive(:transaction_id=).with(1)
72
78
  transaction.should_receive(:execute).and_raise 'oops, something went wrong'
73
- transaction.should_receive(:error=)
74
- transaction.should_receive(:notify)
79
+ transaction.should_receive(:postprocess).never
80
+ transaction.should_receive(:error=).once
81
+ transaction.should_receive(:odba_store).once
82
+ transaction.should_receive(:notify).once
75
83
  assert_equal([], @app.transactions)
76
84
  assert_equal(0, @app.transactions.size)
77
85
  @app.execute(transaction)
@@ -80,7 +88,7 @@ module XmlConv
80
88
  ODBA.cache = nil
81
89
  end
82
90
  def test_dumpable
83
- Marshal.dump(@app)
91
+ assert_raises(TypeError) { Marshal.dump(@app) }
84
92
  end
85
93
  def test_next_transaction_id
86
94
  assert_equal([], @app.transactions)
@@ -98,7 +106,7 @@ module XmlConv
98
106
  end
99
107
  def test_odba_exclude_vars
100
108
  @app.instance_variable_set('@next_transaction_id', 10)
101
- @app.instance_eval('odba_replace_excluded!')
109
+ @app.instance_eval('odba_replace_excluded!')
102
110
  assert_nil(@app.instance_variable_get('@next_transaction_id'))
103
111
  end
104
112
  def test_transaction
@@ -12,6 +12,10 @@ require 'flexmock/minitest'
12
12
 
13
13
  module XmlConv
14
14
  module Util
15
+ class DestinationMail
16
+ def odba_store
17
+ end
18
+ end
15
19
  class TestDestination < ::Minitest::Test
16
20
  def setup
17
21
  @destination = Destination.new
@@ -28,7 +32,7 @@ module XmlConv
28
32
  end
29
33
  def test_deliver__destination
30
34
  delivery = flexmock('Delivery')
31
- assert_raises(RuntimeError) {
35
+ assert_raises(RuntimeError) {
32
36
  @destination.deliver(delivery)
33
37
  }
34
38
  end
@@ -37,16 +41,16 @@ module XmlConv
37
41
  end
38
42
  def test_book
39
43
  assert_instance_of(DestinationDir, Destination.book('/'))
40
- assert_instance_of(DestinationHttp,
44
+ assert_instance_of(DestinationHttp,
41
45
  Destination.book('http://www.example.com'))
42
- assert_instance_of(DestinationFtp,
46
+ assert_instance_of(DestinationFtp,
43
47
  Destination.book('ftp://www.example.com'))
44
48
  end
45
49
  end
46
50
  class TestDestinationDir < ::Minitest::Test
47
51
  def setup
48
52
  @destination = DestinationDir.new
49
- @target_dir = File.expand_path('data/destination',
53
+ @target_dir = File.expand_path('data/destination',
50
54
  File.dirname(__FILE__))
51
55
  super
52
56
  end
@@ -141,6 +145,21 @@ module XmlConv
141
145
  assert_respond_to(@destination, :host=)
142
146
  end
143
147
  end
148
+ class TestDestinationMail< ::Minitest::Test
149
+ def setup
150
+ @destination = DestinationMail.new
151
+ ::Mail.defaults do delivery_method :test end
152
+ ::Mail::TestMailer.deliveries.clear
153
+ super
154
+ end
155
+ def test_destination_mail
156
+ default_dest = 'mailto:noone@nowhere.org'
157
+ test_recicpient = 'test@other.org'
158
+ assert_equal(default_dest, @destination.uri.to_s)
159
+ @destination.deliver('body as text')
160
+ assert_equal(1, ::Mail::TestMailer.deliveries.length)
161
+ end
162
+ end
144
163
  class TestDestinationHttp < ::Minitest::Test
145
164
  def setup
146
165
  @destination = DestinationHttp.new
@@ -175,15 +194,15 @@ module XmlConv
175
194
  response = flexmock('Response')
176
195
  response.should_receive(:message).and_return { 'Status' }
177
196
  delivery.should_receive(:to_s).and_return { 'The Delivery' }
178
- http_session.should_receive(:request).and_return { |post_request, body|
197
+ http_session.should_receive(:request).and_return { |post_request, body|
179
198
  assert_instance_of(Net::HTTP::Post, post_request)
180
- header = post_request.instance_variable_get('@header')
199
+ header = post_request.instance_variable_get('@header')
181
200
  assert_equal(['text/xml'], header['content-type'])
182
201
  assert(header.include?('authorization'), "Authorization-Headers not sent")
183
202
  assert_equal('The Delivery', body)
184
203
  response
185
204
  }
186
- @transport.should_receive(:start).and_return { |host, port, block|
205
+ @transport.should_receive(:start).and_return { |host, port, block|
187
206
  assert_equal('xmlconv.ywesee.com', host)
188
207
  assert_equal(12345, port)
189
208
  block.call(http_session)
@@ -203,9 +222,14 @@ module XmlConv
203
222
  @destination.transport = @transport = flexmock('DestinationFtp::FTP_CLASS')
204
223
  super
205
224
  end
206
- def test_path_writer
225
+ def test_path_absolute_writer
207
226
  assert_equal('ftp:/', @destination.uri.to_s)
208
227
  @destination.path = '/foo/bar'
228
+ assert_equal('ftp:/%2Ffoo/bar', @destination.uri.to_s)
229
+ end
230
+ def test_path_relative_writer
231
+ assert_equal('ftp:/', @destination.uri.to_s)
232
+ @destination.path = 'foo/bar'
209
233
  assert_equal('ftp:/foo/bar', @destination.uri.to_s)
210
234
  end
211
235
  def test_host_writer
@@ -231,13 +255,13 @@ module XmlConv
231
255
  delivery.should_receive(:to_s).and_return { 'The Delivery' }
232
256
  delivery.should_receive(:filename).and_return { 'test.dat' }
233
257
  ftp_session.should_receive(:chdir).and_return { |path|
234
- assert_equal('/foo/bar/', path)
258
+ assert_equal('foo/bar/', path)
235
259
  }
236
260
  ftp_session.should_receive(:puttextfile).and_return { |local, remote|
237
261
  assert_equal("The Delivery\n", File.read(local))
238
262
  assert_equal('test.dat', remote)
239
263
  }
240
- @transport.should_receive(:open).and_return { |host, user, password, block|
264
+ @transport.should_receive(:open).and_return { |host, user, password, block|
241
265
  assert_equal('xmlconv.ywesee.com', host)
242
266
  assert_equal('testaccount', user)
243
267
  assert_equal('password', password)
@@ -262,13 +286,13 @@ module XmlConv
262
286
  ftp_session.should_receive(:chdir).and_return { |path|
263
287
  assert_equal('foo/bar/', path)
264
288
  }
265
- expecteds = %w{000_test.dat 001_test.dat}
289
+ expecteds = %w{test.dat test.dat}
266
290
  ftp_session.should_receive(:puttextfile).times(2)\
267
291
  .and_return { |local, remote|
268
292
  assert_equal("The Delivery\n", File.read(local))
269
293
  assert_equal(expecteds.shift, remote)
270
294
  }
271
- @transport.should_receive(:open).and_return { |host, user, password, block|
295
+ @transport.should_receive(:open).and_return { |host, user, password, block|
272
296
  assert_equal('xmlconv.ywesee.com', host)
273
297
  assert_equal('testaccount', user)
274
298
  assert_equal('password', password)
@@ -297,7 +321,7 @@ module XmlConv
297
321
  assert_equal('/foo/tmp/test.dat', remote)
298
322
  }
299
323
  ftp_session.should_receive(:rename).with('/foo/tmp/test.dat', 'test.dat').times(1)
300
- @transport.should_receive(:open).and_return { |host, user, password, block|
324
+ @transport.should_receive(:open).and_return { |host, user, password, block|
301
325
  assert_equal('xmlconv.ywesee.com', host)
302
326
  assert_equal('testaccount', user)
303
327
  assert_equal('password', password)
@@ -349,7 +373,7 @@ module XmlConv
349
373
  delivery.should_receive(:to_s).and_return { 'The Delivery' }
350
374
  delivery.should_receive(:filename).and_return { 'test.dat' }
351
375
  file_handle = StringIO.new('')
352
- @transport.should_receive(:start).and_return { |host, user, opts, block|
376
+ @transport.should_receive(:start).and_return { |host, user, opts, block|
353
377
  assert_equal('xmlconv.ywesee.com', host)
354
378
  assert_equal('testaccount', user)
355
379
  assert_equal([], opts[:keys])
@@ -380,7 +404,7 @@ module XmlConv
380
404
  delivery.should_receive(:to_s).and_return { 'The Delivery' }
381
405
  delivery.should_receive(:filename).and_return { 'test.dat' }
382
406
  file_handle = StringIO.new('')
383
- @transport.should_receive(:start).and_return { |host, user, opts, block|
407
+ @transport.should_receive(:start).and_return { |host, user, opts, block|
384
408
  assert_equal('xmlconv.ywesee.com', host)
385
409
  assert_equal('testaccount', user)
386
410
  assert_equal([], opts[:keys])
@@ -18,14 +18,14 @@ module XmlConv
18
18
  class TestPollingMission < ::Minitest::Test
19
19
  def setup
20
20
  @mission = PollingMission.new
21
- @dir = File.expand_path('data/i2',
21
+ @dir = File.expand_path('data/i2',
22
22
  File.dirname(__FILE__))
23
23
  FileUtils.mkdir_p(@dir)
24
24
  @file1 = File.expand_path('file1.txt', @dir)
25
25
  File.open(@file1, 'w') { |fh| fh << "File 1\n" }
26
26
  end
27
27
  def teardown
28
- FileUtils.rm_rf(@dir)
28
+ FileUtils.rm_rf(@dir)
29
29
  end
30
30
  def test_file_paths
31
31
  @mission.directory = @dir
@@ -100,15 +100,17 @@ module XmlConv
100
100
  end
101
101
  class TestPopMission < ::Minitest::Test
102
102
  def setup
103
+ ::Mail::TestMailer.deliveries.clear
104
+ ::Mail.defaults do delivery_method :test end
103
105
  @popserver = TCPServer.new('127.0.0.1', 0)
104
- addr = @popserver.addr
106
+ addr = @popserver.addr
105
107
  @mission = PopMission.new
106
108
  @mission.host = 'localhost'
107
109
  @mission.port = addr.at(1)
108
110
  @mission.user = "testuser"
109
111
  @mission.pass = "test"
110
112
  @mission.content_type = "text/xml"
111
- @datadir = File.expand_path('data', File.dirname(__FILE__))
113
+ @datadir = File.expand_path('data', File.dirname(__FILE__))
112
114
  @mission.backup_dir = File.join(@datadir, 'backup')
113
115
  @mission.destination = File.join(@datadir, 'destination')
114
116
  @mission.partner = 'Partner'
@@ -159,14 +161,14 @@ module XmlConv
159
161
  def setup
160
162
  @sys = flexmock('System')
161
163
  @polling = PollingManager.new(@sys)
162
- @dir = File.expand_path('data/i2',
164
+ @dir = File.expand_path('data/i2',
163
165
  File.dirname(__FILE__))
164
166
  FileUtils.mkdir_p(@dir)
165
167
  @file1 = File.expand_path('file1.txt', @dir)
166
168
  File.open(@file1, 'w') { |fh| fh << "File 1\n" }
167
169
  end
168
170
  def teardown
169
- FileUtils.rm_rf(@dir)
171
+ FileUtils.rm_rf(@dir)
170
172
  @sys.__verify
171
173
  super
172
174
  end
@@ -186,7 +188,7 @@ reader: XmlBdd
186
188
  EOS
187
189
  }
188
190
  block = nil
189
- block3 = Proc.new { |source|
191
+ block3 = Proc.new { |source|
190
192
  flunk "too many sources"
191
193
  }
192
194
  block2 = Proc.new { |source|
@@ -49,18 +49,17 @@ module XmlConv
49
49
  assert_respond_to(@transaction, :commit_time)
50
50
  end
51
51
  def test_execute
52
- src = flexmock('source')
53
52
  input = flexmock('input')
54
53
  reader = flexmock('reader')
55
54
  model = flexmock('model')
56
55
  writer = flexmock('writer')
57
56
  output = flexmock('output')
58
57
  destination = flexmock('destination')
59
- @transaction.input = src
58
+ @transaction.input = 'abc'
60
59
  @transaction.reader = reader
61
60
  @transaction.writer = writer
62
61
  @transaction.destination = destination
63
- reader.should_receive(:parse).with(src).once.and_return(input)
62
+ reader.should_receive(:parse).and_return(input)
64
63
  reader.should_receive(:convert).with(input).once.and_return(model)
65
64
  writer.should_receive(:convert).with(model).once.and_return(output)
66
65
  destination.should_receive(:deliver).with(output).once
@@ -68,7 +67,7 @@ module XmlConv
68
67
  time1 = Time.now
69
68
  result = @transaction.execute
70
69
  time2 = Time.now
71
- assert_equal(src, @transaction.input)
70
+ assert_equal('abc', @transaction.input)
72
71
  assert_equal(reader, @transaction.reader)
73
72
  assert_equal(model, @transaction.model)
74
73
  assert_equal(writer, @transaction.writer)
@@ -84,22 +83,22 @@ module XmlConv
84
83
  Marshal.dump(@transaction)
85
84
  end
86
85
  def test_notify
87
- ::Mail::TestMailer.deliveries.clear
88
- ::Mail.defaults do
89
- delivery_method :test
90
- end
86
+ ::Mail::TestMailer.deliveries.clear
87
+ ::Mail.defaults do delivery_method :test end
88
+ to_addr = 'foo@bar.com'
89
+ XmlConv::CONFIG.mail_from = 'from@some.com'
91
90
  @transaction.instance_variable_set('@start_time', Time.now)
92
91
  @transaction.error_recipients = ['bar']
93
92
  @transaction.notify
94
93
  assert_equal(0, ::Mail::TestMailer.deliveries.size)
95
- @transaction.debug_recipients = ['foo']
94
+ @transaction.debug_recipients = [to_addr]
96
95
  @transaction.notify
97
96
  assert_equal(1, ::Mail::TestMailer.deliveries.size)
98
- assert_equal(['foo'], ::Mail::TestMailer.deliveries.last.to)
97
+ assert_equal([to_addr], ::Mail::TestMailer.deliveries.last.to)
99
98
  @transaction.error = 'error!'
100
99
  @transaction.notify
101
100
  assert_equal(2, ::Mail::TestMailer.deliveries.size)
102
- assert_equal(['foo', 'bar'], ::Mail::TestMailer.deliveries.last.to)
101
+ assert_equal([to_addr, 'bar'], ::Mail::TestMailer.deliveries.last.to)
103
102
  end
104
103
  end
105
104
  end
data/xmlconv.gemspec CHANGED
@@ -21,20 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "ydbd-pg", '>= 0.5.1'
22
22
  spec.add_dependency "ydbi", '>= 0.5.1'
23
23
  spec.add_dependency "json"
24
- # Must not include mail and use specific old version of some gems to
25
- # allow mod_ruby compiled against Ruby 1.8.6 as on fastpower
26
- if /^1\./.match(RUBY_VERSION)
27
- spec.add_dependency "sbsm", '1.2.6'
28
- spec.add_dependency "htmlgrid", '1.0.7'
29
- spec.add_dependency "ydim", '1.0.0'
30
- spec.add_dependency "hpricot", '0.8.2'
31
- else
32
- spec.add_dependency "sbsm"
33
- spec.add_dependency "htmlgrid"
34
- spec.add_dependency "ydim"
35
- spec.add_dependency "syck"
36
- spec.add_dependency "mail" # avoid it to make it run
37
- end
24
+ spec.add_dependency "sbsm", '>= 1.4.3'
25
+ spec.add_dependency "htmlgrid"
26
+ spec.add_dependency "ydim"
27
+ spec.add_dependency "syck"
28
+ spec.add_dependency "mail"
38
29
  spec.add_dependency "rclconf"
39
30
  spec.add_dependency "needle"
40
31
  spec.add_dependency "ypdf-writer"
@@ -43,13 +34,11 @@ Gem::Specification.new do |spec|
43
34
  spec.add_runtime_dependency "yus"
44
35
 
45
36
  spec.add_development_dependency "bundler"
46
- unless /^1\.8/.match(RUBY_VERSION)
47
- spec.add_development_dependency "simplecov"
48
- spec.add_development_dependency "rake"
49
- spec.add_development_dependency "flexmock"
50
- spec.add_development_dependency "minitest"
51
- spec.add_development_dependency "minitest-should_syntax"
52
- spec.add_development_dependency "rspec"
53
- end
37
+ spec.add_development_dependency "simplecov"
38
+ spec.add_development_dependency "rake"
39
+ spec.add_development_dependency "flexmock"
40
+ spec.add_development_dependency "minitest"
41
+ spec.add_development_dependency "minitest-should_syntax"
42
+ spec.add_development_dependency "rspec"
54
43
  end
55
44
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmlconv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaomi Hatakeyama, Zeno R.R. Davatz, Niklaus Giger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-02 00:00:00.000000000 Z
11
+ date: 2017-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: odba
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 1.4.3
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 1.4.3
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: htmlgrid
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -314,6 +314,7 @@ extensions: []
314
314
  extra_rdoc_files: []
315
315
  files:
316
316
  - ".gitignore"
317
+ - ".travis.yml"
317
318
  - Gemfile
318
319
  - History.txt
319
320
  - LICENSE
@@ -434,7 +435,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
434
435
  version: '0'
435
436
  requirements: []
436
437
  rubyforge_project:
437
- rubygems_version: 2.5.1
438
+ rubygems_version: 2.6.8
438
439
  signing_key:
439
440
  specification_version: 4
440
441
  summary: xmlconverter, convert XML to flat files
@@ -469,4 +470,3 @@ test_files:
469
470
  - test/test_util/invoicer.rb
470
471
  - test/test_util/polling_manager.rb
471
472
  - test/test_util/transaction.rb
472
- has_rdoc: