webmoney 0.0.4.8 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ doc/*
2
+ lib/wmsigner.so
3
+ pkg/*
4
+ tmp/*
5
+
data/ChangeLog CHANGED
@@ -1,5 +1,13 @@
1
1
  ChangeLog
2
2
 
3
+ Fri Feb 12 2010 11:22:35 + 0400
4
+ ----------------------------
5
+ V 0.0.5
6
+ * Using Nokogiri instead Hpricot+Builder, incompatible with libxml2 < 2.7.0
7
+ * Using jeweler+rake-compiler
8
+ * Complete parse attestat fields (X11)
9
+ * Add X2 -Create transaction
10
+
3
11
  Sat Oct 03 2009 16:18:00 + 0400
4
12
  ----------------------------
5
13
  V 0.0.4.8
data/README CHANGED
@@ -5,6 +5,8 @@ XML-interfaces: http://www.wmtransfer.com/eng/developers/interfaces/index.shtml
5
5
 
6
6
  Gem have built-in native *wmsigner*.
7
7
 
8
+ Reqirements: Nokogiri >= 1.4.1 built with libxml2 >= 2.7 (IMPORTANT!)
9
+
8
10
  Author:: Alexander Oryol (mailto:eagle.alex@gmail.com)
9
11
  License:: MIT License
10
12
 
@@ -62,11 +64,17 @@ wmid = '111222333444'
62
64
  = Passport (X11)
63
65
 
64
66
  Get attestat data:
65
- passport = Passport.new(wmid)
66
- passport.attestat # { # Hash
67
+ passport = Webmoney::Passport.new(wmid)
68
+ passport.attestat # { # hash
67
69
  # :attestat => 110, # == FORMAL attestat, as example
68
70
  # :created_at => Wed Feb 25 21:54:01 +0300 2004 # Time object
71
+ # :cid => "103453"
72
+ # and etc.
69
73
  # }
74
+ passport.wmids # All wmids attached to the attestat
75
+ passport.userinfo[:country] # => 'Russia' # Userinfo fields in string context
76
+ passport.userinfo[:country].checked # => true # with checked/locked attribute
77
+ passport.directory # Base dictionary
70
78
 
71
79
  = Bussines level
72
80
 
data/RUNNING_TESTS ADDED
@@ -0,0 +1,12 @@
1
+ == Running tests
2
+
3
+ For run tests create ~/.wm/config.yml file:
4
+
5
+ common:
6
+ type: classic
7
+ wmid: '123456789012'
8
+ key: 'gQABAIR6... YOUR BASE64-KEY (see wmsigner readme) ...2cC8FZTyKyjBM='
9
+ password: _your_password_
10
+ ca_cert: file_or_path_to_directory # optional, all needed certs in lib
11
+
12
+ and type (RSpec required): rake spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.5
data/lib/passport.rb CHANGED
@@ -1,9 +1,12 @@
1
- require 'hpricot'
2
-
3
1
  # Class for store attestat information
4
2
  module Webmoney
3
+
5
4
  class Passport < Wmid
6
5
 
6
+ class Attribute < String
7
+ attr_accessor :checked, :locked
8
+ end
9
+
7
10
  # Attestate types
8
11
  ALIAS = 100
9
12
  FORMAL = 110
@@ -18,8 +21,6 @@ module Webmoney
18
21
  SERVICE2 = 200
19
22
  OPERATOR = 300
20
23
 
21
- attr_reader :attestat
22
-
23
24
  def self.worker= (worker)
24
25
  @@worker = worker
25
26
  end
@@ -28,9 +29,73 @@ module Webmoney
28
29
  @@worker
29
30
  end
30
31
 
31
- def attestat
32
- # memoize
33
- @attestat ||= @@worker.request(:get_passport, :wmid => self)
32
+ # memoize data
33
+ def attestat; @attestat ||= getinfo[:attestat] end
34
+ def directory; @directory ||= getinfo[:directory] end
35
+ def full_access; @full_access = getinfo[:full_access] end
36
+ def userinfo; @userinfo ||= getinfo[:userinfo] end
37
+
38
+ protected
39
+
40
+ def getinfo
41
+ info = @@worker.request(:get_passport, :wmid => self)
42
+ @attestat = info[:attestat]
43
+ @full_access = info[:full_access]
44
+ @userinfo = info[:userinfo]
45
+ @directory = info[:directory]
46
+ info
47
+ end
48
+
49
+ def self.parse_result(doc)
50
+ root = doc.at('/response')
51
+
52
+ # We use latest attestat
53
+ att_elm = root.at('certinfo/attestat/row')
54
+
55
+ tid = att_elm['tid'].to_i
56
+ recalled = att_elm['recalled'].to_i
57
+ locked = root.at('certinfo/userinfo/value/row')['locked'].to_i
58
+
59
+ attestat = {
60
+ :attestat => (recalled + locked > 0) ? ALIAS : tid,
61
+ :created_at => Time.xmlschema(att_elm['datecrt'])
62
+ }
63
+ attestat.merge!( att_elm.attributes.inject({}) do |memo, a|
64
+ a[1].value.empty? ? memo : memo.merge!(a[0].to_sym => a[1].value)
65
+ end )
66
+
67
+ userinfo = root.at('certinfo/userinfo/value/row').attributes.inject({}) { |memo, a|
68
+ memo.merge!(a[0].to_sym => Attribute.new(a[1].value.strip))
69
+ }
70
+ root.at('certinfo/userinfo/check-lock/row').attributes.each_pair do |k,v|
71
+ attr = userinfo[k.to_sym]
72
+ attr.checked = v.to_s[0,1] == '1'
73
+ attr.locked = v.to_s[1,2] == '1'
74
+ end
75
+
76
+ wmids = root.xpath('certinfo/wmids/row').inject({}) do |memo, elm|
77
+ attrs = {:created_at => Time.xmlschema(elm['datereg'])}
78
+ attrs.merge!(:nickname => elm['nickname']) unless elm['nickname'].empty?
79
+ attrs.merge!(:info => elm['info']) unless elm['info'].empty?
80
+ memo.merge!(elm['wmid'] => attrs)
81
+ end
82
+
83
+ if dir = root.at('directory')
84
+ directory = {
85
+ :ctype => dir.xpath('ctype').inject({}){|memo, node| memo.merge!(node['id'].to_i => node.text)},
86
+ :jstatus => dir.xpath('jstatus').inject({}){|memo, node| memo.merge!(node['id'].to_i => node.text)},
87
+ :types => dir.xpath('tid').inject({}){|memo, node| memo.merge!(node['id'].to_i => node.text)}
88
+ }
89
+ end
90
+
91
+ result = {
92
+ :full_access => root.at('fullaccess').text == '1',
93
+ :attestat => attestat,
94
+ :wmids => wmids,
95
+ :userinfo => userinfo
96
+ }
97
+ result.merge!(:directory => directory) if dir
98
+ result
34
99
  end
35
100
 
36
101
  end
@@ -5,13 +5,7 @@ module Webmoney::RequestResult # :nodoc:all
5
5
  end
6
6
 
7
7
  def result_get_passport(doc)
8
- tid = doc.at('/response/certinfo/attestat/row')['tid'].to_i
9
- recalled = doc.at('/response/certinfo/attestat/row')['recalled'].to_i
10
- locked = doc.at('/response/certinfo/userinfo/value/row')['locked'].to_i
11
- { # TODO more attestat fields...
12
- :attestat => ( recalled + locked > 0) ? Webmoney::Passport::ALIAS : tid,
13
- :created_at => Time.xmlschema(doc.at('/response/certinfo/attestat/row')['datecrt'])
14
- }
8
+ Webmoney::Passport.parse_result(doc)
15
9
  end
16
10
 
17
11
  def result_bussines_level(doc)
@@ -33,4 +27,14 @@ module Webmoney::RequestResult # :nodoc:all
33
27
  }
34
28
  end
35
29
 
30
+ def result_create_transaction(doc)
31
+ op = doc.at('//operation')
32
+ {
33
+ :operation_id => op['id'],
34
+ :operation_ts => op['ts']
35
+ }.merge( op.children.inject({}) do |memo, elm|
36
+ memo.merge!(elm.name.to_sym => elm.text)
37
+ end )
38
+ end
39
+
36
40
  end
data/lib/request_xml.rb CHANGED
@@ -1,87 +1,107 @@
1
1
  module Webmoney::RequestXML # :nodoc:all
2
2
 
3
- def envelope(utf = true)
4
- x = Builder::XmlMarkup.new(:indent => 1)
5
- encoding = utf ? "utf-8" : "windows-1251"
6
- x.instruct!(:xml, :version => "1.0", :encoding => encoding)
7
- x
8
- end
9
-
10
3
  def xml_get_passport(opt)
11
- x = envelope(false)
12
- x.request do
13
- x.wmid @wmid
14
- x.passportwmid opt[:wmid]
15
- x.params { x.dict 0; x.info 1; x.mode 0 }
16
- x.sign sign(@wmid + opt[:wmid]) if classic?
17
- end
18
- x
4
+ Nokogiri::XML::Builder.new { |x|
5
+ x.request {
6
+ x.wmid @wmid
7
+ x.passportwmid opt[:wmid]
8
+ x.params {
9
+ x.dict opt[:dict] || 0
10
+ x.info opt[:info] || 1
11
+ x.mode opt[:mode] || 0
12
+ }
13
+ # unless mode == 1, signed data need'nt
14
+ x.sign( (classic? && opt[:mode]) ? sign(@wmid + opt[:wmid]) : nil )
15
+ }
16
+ }
19
17
  end
20
18
 
21
19
  def xml_bussines_level(opt)
22
- x = envelope
23
- x.tag!('WMIDLevel.request') do
24
- x.signerwmid @wmid
25
- x.wmid opt[:wmid]
26
- end
27
- x
20
+ Nokogiri::XML::Builder.new { |x|
21
+ x.send('WMIDLevel.request') {
22
+ x.signerwmid @wmid
23
+ x.wmid opt[:wmid]
24
+ }
25
+ }
28
26
  end
29
27
 
30
28
  def xml_check_sign(opt)
31
- x = envelope(false)
32
- x.tag!('w3s.request') do
33
- x.wmid @wmid
34
- plan_out = @ic_out.iconv(opt[:plan])
35
- x.testsign do
36
- x.wmid opt[:wmid]
37
- x.plan { x.cdata! plan_out }
38
- x.sign opt[:sign]
39
- end
40
- if classic?
41
- plan = @wmid + opt[:wmid] + plan_out + opt[:sign]
42
- x.sign sign(plan)
43
- end
44
- end
45
- x
29
+ plan_out = @ic_out.iconv(opt[:plan])
30
+ Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
31
+ x.send('w3s.request') {
32
+ x.wmid @wmid
33
+ x.testsign {
34
+ x.wmid opt[:wmid]
35
+ x.plan { x.cdata opt[:plan] }
36
+ x.sign opt[:sign]
37
+ }
38
+ if classic?
39
+ plan = @wmid + opt[:wmid] + plan_out + opt[:sign]
40
+ x.sign sign(plan)
41
+ end
42
+ }
43
+ }
46
44
  end
47
45
 
48
46
  def xml_send_message(opt)
49
- x = envelope(false)
50
47
  req = reqn()
51
- x.tag!('w3s.request') do
52
- x.wmid @wmid
53
- x.reqn req
54
- msgsubj = @ic_out.iconv(opt[:subj])
55
- msgtext = @ic_out.iconv(opt[:text])
56
- x.message do
57
- x.receiverwmid opt[:wmid]
58
- x.msgsubj { x.cdata! msgsubj }
59
- x.msgtext { x.cdata! msgtext }
60
- end
61
- if classic?
62
- @plan = opt[:wmid] + req + msgtext + msgsubj
63
- x.sign sign(@plan)
64
- end
65
- end
66
- x
48
+ msgsubj = @ic_out.iconv(opt[:subj])
49
+ msgtext = @ic_out.iconv(opt[:text])
50
+ Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
51
+ x.send('w3s.request') {
52
+ x.wmid @wmid
53
+ x.reqn req
54
+ x.message do
55
+ x.receiverwmid opt[:wmid]
56
+ x.msgsubj { x.cdata opt[:subj] }
57
+ x.msgtext { x.cdata opt[:text] }
58
+ end
59
+ if classic?
60
+ @plan = opt[:wmid] + req + msgtext + msgsubj
61
+ x.sign sign(@plan)
62
+ end
63
+ }
64
+ }
67
65
  end
68
66
 
69
67
  def xml_find_wm(opt)
70
- x = envelope(false)
71
68
  req = reqn()
72
- x.tag!('w3s.request') do
73
- x.wmid @wmid
74
- x.reqn req
75
- x.testwmpurse do
76
- x.wmid( opt[:wmid] || '' )
77
- x.purse( opt[:purse] || '' )
78
- end
79
- if classic?
80
- @plan = "#{opt[:wmid]}#{opt[:purse]}"
81
- x.sign sign(@plan)
82
- end
83
- end
84
- x
69
+ Nokogiri::XML::Builder.new { |x|
70
+ x.send('w3s.request') {
71
+ x.wmid @wmid
72
+ x.reqn req
73
+ x.testwmpurse do
74
+ x.wmid( opt[:wmid] || '' )
75
+ x.purse( opt[:purse] || '' )
76
+ end
77
+ if classic?
78
+ @plan = "#{opt[:wmid]}#{opt[:purse]}"
79
+ x.sign sign(@plan)
80
+ end
81
+ }
82
+ }
83
+ end
84
+
85
+ def xml_create_transaction(opt)
86
+ req = reqn()
87
+ desc = @ic_out.iconv(opt[:desc]) # description
88
+ Nokogiri::XML::Builder.new( :encoding => 'windows-1251' ) { |x|
89
+ x.send('w3s.request') {
90
+ x.reqn req
91
+ x.wmid(@wmid) if classic?
92
+ x.sign sign(@plan) if classic?
93
+ x.trans {
94
+ x.tranid opt[:transid] # transaction id - unique
95
+ x.pursesrc opt[:pursesrc] # sender purse
96
+ x.pursedest opt[:pursedest] # recipient purse
97
+ x.amount opt[:amount]
98
+ x.period( opt[:period] || 0 ) # protection period (0 - no protection)
99
+ x.pcode( opt[:pcode].strip ) if opt[:period] > 0 && opt[:pcode] # protection code
100
+ x.desc desc
101
+ x.wminvid( opt[:wminvid] || 0 ) # invoice number (0 - without invoice)
102
+ }
103
+ }
104
+ }
85
105
  end
86
106
 
87
107
  end
data/lib/webmoney.rb CHANGED
@@ -7,8 +7,7 @@ require 'net/http'
7
7
  require 'net/https'
8
8
  require 'rubygems'
9
9
  require 'iconv'
10
- require 'builder'
11
- require 'hpricot'
10
+ require 'nokogiri'
12
11
 
13
12
  $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
14
13
  %w(wmsigner wmid passport purse request_xml request_retval request_result messenger).each { |lib| require lib }
@@ -31,8 +30,40 @@ module Webmoney
31
30
  class NonExistentWmidError < WebmoneyError; end
32
31
  class CaCertificateError < WebmoneyError; end
33
32
 
34
- attr_reader :wmid, :error, :errormsg, :last_request
35
- attr_accessor :interfaces, :messenger
33
+ attr_reader :wmid, :error, :errormsg, :last_request, :last_response, :interfaces
34
+ attr_accessor :messenger
35
+
36
+
37
+ # Preset for W3S
38
+ def w3s_url
39
+ 'https://w3s.wmtransfer.com/asp/'
40
+ end
41
+
42
+ # Presets for interfaces
43
+ def interface_urls
44
+ {
45
+ :create_invoice => w3s_url + 'XMLInvoice.asp', # x1
46
+ :create_transaction => w3s_url + 'XMLTrans.asp', # x2
47
+ :operation_history => w3s_url + 'XMLOperations.asp', # x3
48
+ :outgoing_invoices => w3s_url + 'XMLOutInvoices.asp', # x4
49
+ :finish_protect => w3s_url + 'XMLFinishProtect.asp', # x5
50
+ :send_message => w3s_url + 'XMLSendMsg.asp', # x6
51
+ :check_sign => w3s_url + 'XMLClassicAuth.asp', # x7
52
+ :find_wm => w3s_url + 'XMLFindWMPurse.asp', # x8
53
+ :balance => w3s_url + 'XMLPurses.asp', # x9
54
+ :incoming_invoices => w3s_url + 'XMLInInvoices.asp', # x10
55
+ :get_passport => 'https://passport.webmoney.ru/asp/XMLGetWMPassport.asp', # x11
56
+ :reject_protection => w3s_url + 'XMLRejectProtect.asp', # x13
57
+ :transaction_moneyback => w3s_url + 'XMLTransMoneyback.asp', # x14
58
+ :i_trust => w3s_url + 'XMLTrustList.asp', # x15
59
+ :trust_me => w3s_url + 'XMLTrustList2.asp', # x15
60
+ :trust_save => w3s_url + 'XMLTrustSave2.asp', # x15
61
+ :create_purse => w3s_url + 'XMLCreatePurse.asp', # x16
62
+ :create_contract => 'https://arbitrage.webmoney.ru/xml/X17_CreateContract.aspx', # x17
63
+ :transaction_get => 'https://merchant.webmoney.ru/conf/xml/XMLTransGet.asp', # x18
64
+ :bussines_level => 'https://stats.wmtransfer.com/levels/XMLWMIDLevel.aspx'
65
+ }
66
+ end
36
67
 
37
68
 
38
69
  # Required options:
@@ -52,6 +83,10 @@ module Webmoney
52
83
 
53
84
  def initialize(opt = {})
54
85
 
86
+ unless check_libxml_version
87
+ $stderr.puts "WARNING: webmoney lib will not work correctly with nokogori compiled with libxml2 version < 2.7.0"
88
+ end
89
+
55
90
  @wmid = Wmid.new(opt[:wmid])
56
91
 
57
92
  # classic or light
@@ -72,34 +107,12 @@ module Webmoney
72
107
  opt[:ca_cert]
73
108
  end
74
109
 
75
- w3s = 'https://w3s.wmtransfer.com/asp/'
76
-
77
- @interfaces = {
78
- 'create_invoice' => URI.parse( w3s + 'XMLInvoice.asp' ), # x1
79
- 'create_transaction' => URI.parse( w3s + 'XMLTrans.asp' ), # x2
80
- 'operation_history' => URI.parse( w3s + 'XMLOperations.asp' ), # x3
81
- 'outgoing_invoices' => URI.parse( w3s + 'XMLOutInvoices.asp' ), # x4
82
- 'finish_protect' => URI.parse( w3s + 'XMLFinishProtect.asp' ), # x5
83
- 'send_message' => URI.parse( w3s + 'XMLSendMsg.asp'), # x6
84
- 'check_sign' => URI.parse( w3s + 'XMLClassicAuth.asp'), # x7
85
- 'find_wm' => URI.parse( w3s + 'XMLFindWMPurse.asp'), # x8
86
- 'balance' => URI.parse( w3s + 'XMLPurses.asp'), # x9
87
- 'incoming_invoices' => URI.parse( w3s + 'XMLInInvoices.asp'), # x10
88
- 'get_passport' => URI.parse( 'https://passport.webmoney.ru/asp/XMLGetWMPassport.asp'), # x11
89
- 'reject_protection' => URI.parse( w3s + 'XMLRejectProtect.asp'), # x13
90
- 'transaction_moneyback' => URI.parse( w3s + 'XMLTransMoneyback.asp'), # x14
91
- 'i_trust' => URI.parse( w3s + 'XMLTrustList.asp'), # x15
92
- 'trust_me' => URI.parse( w3s + 'XMLTrustList2.asp'), # x15
93
- 'trust_save' => URI.parse( w3s + 'XMLTrustSave2.asp'), # x15
94
- 'create_purse' => URI.parse( w3s + 'XMLCreatePurse.asp'), # x16
95
- 'create_contract' => URI.parse( 'https://arbitrage.webmoney.ru/xml/X17_CreateContract.aspx'), # x17
96
- 'transaction_get' => URI.parse( 'https://merchant.webmoney.ru/conf/xml/XMLTransGet.asp'), # x18
97
- 'bussines_level' => URI.parse( 'https://stats.wmtransfer.com/levels/XMLWMIDLevel.aspx')
98
- }
99
110
  # Iconv.new(to, from)
100
111
  @ic_in = Iconv.new('UTF-8', 'CP1251')
101
112
  @ic_out = Iconv.new('CP1251', 'UTF-8')
102
113
 
114
+ prepare_interface_urls
115
+
103
116
  # initialize workers by self
104
117
  Purse.worker = self
105
118
  Passport.worker = self
@@ -138,7 +151,7 @@ module Webmoney
138
151
  res = https_request(iface, make_xml(iface, opt))
139
152
 
140
153
  # Parse response
141
- doc = Hpricot.XML(res)
154
+ doc = Nokogiri::XML(res)
142
155
  parse_retval(iface, doc)
143
156
  make_result(iface, doc)
144
157
  end
@@ -152,15 +165,25 @@ module Webmoney
152
165
 
153
166
  protected
154
167
 
168
+ def prepare_interface_urls
169
+ @interfaces = interface_urls.inject({}) do |m,k|
170
+ url = k[1]
171
+ url.sub!(/(\.asp)/, 'Cert.asp') if !classic? && url.match("^"+w3s_url)
172
+ m.merge!(k[0] => URI.parse(url))
173
+ end
174
+ end
175
+
155
176
  # Make HTTPS request, return result body if 200 OK
156
177
 
157
178
  def https_request(iface, xml)
179
+ @last_request = @last_response = nil
158
180
  url = case iface
159
181
  when Symbol
160
- @interfaces[iface.to_s]
182
+ @interfaces[iface]
161
183
  when String
162
184
  URI.parse(iface)
163
185
  end
186
+ raise ArgumentError, iface unless url
164
187
  http = Net::HTTP.new(url.host, url.port)
165
188
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
166
189
  if File.file? @ca_cert
@@ -172,12 +195,10 @@ module Webmoney
172
195
  end
173
196
  http.use_ssl = true
174
197
  @last_request = xml
175
- result = http.post( url.path, xml, "Content-Type" => "text/xml" )
198
+ @last_response = result = http.post( url.path, xml, "Content-Type" => "text/xml" )
176
199
  case result
177
200
  when Net::HTTPSuccess
178
- # replace root tag for Hpricot
179
- res = result.body.gsub(/(w3s\.response|WMIDLevel\.response)/,'w3s_response')
180
- return @ic_in.iconv(res)
201
+ result.body
181
202
  else
182
203
  @error = result.code
183
204
  @errormsg = result.body if result.class.body_permitted?()
@@ -195,7 +216,7 @@ module Webmoney
195
216
 
196
217
  def make_xml(iface, opt) # :nodoc:
197
218
  iface_func = "xml_#{iface}"
198
- send(iface_func, opt).target!
219
+ send(iface_func, opt).to_xml
199
220
  end
200
221
 
201
222
  def parse_retval(iface, doc) # :nodoc:
@@ -212,4 +233,12 @@ module Webmoney
212
233
  send(iface_result, doc)
213
234
  end
214
235
 
236
+ def check_libxml_version
237
+ libxml = Nokogiri::VERSION_INFO['libxml']
238
+ [libxml['compiled'], libxml['loaded']].each do |ver|
239
+ major, minor = ver.match(/^(\d+)\.(\d+).*/).to_a[1,2].map(&:to_i)
240
+ return false if major < 2 or minor < 7
241
+ end
242
+ end
243
+
215
244
  end
data/rakefile CHANGED
@@ -1,17 +1,17 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'rake/clean'
4
- require 'tools/rakehelp'
4
+ begin
5
+ require 'rake/extensiontask'
6
+ rescue LoadError
7
+ puts "Rake-compiler not available. Install it with: sudo gem install rake-compiler"
8
+ exit 1
9
+ end
5
10
  require 'spec/rake/spectask'
6
11
 
7
- GEM_VERSION="0.0.4.7"
8
-
9
- setup_extension('wmsigner', 'wmsigner')
12
+ CLEAN.include ["ext/wmsigner/*.{so,o}", "ext/wmsigner/Makefile", "lib/wmsigner.so", "pkg", "tmp"]
10
13
 
11
- desc "Compiles native extensions"
12
- task :compile => [:wmsigner]
13
-
14
- task :default => [:compile, :spec]
14
+ Rake::ExtensionTask.new('wmsigner')
15
15
 
16
16
  Spec::Rake::SpecTask.new do |task|
17
17
  task.libs << 'spec'
@@ -19,32 +19,28 @@ Spec::Rake::SpecTask.new do |task|
19
19
  task.verbose = true
20
20
  end
21
21
 
22
- gemspec = Gem::Specification.new do |gemspec|
23
- gemspec.name = "webmoney"
24
- gemspec.version = GEM_VERSION
25
- gemspec.author = "Alexander Oryol"
26
- gemspec.email = "eagle.alex@gmail.com"
27
- gemspec.summary = "Webmoney interfaces and native wmsigner"
28
- gemspec.files = %w( rakefile ChangeLog lib/WebMoneyCA.crt ) +
29
- Dir.glob( 'lib/*.rb' ) +
30
- Dir.glob( 'spec/*.rb' ) +
31
- Dir.glob( 'spec/unit/*.rb' ) +
32
- Dir.glob( 'ext/**/*.{h,cpp,rb}' ) +
33
- Dir.glob( 'tools/*.rb' )
34
- gemspec.autorequire = 'webmoney'
35
- gemspec.require_path = 'lib'
36
- gemspec.add_dependency('hpricot')
37
- gemspec.add_dependency('builder')
38
- gemspec.add_dependency('iconv')
39
-
40
- if RUBY_PLATFORM.match("win32")
41
- gemspec.platform = Gem::Platform::WIN32
42
- gemspec.files += []
43
- else
44
- gemspec.platform = Gem::Platform::RUBY
45
- gemspec.extensions = Dir.glob( 'ext/**/extconf.rb' )
22
+ spec = begin
23
+ require 'jeweler'
24
+ Jeweler::Tasks.new do |gemspec|
25
+ gemspec.name = "webmoney"
26
+ gemspec.rubyforge_project = 'webmoney'
27
+ gemspec.authors = ["Alexander Oryol"]
28
+ gemspec.email = "eagle.alex@gmail.com"
29
+ gemspec.summary = "Webmoney interfaces and native wmsigner"
30
+ gemspec.add_dependency('nokogiri')
31
+ gemspec.files << %w( rakefile ChangeLog lib/WebMoneyCA.crt ) +
32
+ Dir.glob( 'ext/**/*.{h,cpp,rb}' ) +
33
+ Dir.glob( 'tools/*.rb' )
34
+
35
+ if RUBY_PLATFORM.match("win32")
36
+ gemspec.platform = Gem::Platform::WIN32
37
+ gemspec.files += []
38
+ else
39
+ gemspec.platform = Gem::Platform::RUBY
40
+ gemspec.extensions = Dir.glob( 'ext/**/extconf.rb' )
41
+ end
46
42
  end
47
- end
48
-
49
- CLEAN.include ["ext/wmsigner/*.{so,o}", "ext/wmsigner/Makefile", "lib/wmsigner.so", "pkg", "*.gem"]
50
43
 
44
+ rescue LoadError
45
+ puts "Jeweler not available. Install it with: sudo gem install jeweler -s http://gemcutter.org"
46
+ end
data/spec/spec ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'spec'
4
+ exit ::Spec::Runner::CommandLine.run(::Spec::Runner::OptionParser.parse(ARGV, STDERR, STDOUT))
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'spec'
4
- require 'hpricot'
5
4
  require 'ostruct'
6
5
  require 'yaml'
7
6
  require 'time'
@@ -12,16 +12,102 @@ module Webmoney
12
12
  Passport.new(@wm.wmid).should be_instance_of(Passport)
13
13
  end
14
14
 
15
- it "request result get_passport should be Hash" do
16
- @wm.request(:get_passport, :wmid => @wm.wmid).should be_instance_of(Hash)
15
+ it "request result get_passport should be hash with data" do
16
+ wmid = '000000000007'
17
+ created_at = Time.at(1077735241.37)
18
+ res = @wm.request(:get_passport, :wmid => wmid, :dict => 1)
19
+ res[:full_access].should be_false
20
+ res[:wmids].should == {
21
+ wmid => { :created_at=>Time.at(1077733193.353) }
22
+ }
23
+ res[:attestat].should == {
24
+ :regcid=>"10",
25
+ :locked=>"1",
26
+ :recalled=>"0",
27
+ :cid=>"103453",
28
+ :admlocked=>"0",
29
+ :created_at=>created_at,
30
+ :datecrt=>"2004-02-25T21:54:01.370",
31
+ :regnickname=>"WM Passport Service /Центр аттестации/",
32
+ :regwmid=>"464889785562",
33
+ :attestat=>150,
34
+ :tid=>"150",
35
+ :datediff=>(Date.today - created_at.send(:to_date)).to_s
36
+ }
37
+
38
+ u_info = {
39
+ :locked=>"0",
40
+ :ctype=>"1",
41
+ :citid=>"12918",
42
+ :cap_owner=>"0",
43
+ :region=>"Москва",
44
+ :countryid=>"195",
45
+ :city=>"Москва",
46
+ :pasdoc=>"0",
47
+ :nickname=>"Арбитр",
48
+ :country=>"Россия",
49
+ :inndoc=>"0",
50
+ :email=>"", :pdateMMDDYYYY => "", :pday => "", :pmonth => "", :pyear => "",
51
+ :iname=>"", :inn=>"", :okonx=>"", :bik=>"", :pbywhom=>"", :phonemobile=>"", :rcountry=>"",
52
+ :bmonth=>"", :jadres=>"", :okpo=>"", :bday=>"", :pnomer=>"", :bankname=>"", :pcountry=>"", :pcountryid=>"",
53
+ :jcountryid=>"", :ks=>"", :infoopen=>"", :icq=>"", :byear=>"", :oname=>"", :osnovainfo=>"", :dirfio=>"",
54
+ :pdate=>"", :bplace=>"", :rs=>"", :rcity=>"", :adres=>"", :phone=>"", :buhfio=>"", :radres=>"", :fname=>"",
55
+ :phonehome=>"", :jcity=>"", :name=>"", :pcity=>"", :jstatus=>"", :fax=>"", :zipcode=>"", :rcountryid=>"",
56
+ :web=>"", :jzipcode=>"", :jcountry=>""
57
+ }
58
+
59
+ # a1 = res[:userinfo].keys.map(&:to_s).sort
60
+ # a2 = u_info.keys.map(&:to_s).sort
61
+ # puts ((a1|a2) - (a1 & a2)).inspect
62
+
63
+ res[:userinfo].should == u_info
64
+
65
+ res[:directory].should == {
66
+ :ctype=>{
67
+ 1=>"Частное лицо",
68
+ 2=>"Юридическое лицо"
69
+ },
70
+ :jstatus=>{
71
+ 20=>"Директор юридического лица",
72
+ 21=>"Бухгалтер юридического лица",
73
+ 22=>"Представитель юридического лица",
74
+ 23=>"ИП"
75
+ },
76
+ :types=>{
77
+ 100=>"Аттестат псевдонима",
78
+ 110=>"Формальный аттестат",
79
+ 120=>"Начальный аттестат",
80
+ 130=>"Персональный аттестат",
81
+ 135=>"Аттестат продавца",
82
+ 136=>"Аттестат Capitaller",
83
+ 140=>"Аттестат разработчика",
84
+ 150=>"Аттестат регистратора",
85
+ 170=>"Аттестат Гаранта",
86
+ 190=>"Аттестат сервиса WMT",
87
+ 200=>"Аттестат сервиса WMT",
88
+ 300=>"Аттестат Оператора"
89
+ }
90
+ }
17
91
  end
18
-
19
- it "should return correct data" do
92
+
93
+ it "should return userinfo attributes with checked/locked" do
94
+ wmid = '000000000007'
95
+ p = Passport.new(wmid)
96
+ p.userinfo[:adres].should be_empty
97
+ p.userinfo[:adres].checked.should be_true
98
+ p.userinfo[:adres].locked.should be_true
99
+ p.userinfo[:inn].should be_empty
100
+ p.userinfo[:inn].checked.should be_false
101
+ p.userinfo[:inn].locked.should be_true
102
+ end
103
+
104
+ it "should return correct fields" do
20
105
  wmid = '000000000007'
21
106
  p = Passport.new(wmid)
22
107
  p.wmid.should == wmid
23
108
  p.attestat[:attestat].should == Webmoney::Passport::REGISTRATOR
24
109
  p.attestat[:created_at].strftime('%Y-%m-%d %H:%M:%S').should == '2004-02-25 21:54:01'
110
+ p.full_access.should be_false
25
111
 
26
112
  wmid = '370860915669'
27
113
  p = Passport.new(wmid)
@@ -35,6 +121,7 @@ module Webmoney
35
121
  end
36
122
 
37
123
  it "should raise exception on non existent WMID" do
124
+ @wm.stub!(:http_request).and_return("<?xml version='1.0' encoding='windows-1251'?><response retval='0'><fullaccess>0</fullaccess><certinfo wmid='012345678901'/><retdesc>WMID not found</retdesc></response>")
38
125
  lambda {@wm.request(:get_passport, :wmid => '012345678901')}.should raise_error(Webmoney::NonExistentWmidError)
39
126
  end
40
127
 
@@ -9,7 +9,7 @@ module Webmoney
9
9
  end
10
10
 
11
11
  it "should be classic" do
12
- @wm.classic?.should be_true
12
+ @wm.should be_classic # @wm.classic? == true
13
13
  end
14
14
 
15
15
  it "should return reqn" do
@@ -20,6 +20,16 @@ module Webmoney
20
20
  (t2 > t1).should be_true
21
21
  end
22
22
 
23
+ it "should correct prepare interfaces urls" do
24
+ wm = TestWM.new :wmid => WmConfig.wmid
25
+ wm.should_not be_classic
26
+ wm.interfaces[:balance].class.should == URI::HTTPS
27
+ # converted to light-auth version
28
+ wm.interfaces[:balance].to_s.should == 'https://w3s.wmtransfer.com/asp/XMLPursesCert.asp'
29
+ # non-converted to light-auth version
30
+ wm.interfaces[:get_passport].to_s.should == 'https://passport.webmoney.ru/asp/XMLGetWMPassport.asp'
31
+ end
32
+
23
33
  it "should correct reqn" do
24
34
  Time.stub!(:now).and_return(Time.at(1244704683.69677))
25
35
  @wm.send(:reqn).should == '2009061111180369'
@@ -36,9 +46,8 @@ module Webmoney
36
46
  end
37
47
 
38
48
  it "should send request" do
39
- r = @wm.send(:https_request, :check_sign, '<w3s.request/>')
40
- doc = Hpricot.XML(r.gsub(/w3s\.response/,'w3s_response'))
41
- doc.at('w3s_response').should_not be_nil
49
+ doc = Nokogiri.XML(@wm.send(:https_request, :check_sign, '<w3s.request/>'))
50
+ doc.root.should_not be_nil
42
51
  end
43
52
 
44
53
  it"should raise error on bad response" do
@@ -80,9 +89,13 @@ module Webmoney
80
89
  it "should check_sign with specials" do
81
90
  plan = '<test>текст</test>'
82
91
  real_plan = Iconv.conv('CP1251', 'UTF-8', plan)
83
- @wm.request(:check_sign,
84
- :wmid => @wm.wmid, :plan => plan, :sign => @wm.send(:sign, real_plan )).
85
- should be_true
92
+ begin
93
+ @wm.request(:check_sign,
94
+ :wmid => @wm.wmid,
95
+ :plan => plan,
96
+ :sign => @wm.send(:sign, real_plan )
97
+ ).should be_true
98
+ end
86
99
  end
87
100
 
88
101
  it "should parse retval and raise error on broken get_passport" do
@@ -117,7 +130,11 @@ module Webmoney
117
130
  result[:id].should match(/^\d*$/)
118
131
  ((result[:date] + 60) > Time.now).should be_true
119
132
  end
120
-
133
+
134
+ it "should create transaction" do
135
+ # TODO @wm.request( :create_transaction, ...)
136
+ end
137
+
121
138
  it "should raise error on undefined xml func" do
122
139
  lambda { @wm.request(:unexistent_interface) }.should raise_error(::NoMethodError)
123
140
  end
data/webmoney.gemspec ADDED
@@ -0,0 +1,94 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{webmoney}
8
+ s.version = "0.0.5"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Alexander Oryol"]
12
+ s.date = %q{2010-02-12}
13
+ s.email = %q{eagle.alex@gmail.com}
14
+ s.extensions = ["ext/wmsigner/extconf.rb"]
15
+ s.extra_rdoc_files = [
16
+ "ChangeLog",
17
+ "README"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "ChangeLog",
22
+ "README",
23
+ "RUNNING_TESTS",
24
+ "VERSION",
25
+ "ext/wmsigner/base64.cpp",
26
+ "ext/wmsigner/base64.h",
27
+ "ext/wmsigner/cmdbase.cpp",
28
+ "ext/wmsigner/cmdbase.h",
29
+ "ext/wmsigner/crypto.cpp",
30
+ "ext/wmsigner/crypto.h",
31
+ "ext/wmsigner/extconf.rb",
32
+ "ext/wmsigner/md4.cpp",
33
+ "ext/wmsigner/md4.h",
34
+ "ext/wmsigner/rsalib1.cpp",
35
+ "ext/wmsigner/rsalib1.h",
36
+ "ext/wmsigner/signer.cpp",
37
+ "ext/wmsigner/signer.h",
38
+ "ext/wmsigner/stdafx.cpp",
39
+ "ext/wmsigner/stdafx.h",
40
+ "ext/wmsigner/wmsigner.cpp",
41
+ "lib/certs/02a6c417.0",
42
+ "lib/certs/3c58f906.0",
43
+ "lib/certs/AddTrust_External_Root.crt",
44
+ "lib/certs/WebMoneyCA.crt",
45
+ "lib/messenger.rb",
46
+ "lib/passport.rb",
47
+ "lib/purse.rb",
48
+ "lib/request_result.rb",
49
+ "lib/request_retval.rb",
50
+ "lib/request_xml.rb",
51
+ "lib/webmoney.rb",
52
+ "lib/wmid.rb",
53
+ "rakefile",
54
+ "spec/spec",
55
+ "spec/spec_helper.rb",
56
+ "spec/unit/messenger_spec.rb",
57
+ "spec/unit/passport_spec.rb",
58
+ "spec/unit/purse_spec.rb",
59
+ "spec/unit/signer_spec.rb",
60
+ "spec/unit/time_spec.rb",
61
+ "spec/unit/webmoney_spec.rb",
62
+ "spec/unit/wmid_spec.rb",
63
+ "webmoney.gemspec"
64
+ ]
65
+ s.rdoc_options = ["--charset=UTF-8"]
66
+ s.require_paths = ["lib"]
67
+ s.rubyforge_project = %q{webmoney}
68
+ s.rubygems_version = %q{1.3.5}
69
+ s.summary = %q{Webmoney interfaces and native wmsigner}
70
+ s.test_files = [
71
+ "spec/unit/time_spec.rb",
72
+ "spec/unit/purse_spec.rb",
73
+ "spec/unit/signer_spec.rb",
74
+ "spec/unit/messenger_spec.rb",
75
+ "spec/unit/passport_spec.rb",
76
+ "spec/unit/webmoney_spec.rb",
77
+ "spec/unit/wmid_spec.rb",
78
+ "spec/spec_helper.rb"
79
+ ]
80
+
81
+ if s.respond_to? :specification_version then
82
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
83
+ s.specification_version = 3
84
+
85
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
86
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
87
+ else
88
+ s.add_dependency(%q<nokogiri>, [">= 0"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<nokogiri>, [">= 0"])
92
+ end
93
+ end
94
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmoney
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4.8
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Oryol
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-03 00:00:00 +04:00
12
+ date: 2010-02-12 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: hpricot
16
+ name: nokogiri
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
@@ -22,21 +22,7 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: "0"
24
24
  version:
25
- - !ruby/object:Gem::Dependency
26
- name: builder
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- version:
35
- description: |
36
- This library should help to make requests to WebMoney Transfer http://www.wmtransfer.com
37
- XML-interfaces: http://www.wmtransfer.com/eng/developers/interfaces/index.shtml
38
- Gem have built-in native wmsigner tool.
39
-
25
+ description:
40
26
  email: eagle.alex@gmail.com
41
27
  executables: []
42
28
 
@@ -46,28 +32,18 @@ extra_rdoc_files:
46
32
  - ChangeLog
47
33
  - README
48
34
  files:
49
- - rakefile
35
+ - .gitignore
50
36
  - ChangeLog
51
37
  - README
52
- - lib/certs/02a6c417.0
53
- - lib/certs/3c58f906.0
54
- - lib/certs/AddTrust_External_Root.crt
55
- - lib/certs/WebMoneyCA.crt
56
- - lib/messenger.rb
57
- - lib/request_result.rb
58
- - lib/request_retval.rb
59
- - lib/request_xml.rb
60
- - lib/passport.rb
61
- - lib/purse.rb
62
- - lib/webmoney.rb
63
- - lib/wmid.rb
64
- - ext/wmsigner/extconf.rb
38
+ - RUNNING_TESTS
39
+ - VERSION
65
40
  - ext/wmsigner/base64.cpp
66
41
  - ext/wmsigner/base64.h
67
42
  - ext/wmsigner/cmdbase.cpp
68
43
  - ext/wmsigner/cmdbase.h
69
44
  - ext/wmsigner/crypto.cpp
70
45
  - ext/wmsigner/crypto.h
46
+ - ext/wmsigner/extconf.rb
71
47
  - ext/wmsigner/md4.cpp
72
48
  - ext/wmsigner/md4.h
73
49
  - ext/wmsigner/rsalib1.cpp
@@ -77,14 +53,36 @@ files:
77
53
  - ext/wmsigner/stdafx.cpp
78
54
  - ext/wmsigner/stdafx.h
79
55
  - ext/wmsigner/wmsigner.cpp
80
- - tools/rakehelp.rb
56
+ - lib/certs/02a6c417.0
57
+ - lib/certs/3c58f906.0
58
+ - lib/certs/AddTrust_External_Root.crt
59
+ - lib/certs/WebMoneyCA.crt
60
+ - lib/messenger.rb
61
+ - lib/passport.rb
62
+ - lib/purse.rb
63
+ - lib/request_result.rb
64
+ - lib/request_retval.rb
65
+ - lib/request_xml.rb
66
+ - lib/webmoney.rb
67
+ - lib/wmid.rb
68
+ - rakefile
69
+ - spec/spec
70
+ - spec/spec_helper.rb
71
+ - spec/unit/messenger_spec.rb
72
+ - spec/unit/passport_spec.rb
73
+ - spec/unit/purse_spec.rb
74
+ - spec/unit/signer_spec.rb
75
+ - spec/unit/time_spec.rb
76
+ - spec/unit/webmoney_spec.rb
77
+ - spec/unit/wmid_spec.rb
78
+ - webmoney.gemspec
81
79
  has_rdoc: true
82
- homepage: http://github.com/eagleas/webmoney
80
+ homepage:
83
81
  licenses: []
84
82
 
85
83
  post_install_message:
86
- rdoc_options: []
87
-
84
+ rdoc_options:
85
+ - --charset=UTF-8
88
86
  require_paths:
89
87
  - lib
90
88
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -102,16 +100,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
100
  requirements: []
103
101
 
104
102
  rubyforge_project: webmoney
105
- rubygems_version: 1.3.4
103
+ rubygems_version: 1.3.5
106
104
  signing_key:
107
105
  specification_version: 3
108
106
  summary: Webmoney interfaces and native wmsigner
109
107
  test_files:
110
- - spec/spec_helper.rb
111
- - spec/unit/messenger_spec.rb
112
- - spec/unit/passport_spec.rb
108
+ - spec/unit/time_spec.rb
113
109
  - spec/unit/purse_spec.rb
114
110
  - spec/unit/signer_spec.rb
115
- - spec/unit/time_spec.rb
111
+ - spec/unit/messenger_spec.rb
112
+ - spec/unit/passport_spec.rb
116
113
  - spec/unit/webmoney_spec.rb
117
114
  - spec/unit/wmid_spec.rb
115
+ - spec/spec_helper.rb
data/tools/rakehelp.rb DELETED
@@ -1,117 +0,0 @@
1
- def make(makedir)
2
- Dir.chdir(makedir) do
3
- sh(PLATFORM =~ /win32/ ? 'nmake' : 'make')
4
- end
5
- end
6
-
7
-
8
- def extconf(dir)
9
- Dir.chdir(dir) do ruby "extconf.rb" end
10
- end
11
-
12
-
13
- def setup_tests
14
- Rake::TestTask.new do |t|
15
- t.libs << "test"
16
- t.test_files = FileList['test/test*.rb']
17
- t.verbose = true
18
- end
19
- end
20
-
21
-
22
- def setup_clean otherfiles
23
- files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
24
- CLEAN.include(files)
25
- end
26
-
27
-
28
- def setup_rdoc files
29
- Rake::RDocTask.new do |rdoc|
30
- rdoc.rdoc_dir = 'doc/rdoc'
31
- rdoc.options << '--line-numbers'
32
- rdoc.rdoc_files.add(files)
33
- end
34
- end
35
-
36
-
37
- def setup_extension(dir, extension)
38
- ext = "ext/#{dir}"
39
- ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
40
- ext_files = FileList[
41
- "#{ext}/*.cpp",
42
- "#{ext}/*.h",
43
- "#{ext}/extconf.rb",
44
- "#{ext}/Makefile",
45
- "lib"
46
- ]
47
-
48
- task "lib" do
49
- directory "lib"
50
- end
51
-
52
- desc "Builds just the #{extension} extension"
53
- task extension.to_sym => ["#{ext}/Makefile", ext_so ]
54
-
55
- file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
56
- extconf "#{ext}"
57
- end
58
-
59
- file ext_so => ext_files do
60
- make "#{ext}"
61
- cp ext_so, "lib"
62
- end
63
- end
64
-
65
-
66
- def base_gem_spec(pkg_name, pkg_version)
67
- rm_rf "test/coverage"
68
- pkg_version = pkg_version
69
- pkg_name = pkg_name
70
- pkg_file_name = "#{pkg_name}-#{pkg_version}"
71
- Gem::Specification.new do |s|
72
- s.name = pkg_name
73
- s.version = pkg_version
74
- s.platform = Gem::Platform::RUBY
75
- s.has_rdoc = true
76
- s.extra_rdoc_files = [ "README" ]
77
-
78
- s.files = %w(COPYING LICENSE README Rakefile) +
79
- Dir.glob("{bin,doc/rdoc,test}/**/*") +
80
- Dir.glob("ext/**/*.{h,cpp,rb,rl}") +
81
- Dir.glob("{examples,tools,lib}/**/*.rb")
82
-
83
- s.require_path = "lib"
84
- s.extensions = FileList["ext/**/extconf.rb"].to_a
85
- s.bindir = "bin"
86
- end
87
- end
88
-
89
- def setup_gem(pkg_name, pkg_version)
90
- spec = base_gem_spec(pkg_name, pkg_version)
91
- yield spec if block_given?
92
-
93
- Rake::GemPackageTask.new(spec) do |p|
94
- p.gem_spec = spec
95
- p.need_tar = true if RUBY_PLATFORM !~ /mswin/
96
- end
97
- end
98
-
99
- def sub_project(project, *targets)
100
- targets.each do |target|
101
- Dir.chdir "projects/#{project}" do
102
- sh %{rake --trace #{target.to_s} }
103
- end
104
- end
105
- end
106
-
107
- # Conditional require rcov/rcovtask if present
108
- begin
109
- require 'rcov/rcovtask'
110
-
111
- Rcov::RcovTask.new do |t|
112
- t.test_files = FileList['test/test*.rb']
113
- t.rcov_opts << "-x /usr"
114
- t.output_dir = "test/coverage"
115
- end
116
- rescue Object
117
- end