kiik-api 0.1.6

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8e7ffc528b6f4d1485fa33fb1a22f594ee0d94e8
4
+ data.tar.gz: 1d792e7ae88496a52cb0278eee1328191e892f47
5
+ SHA512:
6
+ metadata.gz: b2975f6e9d5acecee753f6ccb2a7b87109e04ca4557cf25254298c4376c0342bca9b457617589d0ebaf72d840ac3b532b68689344b64d88fd614ec32012fe3ba
7
+ data.tar.gz: bc43f2109bffceeaeb26560dc14f3b43f8d0566562dfad4b83165e9ed3d75273d6b2d82a152995ec181c9f6edad99d4b527faabb3951f6608c24fe8580a5abda
@@ -0,0 +1,18 @@
1
+ Manifest
2
+ README.md
3
+ Rakefile
4
+ kiik-api.gemspec
5
+ lib/kiik-api.rb
6
+ lib/kiik/client.rb
7
+ lib/kiik/errors.rb
8
+ lib/kiik/logger.rb
9
+ lib/kiik/response.rb
10
+ lib/kiik/version.rb
11
+ lib/kiik/wallet.rb
12
+ lib/kiik/wallet/client.rb
13
+ lib/kiik/wallet/creditcard.rb
14
+ lib/kiik/wallet/transaction.rb
15
+ lib/kiik/wallet/user.rb
16
+ spec/lib/kiik/wallet_client_spec.rb
17
+ spec/lib/kiik/wallet_client_user_spec.rb
18
+ spec/spec_helper.rb
@@ -0,0 +1,25 @@
1
+ # KiiK - Mobile payments everywhere
2
+
3
+ ## Installation
4
+
5
+ If this gem actually talked to a service, you could use it in your Ruby
6
+ project. To do so, you would add this line to your application's Gemfile:
7
+
8
+ gem 'kiik-api'
9
+
10
+ And then execute:
11
+
12
+ $ bundle
13
+
14
+ Or install it yourself as:
15
+
16
+ $ gem install kiik-api
17
+
18
+ ## Usage
19
+
20
+ ```ruby
21
+ require 'kiik-api'
22
+
23
+ ```
24
+
25
+ Enjoy!
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ #!/usr/bin/env rake
3
+ require "bundler/gem_tasks"
4
+ require 'rake'
5
+
6
+ require 'rspec/core'
7
+ require 'rspec/core/rake_task'
8
+ RSpec::Core::RakeTask.new(:spec) do |spec|
9
+ spec.pattern = FileList['spec/**/*_spec.rb']
10
+ end
11
+
12
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
13
+ spec.pattern = 'specs/**/*_spec.rb'
14
+ spec.rcov = true
15
+ end
16
+
17
+ task :default => :spec
18
+
19
+ require 'rdoc/task'
20
+ Rake::RDocTask.new do |rdoc|
21
+ require File.expand_path('../lib/kiik/version', __FILE__)
22
+ rdoc.rdoc_dir = 'rdoc'
23
+ rdoc.title = "SanitizeEmail #{Kiik::VERSION}"
24
+ rdoc.options << '--line-numbers'
25
+ rdoc.rdoc_files.include('README*')
26
+ rdoc.rdoc_files.include('lib/**/*.rb')
27
+ end
28
+
29
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,62 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/kiik/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "kiik-api"
6
+ s.version = Kiik::VERSION
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+ s.authors = ["Bruno de Queiroz"]
10
+ s.date = "2012-12-24"
11
+ s.description = "A Gem for Kiik API"
12
+ s.email = "creativelikeadog@gmail.com"
13
+
14
+ s.files = `git ls-files`.split($\)
15
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
17
+
18
+ s.files = [
19
+ "Manifest",
20
+ "README.md",
21
+ "Rakefile",
22
+ "kiik-api.gemspec",
23
+ "lib/kiik-api.rb",
24
+ "lib/kiik/cacert.pem",
25
+ "lib/kiik/client.rb",
26
+ "lib/kiik/errors.rb",
27
+ "lib/kiik/logger.rb",
28
+ "lib/kiik/response.rb",
29
+ "lib/kiik/version.rb",
30
+ "lib/kiik/wallet.rb",
31
+ "lib/kiik/wallet/client.rb",
32
+ "lib/kiik/wallet/creditcard.rb",
33
+ "lib/kiik/wallet/transaction.rb",
34
+ "lib/kiik/wallet/user.rb",
35
+ "spec/lib/kiik/wallet_client_spec.rb",
36
+ "spec/lib/kiik/wallet_client_user_spec.rb",
37
+ "spec/spec_helper.rb"
38
+
39
+ ]
40
+ s.homepage = "http://github.com/creativelikeadog/kiik-api"
41
+ s.licenses = ["MIT"]
42
+ s.require_paths = ["lib"]
43
+ s.rubygems_version = Kiik::VERSION
44
+ s.summary = "A Gem for Kiik API"
45
+
46
+ s.add_dependency "activesupport", "~> 4.1"
47
+ s.add_dependency "hashie", "~> 3.3"
48
+ s.add_dependency "faraday", "~> 0.9"
49
+ s.add_dependency "json", "~> 1.8"
50
+ s.add_dependency "i18n", "~> 0.7"
51
+ s.add_dependency "rake", "~> 10.4"
52
+ s.add_dependency "bundler", "~> 1.0"
53
+ s.add_dependency "fakeweb", "~> 1.3"
54
+ s.add_dependency "rspec", "~> 3.0"
55
+ s.add_dependency "simplecov", "~> 0.9"
56
+ s.add_dependency "rdoc", "~> 4.0"
57
+ s.add_dependency "multi_json", "~> 1.3"
58
+ s.add_dependency "multi_xml", "~> 0.5"
59
+ s.add_dependency "rack", "~> 1.5"
60
+
61
+ end
62
+
@@ -0,0 +1,58 @@
1
+ require 'rubygems'
2
+ require 'yaml'
3
+ require 'faraday'
4
+ require 'json'
5
+ require 'hashie'
6
+ require 'uri'
7
+ require "base64"
8
+ require "openssl"
9
+ require 'multi_json'
10
+ require 'multi_xml'
11
+ require 'rack'
12
+
13
+ require 'kiik/errors'
14
+ require 'kiik/logger'
15
+ require 'kiik/client'
16
+ require 'kiik/response'
17
+ require 'kiik/wallet'
18
+ require 'kiik/wallet/client'
19
+ require 'kiik/wallet/user'
20
+ require 'kiik/wallet/creditcard'
21
+ require 'kiik/wallet/transaction'
22
+
23
+ module Kiik
24
+ # set a default
25
+
26
+ class << self
27
+ attr_accessor :config_path
28
+ end
29
+
30
+ def self.config
31
+ @config ||= load_config
32
+ end
33
+
34
+ def self.wallet
35
+ @wallet ||= Kiik::Wallet.new(config[:token],config[:wallet])
36
+ @wallet.api
37
+ end
38
+
39
+ def self.load_config
40
+
41
+ if @config_path.nil?
42
+ if defined?(Rails)
43
+ @config_path = Rails.root.join('config','kiik.yml')
44
+ else
45
+ @config_path = 'kiik.yml'
46
+ end
47
+ end
48
+
49
+ unless File.file?(config_path)
50
+ raise NotConfigured.new("The #{config_path} config file is missing.")
51
+ end
52
+
53
+ cfg = YAML.load_file(config_path)
54
+ raise NoAuthorizationTokenProvided.new("You will need a authorization token to perform request on kiik api") if cfg[:token].nil?
55
+ cfg
56
+ end
57
+
58
+ end
@@ -0,0 +1,98 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIE0DCCA7igAwIBAgIQMX4VqpV4+B1CYUZ+nMXuwjANBgkqhkiG9w0BAQUFADA8
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMuMRYwFAYDVQQDEw1U
4
+ aGF3dGUgU1NMIENBMB4XDTE0MDgyMTAwMDAwMFoXDTE1MTAyMDIzNTk1OVowgaEx
5
+ CzAJBgNVBAYTAkJSMRIwEAYDVQQIEwlTYW8gUGF1bG8xEjAQBgNVBAcUCVNhbyBQ
6
+ YXVsbzEvMC0GA1UEChQmSW5jdWJlIFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbyBF
7
+ SVJFTEkxITAfBgNVBAsUGFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbzEWMBQGA1UE
8
+ AxQNKi5raWlrLmNvbS5icjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
9
+ AN7vrfA7PN9oiZCDHJH5A2wkr+P655Dsvy7NcHvQUt89B8PELBhufeQYnoyVUB26
10
+ 3Vr02xBF8k93pM2Hn1W1Wq5Vxb1R25N1f5hIumkoyKy1TwFJ3Sy5XhPR/44IX6wA
11
+ yOP5KBVFtPnoZAKN1LjZvvJkcbHieR9w0kVYiUK0yYkfsyI+ez85tJcaVjfk5zzN
12
+ e13jpnKsDqeviwnaBxwjP3kMy9Zev3HaFFFAXTzdbKvqwHqVG293e8crjQM0LaKE
13
+ lCOmfFD7u8ZfQHSgacV3xIS3GYPijo2eiMMGRxY5agTZmjYqdcLE9KokqBgJn+E2
14
+ 3jZyexVpboLzwoEFD+j3SHkCAwEAAaOCAWYwggFiMBgGA1UdEQQRMA+CDSoua2lp
15
+ ay5jb20uYnIwCQYDVR0TBAIwADBlBgNVHSAEXjBcMFoGCmCGSAGG+EUBBzYwTDAj
16
+ BggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIw
17
+ GRYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwDgYDVR0PAQH/BAQDAgWgMB8GA1Ud
18
+ IwQYMBaAFKeig7s0RUA9/NUwTxK5PqEBn/bbMCsGA1UdHwQkMCIwIKAeoByGGmh0
19
+ dHA6Ly90Yi5zeW1jYi5jb20vdGIuY3JsMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
20
+ BgEFBQcDAjBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly90Yi5z
21
+ eW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly90Yi5zeW1jYi5jb20vdGIuY3J0
22
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCUqXfmwvQyJJ76tifv43KkeQ4nAVhDQvHs3sPy
23
+ CEHoMtB+JVvNV3SQWw+6uds2xtuh/YQYPe72txGH6bCsna1pONNBSm+S7eeYy0C3
24
+ mTKSgj3WFvfqkD6YXc5THNEQ6qmczTqh4CAIIvjFsbm79ajUcncJjPYteVvdQDwb
25
+ Pm7K1X3utQ1DCgmuxDyZRUKIt0+aGWqZTaGmeBeUchHCaGy+Dv/f/p7OpHhu7VD3
26
+ GlTUNBlYnueX9qR2jxkus3VmTQgrU2vLXdTHtIy8m/fsQfsohupAcljoWkg0Nluk
27
+ lV7IZHVs1XgMkSkulmfMsUPdEe16f2UBOdX5/D2XG1GxIM0V
28
+ -----END CERTIFICATE-----
29
+ -----BEGIN CERTIFICATE-----
30
+ MIIEbDCCA1SgAwIBAgIQTV8sNAiyTCDNbVB+JE3J7DANBgkqhkiG9w0BAQUFADCB
31
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
32
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
33
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
34
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTAwMjA4MDAwMDAwWhcNMjAw
35
+ MjA3MjM1OTU5WjA8MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMu
36
+ MRYwFAYDVQQDEw1UaGF3dGUgU1NMIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
37
+ MIIBCgKCAQEAmeSFW3ZJfS8F2MWsyMip09yY5tc0pi8M8iIm2KPJFEyPBaRF6BQM
38
+ WJAFGrfFwQalgK+7HUlrUjSIw1nn72vEJ0GMK2Yd0OCjl5gZNEtB1ZjVxwWtouTX
39
+ 7QytT8G1sCH9PlBTssSQ0NQwZ2ya8Q50xMLciuiX/8mSrgGKVgqYMrAAI+yQGmDD
40
+ 7bs6yw9jnw1EyVLhJZa/7VCViX9WFLG3YR0cB4w6LPf/gN45RdWvGtF42MdxaqMZ
41
+ pzJQIenyDqHGEwNESNFmqFJX1xG0k4vlmZ9d53hR5U32t1m0drUJN00GOBN6HAiY
42
+ XMRISstSoKn4sZ2Oe3mwIC88lqgRYke7EQIDAQABo4H7MIH4MDIGCCsGAQUFBwEB
43
+ BCYwJDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3AudGhhd3RlLmNvbTASBgNVHRMB
44
+ Af8ECDAGAQH/AgEAMDQGA1UdHwQtMCswKaAnoCWGI2h0dHA6Ly9jcmwudGhhd3Rl
45
+ LmNvbS9UaGF3dGVQQ0EuY3JsMA4GA1UdDwEB/wQEAwIBBjAoBgNVHREEITAfpB0w
46
+ GzEZMBcGA1UEAxMQVmVyaVNpZ25NUEtJLTItOTAdBgNVHQ4EFgQUp6KDuzRFQD38
47
+ 1TBPErk+oQGf9tswHwYDVR0jBBgwFoAUe1tFz6/Oy3r9MZIaarbzRutXSFAwDQYJ
48
+ KoZIhvcNAQEFBQADggEBAIAigOBsyJUW11cmh/NyNNvGclYnPtOW9i4lkaU+M5en
49
+ S+Uv+yV9Lwdh+m+DdExMU3IgpHrPUVFWgYiwbR82LMgrsYiZwf5Eq0hRfNjyRGQq
50
+ 2HGn+xov+RmNNLIjv8RMVR2OROiqXZrdn/0Dx7okQ40tR0Tb9tiYyLL52u/tKVxp
51
+ EvrRI5YPv5wN8nlFUzeaVi/oVxBw9u6JDEmJmsEj9cIqzEHPIqtlbreUgm0vQF9Y
52
+ 3uuVK6ZyaFIZkSqudZ1OkubK3lTqGKslPOZkpnkfJn1h7X3S5XFV2JMXfBQ4MDzf
53
+ huNMrUnjl1nOG5srztxl1Asoa06ERlFE9zMILViXIa4=
54
+ -----END CERTIFICATE-----
55
+ -----BEGIN CERTIFICATE-----
56
+ MIIERTCCA66gAwIBAgIQM2VQCHmtc+IwueAdDX+skTANBgkqhkiG9w0BAQUFADCB
57
+ zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
58
+ Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
59
+ CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh
60
+ d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
61
+ cnZlckB0aGF3dGUuY29tMB4XDTA2MTExNzAwMDAwMFoXDTIwMTIzMDIzNTk1OVow
62
+ gakxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwx0aGF3dGUsIEluYy4xKDAmBgNVBAsT
63
+ H0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xODA2BgNVBAsTLyhjKSAy
64
+ MDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYD
65
+ VQQDExZ0aGF3dGUgUHJpbWFyeSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
66
+ AQ8AMIIBCgKCAQEArKDw+4BZ1JzHpM+doVlzCRBFDA0sbmjxbFtIaElZN/wLMxnC
67
+ d3/MEC2VNBzm600JpxzSuMmXNgK3idQkXwbAzESUlI0CYm/rWt0RjSiaXISQEHoN
68
+ vXRmL2o4oOLVVETrHQefB7pv7un9Tgsp9T6EoAHxnKv4HH6JpOih2HFlDaNRe+68
69
+ 0iJgDblbnd+6/FFbC6+Ysuku6QToYofeK8jXTsFMZB7dz4dYukpPymgHHRydSsbV
70
+ L5HMfHFyHMXAZ+sy/cmSXJTahcCbv1N9Kwn0jJ2RH5dqUsveCTakd9h7h1BE1T5u
71
+ KWn7OUkmHgmlgHtALevoJ4XJ/mH9fuZ8lx3VnQIDAQABo4HCMIG/MA8GA1UdEwEB
72
+ /wQFMAMBAf8wOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHBz
73
+ Oi8vd3d3LnRoYXd0ZS5jb20vY3BzMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
74
+ e1tFz6/Oy3r9MZIaarbzRutXSFAwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cDovL2Ny
75
+ bC50aGF3dGUuY29tL1RoYXd0ZVByZW1pdW1TZXJ2ZXJDQS5jcmwwDQYJKoZIhvcN
76
+ AQEFBQADgYEAhKhMyT4qvJrizI8LsiV3xGGJiWNa1KMVQNT7Xj+0Q+pjFytrmXSe
77
+ Cajd1FYVLnp5MV9jllMbNNkV6k9tcMq+9oKp7dqFd8x2HGqBCiHYQZl/Xi6Cweiq
78
+ 95OBBaqStB+3msAHF/XLxrRMDtdW3HEgdDjWdMbWj2uvi42gbCkLYeA=
79
+ -----END CERTIFICATE-----
80
+ -----BEGIN CERTIFICATE-----
81
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
82
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
83
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
84
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
85
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
86
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
87
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
88
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
89
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
90
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
91
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
92
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
93
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
94
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
95
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
96
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
97
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
98
+ -----END CERTIFICATE-----
@@ -0,0 +1,79 @@
1
+ module Kiik
2
+
3
+ class Client
4
+
5
+ attr_reader :site
6
+ attr_accessor :token, :options
7
+
8
+ def initialize(token, options={}, &block)
9
+ opts = options.dup
10
+ @token = token
11
+ @site = opts.delete(:site)
12
+ ssl = opts.delete(:ssl)
13
+ @options = {:connection_opts => {},
14
+ :connection_build => block,
15
+ :max_redirects => 5,
16
+ :raise_errors => true}.merge(opts)
17
+ @options[:connection_opts][:ssl] = ssl if ssl
18
+ end
19
+
20
+ def site=(value)
21
+ @connection = nil
22
+ @site = value
23
+ end
24
+
25
+ # The Faraday connection object
26
+ def connection
27
+ @connection ||= begin
28
+ conn = Faraday.new(site, options[:connection_opts])
29
+ conn.build do |b|
30
+ options[:connection_build].call(b)
31
+ end if options[:connection_build]
32
+ conn
33
+ end
34
+ end
35
+
36
+ def authorization_header(params = {})
37
+ params.merge({ 'Authorization' => "Token token=#{token}" })
38
+ end
39
+
40
+ def request(verb, url, opts = {})
41
+ connection.response :logger, ::Logger.new($stdout) if ENV['OAUTH_DEBUG'] == 'true'
42
+
43
+ url = connection.build_url(url, opts[:params]).to_s
44
+
45
+ Kiik::Logger.info(url)
46
+
47
+ response = connection.run_request(verb, url, opts[:body], authorization_header(opts[:headers])) do |req|
48
+ yield(req) if block_given?
49
+ end
50
+ response = Response.new(response, :parse => opts[:parse])
51
+
52
+ case response.status
53
+ when 301, 302, 303, 307
54
+ opts[:redirect_count] ||= 0
55
+ opts[:redirect_count] += 1
56
+ return response if opts[:redirect_count] > options[:max_redirects]
57
+ if response.status == 303
58
+ verb = :get
59
+ opts.delete(:body)
60
+ end
61
+ request(verb, response.headers['location'], opts)
62
+ when 200..299, 300..399
63
+ # on non-redirecting 3xx statuses, just return the response
64
+ response
65
+ when 400..599
66
+ error = Error.new(response)
67
+ fail(error) if opts.fetch(:raise_errors, options[:raise_errors])
68
+ response.error = error
69
+ response
70
+ else
71
+ error = Error.new(response)
72
+ fail(error, "Unhandled status code value of #{response.status}")
73
+ end
74
+ end
75
+
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,38 @@
1
+ module Kiik
2
+
3
+ class NotConfigured < Exception
4
+ end
5
+
6
+ class NoAuthorizationTokenProvided < Exception
7
+ end
8
+
9
+ class TypeNotSupported < Exception
10
+ end
11
+
12
+ class MethodNotAllowedForType < Exception
13
+ end
14
+
15
+ class Error < StandardError
16
+ attr_reader :response, :code, :description
17
+
18
+ # standard error values include:
19
+ # :invalid_request, :invalid_client, :invalid_token, :invalid_grant, :unsupported_grant_type, :invalid_scope
20
+ def initialize(response)
21
+ response.error = self
22
+ @response = response
23
+
24
+ message = []
25
+
26
+ if response.parsed.is_a?(Hash)
27
+ @code = response.parsed['error']
28
+ @description = response.parsed['error_description']
29
+ message << "#{@code}: #{@description}"
30
+ end
31
+
32
+ message << response.body
33
+
34
+ super(message.join("\n"))
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,21 @@
1
+ module Kiik
2
+ class Logger
3
+ def self.info(msg)
4
+ puts "Kiik::INFO: #{msg}"
5
+ end
6
+
7
+ def self.warn(msg)
8
+ puts "Kiik::WARN: #{msg}"
9
+ end
10
+
11
+ def self.error(msg)
12
+ puts "Kiik::ERROR: #{msg}"
13
+ end
14
+
15
+ def self.inspect(msg)
16
+ puts "Kiik::INSPECT:"
17
+ p msg
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,85 @@
1
+ module Kiik
2
+ # OAuth2::Response class
3
+ class Response
4
+ attr_reader :response
5
+ attr_accessor :error, :options
6
+
7
+ # Adds a new content type parser.
8
+ #
9
+ # @param [Symbol] key A descriptive symbol key such as :json or :query.
10
+ # @param [Array] One or more mime types to which this parser applies.
11
+ # @yield [String] A block returning parsed content.
12
+ def self.register_parser(key, mime_types, &block)
13
+ key = key.to_sym
14
+ PARSERS[key] = block
15
+ Array(mime_types).each do |mime_type|
16
+ CONTENT_TYPES[mime_type] = key
17
+ end
18
+ end
19
+
20
+ # Initializes a Response instance
21
+ #
22
+ # @param [Faraday::Response] response The Faraday response instance
23
+ # @param [Hash] opts options in which to initialize the instance
24
+ # @option opts [Symbol] :parse (:automatic) how to parse the response body. one of :query (for x-www-form-urlencoded),
25
+ # :json, or :automatic (determined by Content-Type response header)
26
+ def initialize(response, opts = {})
27
+ @response = response
28
+ @options = {:parse => :automatic}.merge(opts)
29
+ end
30
+
31
+ # The HTTP response headers
32
+ def headers
33
+ response.headers
34
+ end
35
+
36
+ # The HTTP response status code
37
+ def status
38
+ response.status
39
+ end
40
+
41
+ # The HTTP response body
42
+ def body
43
+ response.body || ''
44
+ end
45
+
46
+ # Procs that, when called, will parse a response body according
47
+ # to the specified format.
48
+ PARSERS = {
49
+ :json => lambda { |body| MultiJson.load(body) rescue body }, # rubocop:disable RescueModifier
50
+ :query => lambda { |body| Rack::Utils.parse_query(body) },
51
+ :text => lambda { |body| body },
52
+ }
53
+
54
+ # Content type assignments for various potential HTTP content types.
55
+ CONTENT_TYPES = {
56
+ 'application/json' => :json,
57
+ 'text/javascript' => :json,
58
+ 'application/x-www-form-urlencoded' => :query,
59
+ 'text/plain' => :text,
60
+ }
61
+
62
+ # The parsed response body.
63
+ # Will attempt to parse application/x-www-form-urlencoded and
64
+ # application/json Content-Type response bodies
65
+ def parsed
66
+ return nil unless PARSERS.key?(parser)
67
+ @parsed ||= PARSERS[parser].call(body)
68
+ end
69
+
70
+ # Attempts to determine the content type of the response.
71
+ def content_type
72
+ ((response.headers.values_at('content-type', 'Content-Type').compact.first || '').split(';').first || '').strip
73
+ end
74
+
75
+ # Determines the parser that will be used to supply the content of #parsed
76
+ def parser
77
+ return options[:parse].to_sym if PARSERS.key?(options[:parse])
78
+ CONTENT_TYPES[content_type]
79
+ end
80
+ end
81
+ end
82
+
83
+ Kiik::Response.register_parser(:xml, ['text/xml', 'application/rss+xml', 'application/rdf+xml', 'application/atom+xml']) do |body|
84
+ MultiXml.parse(body) rescue body # rubocop:disable RescueModifier
85
+ end
@@ -0,0 +1,3 @@
1
+ module Kiik
2
+ VERSION = "0.1.6"
3
+ end
@@ -0,0 +1,39 @@
1
+ module Kiik
2
+
3
+ class Wallet
4
+ attr_reader :token, :site, :version
5
+ attr_accessor :logger, :options
6
+
7
+ def initialize(token,options={})
8
+ @site = 'https://wallet.kiik.com.br'
9
+ @version = 'v1'
10
+ @token = token
11
+ @ca_file = options.delete(:ca_file) || default_ca_file
12
+ @logger = options.delete(:logger) || Kiik::Logger
13
+ @options = options
14
+ return true
15
+ end
16
+
17
+ def client
18
+ @client ||= Kiik::Client.new(token,:site => { :url => site },:ssl => client_ssl_options)
19
+ end
20
+
21
+ def api
22
+ @api ||= Kiik::Wallet::Client.new(self,options)
23
+ end
24
+
25
+ private
26
+ def rest_client_ssl_options
27
+ { :ssl_ca_file => @ca_file, :verify_ssl => OpenSSL::SSL::VERIFY_PEER }
28
+ end
29
+
30
+ def client_ssl_options
31
+ { :ca_file => @ca_file, :verify => OpenSSL::SSL::VERIFY_PEER }
32
+ end
33
+
34
+ def default_ca_file
35
+ File.join(File.dirname(__FILE__), 'cacert.pem')
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,122 @@
1
+ module Kiik
2
+ class Wallet
3
+ class Client
4
+
5
+ ALLOWED_TYPES = {
6
+ :client => [ :create, :detail ],
7
+ :user => [ :create ],
8
+ :creditcard => [ :create, :detail ],
9
+ :transaction => [ :create ]
10
+ }
11
+
12
+ attr_reader :name, :id, :secret, :access_token, :email
13
+
14
+ def initialize(wallet,options)
15
+ @id = options[:api_id]
16
+ @name = options[:name]
17
+ @email = options[:email]
18
+ @secret = options[:api_secret]
19
+ @access_token = options[:access_token]
20
+ @wallet = wallet
21
+ @base_uri = '/clients/#{id}'
22
+ end
23
+
24
+ def token
25
+ @wallet.token
26
+ end
27
+
28
+ def client
29
+ @wallet.client
30
+ end
31
+
32
+ def use_token(new_token,&block)
33
+ @wallet.client.token = new_token
34
+ block.call(self)
35
+ @wallet.client.token = @wallet.token
36
+ end
37
+
38
+ def detail(type,options={},&block)
39
+ allow(type,:detail)
40
+
41
+ case type
42
+ when :client
43
+ request(:get, base_uri,{}, &block)
44
+ when :creditcard
45
+ token = options.delete(:token)
46
+ card.detail(token,options,&block)
47
+ end
48
+
49
+ end
50
+
51
+ def list(type,options={},&block)
52
+ allow(type,:list)
53
+
54
+ case type
55
+ when :creditcard
56
+ token = options.delete(:token)
57
+ card.list(token,&block)
58
+ end
59
+
60
+ end
61
+
62
+ def set_secret(secret,&block)
63
+ request(:put, base_uri, { :client => { :api_secret => secret } },&block)
64
+ end
65
+
66
+ def create(type, options={},&block)
67
+ allow(type,:create)
68
+
69
+ token = options.delete(:token)
70
+ case type
71
+ when :user
72
+ user.create(options,&block)
73
+ when :creditcard
74
+ card.create(token,options,&block)
75
+ when :transaction
76
+ transaction.create(token,options.delete(:credit_card),options,&block)
77
+ end
78
+ end
79
+
80
+ def user
81
+ @user ||= Kiik::Wallet::User.new(self)
82
+ end
83
+
84
+ def card
85
+ @card ||= Kiik::Wallet::Creditcard.new(self)
86
+ end
87
+
88
+ def transaction
89
+ @transaction ||= Kiik::Wallet::Transaction.new(self)
90
+ end
91
+
92
+ def request(verb, uri, params = {}, &block)
93
+ response = @wallet.client.request(verb, "/#{@wallet.version}#{uri}", request_params(params))
94
+
95
+ if block_given?
96
+ yield(response.parsed)
97
+ else
98
+ response.parsed
99
+ end
100
+ end
101
+
102
+ private
103
+ def allow(type,method)
104
+ raise TypeNotSupported.new("The #{type} is not supported by this api") if !ALLOWED_TYPES.include?(type)
105
+ raise MethodNotAllowedForType.new("This type: #{type} don't allow this method.") if !ALLOWED_TYPES[type].include?(method)
106
+ end
107
+
108
+ def request_params(params={})
109
+ p = {
110
+ :params => {},
111
+ :body => params.to_json,
112
+ :headers => {
113
+ 'Accept' => 'application/json',
114
+ 'Content-type' => 'application/json'
115
+ }
116
+ }
117
+ p
118
+ end
119
+
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,43 @@
1
+ module Kiik
2
+ class Wallet
3
+ class Creditcard
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ @base_uri = '/cards'
8
+ end
9
+
10
+ def create(token,options={},&block)
11
+ params = {
12
+ :card => {
13
+ :name => options[:name],
14
+ :number => options[:number],
15
+ :expiration_month => options[:expiration_month],
16
+ :expiration_year => options[:expiration_year]
17
+ }
18
+ }
19
+
20
+ request(token,:post,@base_uri,params,&block)
21
+ end
22
+
23
+ def list(token,&block)
24
+ request(token,:get,@base_uri,{},&block)
25
+ end
26
+
27
+ def get(token,id,&block)
28
+ request(token,:get,"#{@base_uri}/#{id}",{},&block)
29
+ end
30
+
31
+ def detail(token,id,&block)
32
+ request(token,:get,"#{@base_uri}/#{id}/details",{},&block)
33
+ end
34
+
35
+ private
36
+ def request(token,verb,url,params,&block)
37
+ proc = Proc.new { |client| client.request(verb,url,params,&block) }
38
+ @client.use_token(token, &proc)
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,38 @@
1
+ module Kiik
2
+ class Wallet
3
+ class Transaction
4
+
5
+ def initialize(client)
6
+ @client = client
7
+ @base_uri = '/transactions/card'
8
+ end
9
+
10
+ def create(token,card,options={},&block)
11
+ params = {
12
+ :card => {
13
+ :credit_card_token => card[:token],
14
+ :cvv => card[:cvv]
15
+ },
16
+ :transaction => {
17
+ :recipient => options[:recipient],
18
+ :amount => options[:amount],
19
+ :order_number => options[:order_number]
20
+ }
21
+ }
22
+
23
+ request(token,:post,@base_uri,params,&block)
24
+ end
25
+
26
+ def callback(token,params={},&block)
27
+ request(token,:put,'/payment/callback',params,&block)
28
+ end
29
+
30
+ private
31
+ def request(token,verb,url,params,&block)
32
+ proc = Proc.new { |client| client.request(verb,url,params,&block) }
33
+ @client.use_token(token, &proc)
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,82 @@
1
+ module Kiik
2
+ class Wallet
3
+ class User
4
+
5
+ attr_reader :token
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ @base_uri = '/users'
10
+ @card = Kiik::Wallet::Creditcard.new(client)
11
+ end
12
+
13
+ def create(options={},&block)
14
+ params = {
15
+ :user => {
16
+ :email => options[:email],
17
+ :password => options[:password],
18
+ :external_id => options[:id]
19
+ }
20
+ }
21
+ @client.request(:post,@base_uri,request_params(params),&block)
22
+ end
23
+
24
+ def update(options={},&block)
25
+ params = {
26
+ :user => {
27
+ :email => options[:email],
28
+ :password => options[:password],
29
+ :new_password => options[:new_password]
30
+ }
31
+ }
32
+ @client.request(:put,"#{@base_uri}/#{options[:id]}",request_params(params),&block)
33
+ end
34
+
35
+ def set_password(options={},&block)
36
+ params = {
37
+ :user => {
38
+ :email => options[:email],
39
+ :password => options[:password],
40
+ :new_password => options[:new_password]
41
+ }
42
+ }
43
+ @client.request(:put,"#{@base_uri}/#{options[:id]}",request_params(params),&block)
44
+ end
45
+
46
+ def login(options={},&block)
47
+ params = {
48
+ :auth => {
49
+ :external_id => options[:id],
50
+ :password => options[:password]
51
+ }
52
+ }
53
+ @client.request(:post, '/auth/login', params ) do |response|
54
+ @token = response["token"]
55
+ block.call(response)
56
+ end
57
+ end
58
+
59
+ def regenerate_token(options={},&block)
60
+ params = {
61
+ :auth => {
62
+ :external_id => options[:id],
63
+ :password => options[:password]
64
+ }
65
+ }
66
+ @client.request(:post, '/auth/regenerate_token', params ) do |response|
67
+ @token = response["token"]
68
+ block.call(response)
69
+ end
70
+ end
71
+
72
+ def create_creditcard(options={},&block)
73
+ @card.create(options,&block)
74
+ end
75
+
76
+ private
77
+ def request_params(params={})
78
+ params.merge({ :client => { :api_id => @client.id } })
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,6 @@
1
+ :token: "098f6bcd4621d373cade4e832627b4f6"
2
+ :wallet:
3
+ :name: "Wallet Application"
4
+ :api_id: "WALT"
5
+ :api_secret: "b5i32od62d5hadxvopcgsdmipv2g8b"
6
+ :email: "no-reply@wallet.com.br"
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+
3
+ describe Kiik do
4
+
5
+
6
+ context 'initialization' do
7
+
8
+ before(:each) do
9
+ Kiik.config_path = 'spec/fixtures/kiik.yml'
10
+ end
11
+
12
+ it 'should set the token' do
13
+ expect(Kiik.config[:token]).to eq("098f6bcd4621d373cade4e832627b4f6")
14
+ end
15
+
16
+ it 'should set the wallet object' do
17
+ expect(Kiik.config[:wallet]).not_to be_empty
18
+ end
19
+
20
+ end
21
+
22
+ describe Kiik::Wallet do
23
+
24
+ context "initialization" do
25
+ let(:wallet) { Kiik.wallet }
26
+
27
+ it 'should set the token' do
28
+ expect(wallet.token).to eq("098f6bcd4621d373cade4e832627b4f6")
29
+ end
30
+
31
+ it 'should set the app_id' do
32
+ expect(wallet.id).to eq("WALT")
33
+ end
34
+
35
+ it 'should set the app_secret' do
36
+ expect(wallet.secret).to eq("b5i32od62d5hadxvopcgsdmipv2g8b")
37
+ end
38
+
39
+ it 'should use token in header' do
40
+ proc = Proc.new { |wallet| expect(wallet.client.authorization_header({})['Authorization']).to eq('Token token=abcde') }
41
+ wallet.use_token('abcde',&proc)
42
+ end
43
+
44
+ it 'should use default token' do
45
+ expect(wallet.client.authorization_header({})['Authorization']).to eq('Token token=098f6bcd4621d373cade4e832627b4f6')
46
+ end
47
+
48
+
49
+
50
+ end
51
+
52
+ end
53
+
54
+
55
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Kiik do
4
+
5
+ before(:each) do
6
+ Kiik.config_path = 'spec/fixtures/kiik.yml'
7
+ end
8
+
9
+ describe Kiik::Wallet::Client do
10
+
11
+ let(:wallet) { Kiik.wallet }
12
+
13
+ context "initialization" do
14
+
15
+ it 'should set the user api ' do
16
+ expect(wallet.user).not_to be_nil
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+
24
+ end
@@ -0,0 +1,26 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ require 'kiik-api'
9
+ begin
10
+ require 'redgreen'
11
+ rescue LoadError
12
+ # redgreen is for pretty spec result colors on Windows... no biggie.
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.run_all_when_everything_filtered = true
17
+ config.filter_run :focus
18
+
19
+ # Run specs in random order to surface order dependencies. If you find an
20
+ # order dependency and want to debug it, you can fix the order by providing
21
+ # the seed, which is printed after each run.
22
+ # --seed 1234
23
+ config.order = 'random'
24
+ end
25
+
26
+
metadata ADDED
@@ -0,0 +1,263 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kiik-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
5
+ platform: ruby
6
+ authors:
7
+ - Bruno de Queiroz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2012-12-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.8'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: i18n
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: fakeweb
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.9'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.9'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rdoc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '4.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '4.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: multi_json
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.3'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.3'
181
+ - !ruby/object:Gem::Dependency
182
+ name: multi_xml
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '0.5'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '0.5'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rack
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.5'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.5'
209
+ description: A Gem for Kiik API
210
+ email: creativelikeadog@gmail.com
211
+ executables: []
212
+ extensions: []
213
+ extra_rdoc_files: []
214
+ files:
215
+ - Manifest
216
+ - README.md
217
+ - Rakefile
218
+ - kiik-api.gemspec
219
+ - lib/kiik-api.rb
220
+ - lib/kiik/cacert.pem
221
+ - lib/kiik/client.rb
222
+ - lib/kiik/errors.rb
223
+ - lib/kiik/logger.rb
224
+ - lib/kiik/response.rb
225
+ - lib/kiik/version.rb
226
+ - lib/kiik/wallet.rb
227
+ - lib/kiik/wallet/client.rb
228
+ - lib/kiik/wallet/creditcard.rb
229
+ - lib/kiik/wallet/transaction.rb
230
+ - lib/kiik/wallet/user.rb
231
+ - spec/fixtures/kiik.yml
232
+ - spec/lib/kiik/wallet_client_spec.rb
233
+ - spec/lib/kiik/wallet_client_user_spec.rb
234
+ - spec/spec_helper.rb
235
+ homepage: http://github.com/creativelikeadog/kiik-api
236
+ licenses:
237
+ - MIT
238
+ metadata: {}
239
+ post_install_message:
240
+ rdoc_options: []
241
+ require_paths:
242
+ - lib
243
+ required_ruby_version: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - ">="
246
+ - !ruby/object:Gem::Version
247
+ version: '0'
248
+ required_rubygems_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ requirements: []
254
+ rubyforge_project:
255
+ rubygems_version: 2.2.2
256
+ signing_key:
257
+ specification_version: 4
258
+ summary: A Gem for Kiik API
259
+ test_files:
260
+ - spec/fixtures/kiik.yml
261
+ - spec/lib/kiik/wallet_client_spec.rb
262
+ - spec/lib/kiik/wallet_client_user_spec.rb
263
+ - spec/spec_helper.rb