saasu 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source :rubygems
2
+
3
+ gem "nokogiri"
4
+ gem "activesupport", ">= 2.3.2"
5
+
6
+ group :development do
7
+ gem "bundler", "~> 1.0.0"
8
+ gem "jeweler", "~> 1.6.4"
9
+ gem "rspec"
10
+ gem "yard"
11
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Kieran Johnson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # Saasu
2
+
3
+ This gem provide a ruby wrapper to the Saasu api.
4
+
5
+ ## Installation
6
+
7
+ gem install saasu
8
+
9
+ ## Getting Started
10
+
11
+ Usage is currently limited to fetching invoices.
12
+
13
+ Firstly setup the library with your api\_key and file\_uid
14
+
15
+ Saasu::Base.api_key = key
16
+ Saasu::Base.file_uid = uid
17
+
18
+ To fetch all invoices
19
+
20
+ invoices = Saasu::Invoice.all
21
+
22
+ You can pass in any conditions as a hash. The keys should be in snake case.
23
+
24
+ invoices = Saasu::Invoice.all(:transaction_type => "s", :paid_status => "Unpaid")
25
+
26
+ For a complete list of supported options see the [Saasu API Reference](http://help.saasu.com/api/http-get/)
27
+
28
+ To fetch a single invoice by its uid
29
+
30
+ invoice = Saasu::Invoice.find(uid)
31
+
32
+ ## Copyright
33
+
34
+ Copyright (c) 2011 Kieran Johnson. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "saasu"
18
+ gem.summary = "Ruby wrapper for the Saasu api"
19
+ gem.description = "Ruby wrapper for the Saasu api"
20
+ gem.email = "hello@invisiblelines.com"
21
+ gem.homepage = "http://github.com/kieranj/saasu"
22
+ gem.authors = ["Kieran Johnson"]
23
+ # dependencies defined in Gemfile
24
+ end
25
+ Jeweler::RubygemsDotOrgTasks.new
26
+
27
+ require 'rspec/core'
28
+ require 'rspec/core/rake_task'
29
+ RSpec::Core::RakeTask.new(:spec) do |spec|
30
+ spec.pattern = FileList['spec/**/*_spec.rb']
31
+ end
32
+
33
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
34
+ spec.pattern = 'spec/**/*_spec.rb'
35
+ end
36
+
37
+ task :default => :spec
38
+
39
+ require 'yard'
40
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/lib/saasu/base.rb ADDED
@@ -0,0 +1,174 @@
1
+ module Saasu
2
+
3
+ class Base
4
+
5
+ ENDPOINT = "https://secure.saasu.com/webservices/rest/r1"
6
+
7
+ def initialize(xml)
8
+ klass = self.class.name.split("::")[1].downcase
9
+ xml.children.each do |child|
10
+ if !child.text?
11
+ child.attributes.each do |attr|
12
+ send("#{attr[1].name.underscore.sub(/#{klass}_/, "")}=", attr[1].text)
13
+ end
14
+
15
+ send("#{child.name.underscore.sub(/#{klass}_/, "")}=", child.children.first.text) unless child.children.first.nil?
16
+ end
17
+ end
18
+ end
19
+
20
+ class << self
21
+
22
+ # @param [String] the API key
23
+ #
24
+ def api_key=(key)
25
+ @@api_key = key
26
+ end
27
+
28
+ # Return the API key
29
+ #
30
+ def api_key
31
+ @@api_key
32
+ end
33
+
34
+ # @param [Integer] the file_uid
35
+ #
36
+ def file_uid=(uid)
37
+ @@file_uid = uid
38
+ end
39
+
40
+ # Returns the file_uid
41
+ #
42
+ def file_uid
43
+ @@file_uid
44
+ end
45
+
46
+ # Returns all resources matching the supplied conditions
47
+ # @param [Hash] conditions for the request
48
+ #
49
+ def all(options = {})
50
+ response = get(options)
51
+ xml = Nokogiri::XML(response).css("#{defaults[:collection_name]}")
52
+
53
+ collection = xml.inject([]) do |result, item|
54
+ result << new(item)
55
+ result
56
+ end
57
+ collection
58
+ end
59
+
60
+ # Finds a specific resource by its uid
61
+ # @param [Integer] the uid
62
+ #
63
+ def find(uid)
64
+ response = get({:uid => uid}, false)
65
+ xml = Nokogiri::XML(response).css("#{defaults[:resource_name]}")
66
+ new(xml.first)
67
+ end
68
+
69
+ # Allows defaults for the object to be set.
70
+ # Generally the class name will be suitable and options will not need to be provided
71
+ # @param [Hash] options to override the default settings
72
+ #
73
+ def defaults(options = {})
74
+ default_options.merge!(options)
75
+ end
76
+
77
+ protected
78
+
79
+ # Default options for the class
80
+ #
81
+ def default_options
82
+ defaults = {}
83
+ defaults[:resource_name] = name.split("::").last.downcase
84
+ defaults[:collection_name] = name.split("::").last.downcase + "ListItem"
85
+ defaults
86
+ end
87
+
88
+ # Defines the fields for a resource and any transformations
89
+ # @param [Hash] key/value pair of field name and object type
90
+ #
91
+ def fields(fields = {})
92
+ fields.each do |k,v|
93
+ define_accessor(k.underscore, v)
94
+ end
95
+ end
96
+
97
+ def define_accessor(field, type)
98
+ m = field.sub(/#{defaults[:resource_name]}_/, "")
99
+ case type
100
+ when :decimal
101
+ class_eval <<-END
102
+ def #{m}=(v)
103
+ @#{m} = v.to_f
104
+ end
105
+ END
106
+ when :date
107
+ class_eval <<-END
108
+ def #{m}=(v)
109
+ @#{m} = Date.parse(v)
110
+ end
111
+ END
112
+ when :integer
113
+ class_eval <<-END
114
+ def #{m}=(v)
115
+ @#{m} = v.to_i
116
+ end
117
+ END
118
+ when :boolean
119
+ class_eval <<-END
120
+ def #{m}=(v)
121
+ @#{m} = (v.match(/true/i) ? true : false)
122
+ end
123
+ END
124
+ when :array
125
+ class_eval <<-END
126
+ def #{m}=(v)
127
+ @#{m} = v.split(",")
128
+ end
129
+ END
130
+ else
131
+ class_eval <<-END
132
+ def #{m}=(v)
133
+ @#{m} = v
134
+ end
135
+ END
136
+ end
137
+
138
+ class_eval <<-END
139
+ def #{m}
140
+ @#{m}
141
+ end
142
+ END
143
+ end
144
+
145
+ # Makes the request to saasu
146
+ # @param [Hash] options for the request
147
+ # @param [Boolean] toggles searching between collection and a singular resource
148
+ #
149
+ def get(options = {}, all = true)
150
+ uri = URI.parse(request_path(options, all))
151
+ puts request_path(options, all)
152
+ http = Net::HTTP.new(uri.host, uri.port)
153
+ http.use_ssl = true
154
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
155
+ response = http.request(Net::HTTP::Get.new(uri.request_uri))
156
+ puts response.body
157
+ (options[:format] && options[:format] == "pdf") ? response.body : response.body
158
+ end
159
+
160
+ def query_string(options = {})
161
+ options = { :wsaccesskey => api_key, :fileuid => file_uid }.merge!(options)
162
+ options.map { |k,v| "#{k.to_s.gsub(/_/, "")}=#{v}"}.join("&")
163
+ end
164
+
165
+ def request_path(options = {}, all = true)
166
+ path = (all == true ? defaults[:collection_name].sub(/Item/, "") : defaults[:resource_name])
167
+ ENDPOINT + "/#{path}?#{query_string(options)}"
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
174
+ end
@@ -0,0 +1,42 @@
1
+ module Saasu
2
+
3
+ class Invoice < Base
4
+
5
+ fields "uid" => :integer,
6
+ "lastUpdatedUid" => :string,
7
+ "transactionType" => :string,
8
+ "date" => :date,
9
+ "dueOrExpiryDate" => :date,
10
+ "utcFirstCreated" => :date,
11
+ "utcLastModified" => :date,
12
+ "summary" => :string,
13
+ "invoiceNumber" => :string,
14
+ "purchaseOrderNumber" => :string,
15
+ "dueDate" => :date,
16
+ "ccy" => :string,
17
+ "autoPopulateFxRate" => :boolean,
18
+ "fcToBcFxRate" => :decimal,
19
+ "paymentCount" => :integer,
20
+ "totalAmountInclTax" => :decimal,
21
+ "amountOwed" => :decimal,
22
+ "paidStatus" => :string,
23
+ "requiresFollowUp" => :boolean,
24
+ "isSent" => :boolean,
25
+ "layout" => :string,
26
+ "status" => :string,
27
+ "typeUid" => :string,
28
+ "contactUid" => :integer,
29
+ "contactGivenName" => :string,
30
+ "contactFamilyName" => :string,
31
+ "contactOrganisationName" => :string,
32
+ "shipToContactUid" => :string,
33
+ "shipToContactFirstname" => :string,
34
+ "shipToContactLastName" => :string,
35
+ "shipToContactOrganisation" => :string,
36
+ "tags" => :array,
37
+ "totalAmountPaid" => :decimal,
38
+ "invoiceItems" => :array
39
+
40
+ end
41
+
42
+ end
data/lib/saasu.rb ADDED
@@ -0,0 +1,10 @@
1
+ $:.unshift File.join(File.dirname(__FILE__))
2
+
3
+ require "rubygems"
4
+ require "uri"
5
+ require "net/https"
6
+ require "nokogiri"
7
+ require "active_support/inflector"
8
+
9
+ require "saasu/base"
10
+ require "saasu/invoice"
data/saasu.gemspec ADDED
@@ -0,0 +1,68 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{saasu}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Kieran Johnson"]
12
+ s.date = %q{2011-08-24}
13
+ s.description = %q{Ruby wrapper for the Saasu api}
14
+ s.email = %q{hello@invisiblelines.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ "Gemfile",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/saasu.rb",
26
+ "lib/saasu/base.rb",
27
+ "lib/saasu/invoice.rb",
28
+ "saasu.gemspec",
29
+ "spec/base_spec.rb",
30
+ "spec/mocks/invoice.xml",
31
+ "spec/mocks/invoice_item.xml",
32
+ "spec/spec.opts",
33
+ "spec/spec_helper.rb"
34
+ ]
35
+ s.homepage = %q{http://github.com/kieranj/saasu}
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = %q{1.3.7}
38
+ s.summary = %q{Ruby wrapper for the Saasu api}
39
+
40
+ if s.respond_to? :specification_version then
41
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
42
+ s.specification_version = 3
43
+
44
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
46
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
47
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
49
+ s.add_development_dependency(%q<rspec>, [">= 0"])
50
+ s.add_development_dependency(%q<yard>, [">= 0"])
51
+ else
52
+ s.add_dependency(%q<nokogiri>, [">= 0"])
53
+ s.add_dependency(%q<activesupport>, [">= 2.3.2"])
54
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
55
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
56
+ s.add_dependency(%q<rspec>, [">= 0"])
57
+ s.add_dependency(%q<yard>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<nokogiri>, [">= 0"])
61
+ s.add_dependency(%q<activesupport>, [">= 2.3.2"])
62
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
64
+ s.add_dependency(%q<rspec>, [">= 0"])
65
+ s.add_dependency(%q<yard>, [">= 0"])
66
+ end
67
+ end
68
+
data/spec/base_spec.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Saasu::Base" do
4
+
5
+ it "should set the default option for collection_name" do
6
+ Saasu::Invoice.defaults[:collection_name].should eql("invoiceListItem")
7
+ end
8
+
9
+ it "should set the default option for resource_name" do
10
+ Saasu::Invoice.defaults[:resource_name].should eql("invoice")
11
+ end
12
+
13
+ describe "fields" do
14
+
15
+ before do
16
+ file = open(File.join(File.dirname(__FILE__), "mocks", "invoice_item.xml"))
17
+ xml = Nokogiri::XML(file).css("invoiceListItem")
18
+ @invoice = Saasu::Invoice.new(xml)
19
+ end
20
+
21
+ it "should define accessors for all fields listed" do
22
+ @invoice.methods.should include("uid=")
23
+ @invoice.methods.should include("uid")
24
+ end
25
+
26
+ it "should cast any field listed as a decimal to a float" do
27
+ @invoice.amount_owed.should be_an_instance_of(Float)
28
+ end
29
+
30
+ it "should cast any field listed as a date to a date" do
31
+ @invoice.date.should be_an_instance_of(Date)
32
+ end
33
+
34
+ it "should cast any field listed as a integer to a integer" do
35
+ @invoice.uid.should be_an_instance_of(Fixnum)
36
+ end
37
+
38
+ describe "boolean fields" do
39
+
40
+ it "should cast any field listed as a boolean, with a value of true as true" do
41
+ @invoice.is_sent.should eql(true)
42
+ end
43
+
44
+ it "should cast any field listed as a boolean, with a value of false as false" do
45
+ @invoice.requires_follow_up.should eql(false)
46
+ end
47
+
48
+ end
49
+
50
+ it "should cast any field listed as a array to a array" do
51
+ @invoice.tags.should be_an_instance_of(Array)
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <invoiceResponse>
3
+ <invoice uid="5335574" lastUpdatedUid="AAAAAAM//Ic=">
4
+ <utcFirstCreated>2011-02-21T10:05:40</utcFirstCreated>
5
+ <utcLastModified>2011-02-22T09:20:01</utcLastModified>
6
+ <transactionType>S</transactionType>
7
+ <date>2011-02-21</date>
8
+ <contactUid>1098116</contactUid>
9
+ <ccy>GBP</ccy>
10
+ <autoPopulateFxRate>false</autoPopulateFxRate>
11
+ <fcToBcFxRate>1.0000000000</fcToBcFxRate>
12
+ <requiresFollowUp>false</requiresFollowUp>
13
+ <layout>S</layout>
14
+ <status>I</status>
15
+ <invoiceNumber>2</invoiceNumber>
16
+ <invoiceItems>
17
+ <serviceInvoiceItem>
18
+ <description>ghfj</description>
19
+ <accountUid>10</accountUid>
20
+ <totalAmountInclTax>100.0000</totalAmountInclTax>
21
+ </serviceInvoiceItem>
22
+ </invoiceItems>
23
+ <isSent>false</isSent>
24
+ </invoice>
25
+ </invoiceResponse>
@@ -0,0 +1,33 @@
1
+ <invoiceListItem>
2
+ <invoiceUid>5335574</invoiceUid>
3
+ <lastUpdatedUid>AAAAAAM//Ic=</lastUpdatedUid>
4
+ <ccy>GBP</ccy>
5
+ <autoPopulateFXRate>false</autoPopulateFXRate>
6
+ <fcToBcFxRate>1.0000000000</fcToBcFxRate>
7
+ <transactionType>S</transactionType>
8
+ <invoiceDate>2011-02-21</invoiceDate>
9
+ <utcFirstCreated>2011-02-21T10:05:40</utcFirstCreated>
10
+ <utcLastModified>2011-02-22T09:20:01</utcLastModified>
11
+ <summary/>
12
+ <invoiceNumber>2</invoiceNumber>
13
+ <purchaseOrderNumber/>
14
+ <dueDate/>
15
+ <totalAmountInclTax>100.0000</totalAmountInclTax>
16
+ <paymentCount>0</paymentCount>
17
+ <totalAmountPaid>0.0000</totalAmountPaid>
18
+ <amountOwed>100.0000</amountOwed>
19
+ <paidStatus>Unpaid</paidStatus>
20
+ <requiresFollowUp>False</requiresFollowUp>
21
+ <isSent>True</isSent>
22
+ <invoiceLayout>S</invoiceLayout>
23
+ <invoiceStatus>I</invoiceStatus>
24
+ <contactUid>1098116</contactUid>
25
+ <contactGivenName>tom</contactGivenName>
26
+ <contactFamilyName>jones</contactFamilyName>
27
+ <contactOrganisationName/>
28
+ <shipToContactUid/>
29
+ <shipToContactGivenName/>
30
+ <shipToContactLastName/>
31
+ <shipToContactOrganisation/>
32
+ <tags>urgent,important</tags>
33
+ </invoiceListItem>
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,3 @@
1
+ %w(rubygems rspec open-uri).each { |lib| require lib }
2
+
3
+ require File.dirname(__FILE__) + '/../lib/saasu'
metadata ADDED
@@ -0,0 +1,170 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: saasu
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Kieran Johnson
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-24 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ type: :runtime
23
+ prerelease: false
24
+ name: nokogiri
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ type: :runtime
37
+ prerelease: false
38
+ name: activesupport
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 7
45
+ segments:
46
+ - 2
47
+ - 3
48
+ - 2
49
+ version: 2.3.2
50
+ requirement: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ type: :development
53
+ prerelease: false
54
+ name: bundler
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 23
61
+ segments:
62
+ - 1
63
+ - 0
64
+ - 0
65
+ version: 1.0.0
66
+ requirement: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ type: :development
69
+ prerelease: false
70
+ name: jeweler
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 7
77
+ segments:
78
+ - 1
79
+ - 6
80
+ - 4
81
+ version: 1.6.4
82
+ requirement: *id004
83
+ - !ruby/object:Gem::Dependency
84
+ type: :development
85
+ prerelease: false
86
+ name: rspec
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ requirement: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ type: :development
99
+ prerelease: false
100
+ name: yard
101
+ version_requirements: &id006 !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
+ requirement: *id006
111
+ description: Ruby wrapper for the Saasu api
112
+ email: hello@invisiblelines.com
113
+ executables: []
114
+
115
+ extensions: []
116
+
117
+ extra_rdoc_files:
118
+ - LICENSE
119
+ - README.md
120
+ files:
121
+ - Gemfile
122
+ - LICENSE
123
+ - README.md
124
+ - Rakefile
125
+ - VERSION
126
+ - lib/saasu.rb
127
+ - lib/saasu/base.rb
128
+ - lib/saasu/invoice.rb
129
+ - saasu.gemspec
130
+ - spec/base_spec.rb
131
+ - spec/mocks/invoice.xml
132
+ - spec/mocks/invoice_item.xml
133
+ - spec/spec.opts
134
+ - spec/spec_helper.rb
135
+ has_rdoc: true
136
+ homepage: http://github.com/kieranj/saasu
137
+ licenses: []
138
+
139
+ post_install_message:
140
+ rdoc_options: []
141
+
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
162
+ requirements: []
163
+
164
+ rubyforge_project:
165
+ rubygems_version: 1.3.7
166
+ signing_key:
167
+ specification_version: 3
168
+ summary: Ruby wrapper for the Saasu api
169
+ test_files: []
170
+