smartcoin 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 66d59c05f21dabf328880f362f1bfc4059372360
4
+ data.tar.gz: 29f7744e88763a98804d659803ded56ba5e2827a
5
+ SHA512:
6
+ metadata.gz: b472a18ae5b0e4143d5d3f4aca62daa359af8bb795a293434ebf00c013d54117fa5394d6406eaf0bb9d1fd4cced4368045ca3c5732ea72082ac16083e733339f
7
+ data.tar.gz: 47e35143187753c56e0c6ce3c5e5a2bc2a2a7e506fcb4997138a6c825246c411572ab1a95eba470f9333d030451ce6760727546916e3e3398170e58c315e2109
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ .idea
24
+ .DS_Store
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ smartcoin
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in smartcoin.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 agranado
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Smartcoin
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'smartcoin'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install smartcoin
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/[my-github-username]/smartcoin/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,124 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFcDCCBFigAwIBAgIQFX0aCi5Q4U49WvE0lmY3wTANBgkqhkiG9w0BAQsFADCB
3
+ kDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
4
+ A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxNjA0BgNV
5
+ BAMTLUNPTU9ETyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
6
+ QTAeFw0xNDA3MzEwMDAwMDBaFw0xNTA3MzEyMzU5NTlaMF0xITAfBgNVBAsTGERv
7
+ bWFpbiBDb250cm9sIFZhbGlkYXRlZDEUMBIGA1UECxMLUG9zaXRpdmVTU0wxIjAg
8
+ BgNVBAMTGXNoaXBwaW5nLnNtYXJ0Y29pbi5jb20uYnIwggEiMA0GCSqGSIb3DQEB
9
+ AQUAA4IBDwAwggEKAoIBAQDCmogffUtvofENdxfrhoc2+ek0tb0ZYKtW8UNUGleQ
10
+ hBhej0tRl8jO4mEdEnRhgQW8A2fDeh6dQEQvExGGv/GBKaGVSMyJqKE9y/a2fwDu
11
+ pbGQIy2DjPedaTsu0nEzh/GqNrICfcnbCL1f6dWE5opX7K1km9vC8KlsKSN2WBjY
12
+ Xzi/3sGrVW4b4+Yg3fZ1TmTXOV5EppM4EEY2QSIAIaUQPwVLO7C20BJewerANHw9
13
+ eVpNKtml7B/L7jZLWgbe7DuQCcOCJbQejza3NhJKbt8AxuMEq3WMYLbNwqrLt1aL
14
+ IR00ldCaMRbIr9RauivUaILX/zg4GmyOJy34itnJ15p/AgMBAAGjggH2MIIB8jAf
15
+ BgNVHSMEGDAWgBSQr2o6lFoL2JDqElZz30O0Oija5zAdBgNVHQ4EFgQUvdZKglfM
16
+ MXCj1G0FOkjPp3U4ezMwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYD
17
+ VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMFAGA1UdIARJMEcwOwYMKwYBBAGy
18
+ MQECAQMEMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQv
19
+ Q1BTMAgGBmeBDAECATBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vY3JsLmNvbW9k
20
+ b2NhLmNvbS9DT01PRE9SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0Eu
21
+ Y3JsMIGFBggrBgEFBQcBAQR5MHcwTwYIKwYBBQUHMAKGQ2h0dHA6Ly9jcnQuY29t
22
+ b2RvY2EuY29tL0NPTU9ET1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJD
23
+ QS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTBDBgNV
24
+ HREEPDA6ghlzaGlwcGluZy5zbWFydGNvaW4uY29tLmJygh13d3cuc2hpcHBpbmcu
25
+ c21hcnRjb2luLmNvbS5icjANBgkqhkiG9w0BAQsFAAOCAQEAYXyDnV1jRZiHZdBg
26
+ UTh0+mp/lMiwhKhFNtB9JaGq/dLn+deScep0spPdXXEGYdda+aA5KJLVSVbUp0bW
27
+ 9Uf6n4FfTKxPjyGpl1r2whEgWAexwX2BTpsquI3AkmHWBlg6v2EwD5Nv9ajWHWp5
28
+ ksPOm32RafpTgUmxElxLRKf7TgzJFpPXeBqqaSnBeS8jxAgdba9X5kNoF4UlFHRZ
29
+ ekRzworWatrvIamTmPtInKw9DRa7BceOX/agimRIJK8PQ/Kek06q/63y8xAJE8MF
30
+ fjb0/hwVwlA3QKFwTRDoJJ4kjgVgoMzP5t0uP62++NYAEbzbMbvnt7+H577Gzth1
31
+ a2+ZJw==
32
+ -----END CERTIFICATE-----
33
+ -----BEGIN CERTIFICATE-----
34
+ MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB
35
+ hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
36
+ A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
37
+ BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy
38
+ MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
39
+ EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
40
+ Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh
41
+ bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
42
+ ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh
43
+ bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0
44
+ Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6
45
+ ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51
46
+ UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n
47
+ c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY
48
+ MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz
49
+ 30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV
50
+ HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG
51
+ BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv
52
+ bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB
53
+ AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E
54
+ T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v
55
+ ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p
56
+ mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/
57
+ e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps
58
+ P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY
59
+ dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc
60
+ 2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG
61
+ V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4
62
+ HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX
63
+ j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII
64
+ 0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap
65
+ lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf
66
+ +AZxAeKCINT+b72x
67
+ -----END CERTIFICATE-----
68
+ -----BEGIN CERTIFICATE-----
69
+ MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
70
+ MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
71
+ ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
72
+ eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
73
+ gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
74
+ BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
75
+ VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
76
+ hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
77
+ AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
78
+ 2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
79
+ ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
80
+ 4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
81
+ m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/
82
+ vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
83
+ 8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
84
+ IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
85
+ KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
86
+ GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/
87
+ s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
88
+ JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
89
+ AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
90
+ MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
91
+ bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
92
+ Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
93
+ zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
94
+ Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
95
+ Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
96
+ B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
97
+ PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
98
+ pu/xO28QOG8=
99
+ -----END CERTIFICATE-----
100
+ -----BEGIN CERTIFICATE-----
101
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
102
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
103
+ IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
104
+ MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
105
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
106
+ bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
107
+ dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
108
+ H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
109
+ uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
110
+ mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
111
+ a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
112
+ E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
113
+ WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
114
+ VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
115
+ Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
116
+ cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
117
+ IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
118
+ AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
119
+ YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
120
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
121
+ Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
122
+ c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
123
+ mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
124
+ -----END CERTIFICATE-----
@@ -0,0 +1,123 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFYjCCBEqgAwIBAgIRAO+sE5M7vA8jPspOyn/yzuEwDQYJKoZIhvcNAQELBQAw
3
+ gZAxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
4
+ BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTYwNAYD
5
+ VQQDEy1DT01PRE8gUlNBIERvbWFpbiBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIg
6
+ Q0EwHhcNMTQwNDE3MDAwMDAwWhcNMTUwNDE3MjM1OTU5WjBYMSEwHwYDVQQLExhE
7
+ b21haW4gQ29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAsTC1Bvc2l0aXZlU1NMMR0w
8
+ GwYDVQQDExRhcGkuc21hcnRjb2luLmNvbS5icjCCASIwDQYJKoZIhvcNAQEBBQAD
9
+ ggEPADCCAQoCggEBAME+8aOOMP74BK4OvGisk2iYEBSGkTqMEFtXVR0esZMMl21d
10
+ SEjnkXYXKS27TkjhYop0lSPKeWDEIgz8OHsYEwpqAQf00GzlNFk8e4aXdNML1tg7
11
+ vBTMkiZuEIvjKlS+9Ooi8DmS3SyjPvoDsTXFSXYSVGw1/09XyqIv/lNskKCRNBh8
12
+ 6AqCLPO/6twO1P08KAfBCFffNQVj1CNK8tCn1p0j4e48JH93I7p6DgrFnVohLy9o
13
+ M1KKhMkwQHcFqX+msk9Ywl0E1uOSKSqp4ygWW27A3yLDZDjzc+flzWa4BLx386JZ
14
+ qL6W/MSLYViKOiGH2BCiulU5dXovH/4s4xWVhR0CAwEAAaOCAewwggHoMB8GA1Ud
15
+ IwQYMBaAFJCvajqUWgvYkOoSVnPfQ7Q6KNrnMB0GA1UdDgQWBBR3H33JCrV5KlBK
16
+ lLnKZaQGFs5YsTAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUE
17
+ FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwUAYDVR0gBEkwRzA7BgwrBgEEAbIxAQIB
18
+ AwQwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMw
19
+ CAYGZ4EMAQIBMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwuY29tb2RvY2Eu
20
+ Y29tL0NPTU9ET1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmww
21
+ gYUGCCsGAQUFBwEBBHkwdzBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5jb21vZG9j
22
+ YS5jb20vQ09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNy
23
+ dDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMDkGA1UdEQQy
24
+ MDCCFGFwaS5zbWFydGNvaW4uY29tLmJyghh3d3cuYXBpLnNtYXJ0Y29pbi5jb20u
25
+ YnIwDQYJKoZIhvcNAQELBQADggEBAEhxHWUI6MqFqghQsmW/jjKqtgR9Z6HQMONH
26
+ 3ZK5LLmnW6kasTqBgwS/aarJDMaPZZ8KFanikQSV2dbFk/37VnyAqobhTjTs7Gso
27
+ Q01kx5HSuwtcfSP/zdC3X1OHG6D5Vj2h9iBNv1XF7OQvJzSu4UpOpWMdrOk/78WK
28
+ Af2Tyo+sqc3FLrm3gJpakY5BFNdC1Jm4wmk+MyADGa2wjPeSCSKKmDogI5GCKscV
29
+ 1CRB4EFbeAyJ63U1vZIZBhhVZddEmZ93Wp5gDTgyLj58r4s9OwSRoRGSGJ1MdvYL
30
+ Ve5okdg7uRjbGt453wQ7L7LFnQBbbG/5lUsofopapkjwStbHyrg=
31
+ -----END CERTIFICATE-----
32
+ -----BEGIN CERTIFICATE-----
33
+ MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB
34
+ hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
35
+ A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
36
+ BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy
37
+ MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
38
+ EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
39
+ Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh
40
+ bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
41
+ ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh
42
+ bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0
43
+ Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6
44
+ ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51
45
+ UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n
46
+ c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY
47
+ MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz
48
+ 30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV
49
+ HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG
50
+ BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv
51
+ bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB
52
+ AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E
53
+ T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v
54
+ ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p
55
+ mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/
56
+ e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps
57
+ P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY
58
+ dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc
59
+ 2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG
60
+ V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4
61
+ HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX
62
+ j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII
63
+ 0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap
64
+ lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf
65
+ +AZxAeKCINT+b72x
66
+ -----END CERTIFICATE-----
67
+ -----BEGIN CERTIFICATE-----
68
+ MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
69
+ MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
70
+ ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
71
+ eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
72
+ gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
73
+ BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
74
+ VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
75
+ hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
76
+ AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
77
+ 2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
78
+ ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
79
+ 4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
80
+ m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/
81
+ vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
82
+ 8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
83
+ IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
84
+ KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
85
+ GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/
86
+ s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
87
+ JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
88
+ AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
89
+ MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
90
+ bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
91
+ Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
92
+ zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
93
+ Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
94
+ Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
95
+ B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
96
+ PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
97
+ pu/xO28QOG8=
98
+ -----END CERTIFICATE-----
99
+ -----BEGIN CERTIFICATE-----
100
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
101
+ MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
102
+ IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
103
+ MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
104
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
105
+ bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
106
+ dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
107
+ H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
108
+ uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
109
+ mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
110
+ a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
111
+ E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
112
+ WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
113
+ VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
114
+ Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
115
+ cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
116
+ IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
117
+ AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
118
+ YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
119
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
120
+ Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
121
+ c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
122
+ mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
123
+ -----END CERTIFICATE-----
@@ -0,0 +1,16 @@
1
+ module SmartCoin
2
+ module ApiOperations
3
+ module Create
4
+ def create(params)
5
+ url = get_url
6
+ method = :post
7
+ response = api_request(url,method,params)
8
+ create_from(response)
9
+ end
10
+
11
+ def self.included(base)
12
+ base.extend(Create)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module SmartCoin
2
+ module ApiOperations
3
+ module List
4
+ def list_all(params)
5
+ url = get_url
6
+ method = :get
7
+ response = api_request(url, method, params)
8
+ create_from(response)
9
+ end
10
+
11
+ def self.included(base)
12
+ base.extend(List)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module SmartCoin
2
+ module ApiOperations
3
+ module Retrieve
4
+ def retrieve(charge_id)
5
+ url = get_url
6
+ method = :get
7
+ response = api_request("#{url}/#{charge_id}",method)
8
+ create_from(response)
9
+ end
10
+
11
+ def self.included(base)
12
+ base.extend(Retrieve)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ module SmartCoin
2
+ module ApiOperations
3
+ module Update
4
+ def update(smartcoin_object_id, url_sufix, params=nil)
5
+ url = "#{self.class.get_url()}/#{smartcoin_object_id}#{url_sufix}"
6
+ method = :post
7
+ response = api_request(url,method,params)
8
+ reflesh_object(response)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,56 @@
1
+ module SmartCoin
2
+ module ApiResource
3
+ BASE_URL = 'https://api.smartcoin.com.br'
4
+ SSL_BUNDLE_PATH = File.dirname(__FILE__) + '/../data/ssl-bundle.crt'
5
+
6
+ def url_encode(key)
7
+ URI.escape(key.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
8
+ end
9
+
10
+ def encode(params)
11
+ params.map { |k,v| "#{k}=#{url_encode(v)}" }.join('&')
12
+ end
13
+
14
+ def api_request(url, method, params=nil)
15
+ url = "#{BASE_URL}#{url}"
16
+ if method == :get && params
17
+ params_encoded = encode(params)
18
+ url = "#{url}?#{params_encoded}"
19
+ params = nil
20
+ end
21
+
22
+ access_keys = SmartCoin.access_keys.split(':')
23
+ api_key = access_keys[0]
24
+ api_secret = access_keys[1]
25
+ begin
26
+ response = RestClient::Request.new(
27
+ method: method,
28
+ url: url,
29
+ user: api_key,
30
+ password: api_secret,
31
+ payload: params,
32
+ headers: { accept: :json,
33
+ content_type: :json },
34
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER,
35
+ ssl_ca_file: SSL_BUNDLE_PATH
36
+ ).execute
37
+ rescue RestClient::ExceptionWithResponse => e
38
+ if rcode = e.http_code and rbody = e.http_body
39
+ rbody = JSON.parse(rbody)
40
+ rbody = Util.symbolize_names(rbody)
41
+
42
+ raise SmartCoinError.new(rcode, rbody, rbody[:error], rbody[:error][:message])
43
+ else
44
+ raise e
45
+ end
46
+ rescue RestClient::Exception => e
47
+ raise e
48
+ end
49
+ JSON.parse(response.to_str)
50
+ end
51
+
52
+ def self.included(base)
53
+ base.extend(ApiResource)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,4 @@
1
+ module SmartCoin
2
+ class Card < SmartCoinObject
3
+ end
4
+ end
@@ -0,0 +1,21 @@
1
+ module SmartCoin
2
+ class Charge < SmartCoinObject
3
+ include ApiResource
4
+ include ApiOperations::Create
5
+ include ApiOperations::Retrieve
6
+ include ApiOperations::Update
7
+ include ApiOperations::List
8
+
9
+ def capture(amount=nil)
10
+ url_sufix = '/capture'
11
+ params = {amount: amount} if amount
12
+ update(self.id, url_sufix, params)
13
+ end
14
+
15
+ def refund(amount=nil)
16
+ url_sufix = '/refund'
17
+ params = {amount: amount} if amount
18
+ update(self.id, url_sufix, params)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module SmartCoin
2
+ class SmartCoinError < StandardError
3
+ attr_reader :http_status, :json_message, :http_message, :message
4
+
5
+ def initialize(http_status=nil, json_message=nil, http_message=nil, message=nil)
6
+ @http_status = http_status
7
+ @json_message = json_message
8
+ @http_message = http_message
9
+ @message = message
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ module SmartCoin
2
+ class Fee < SmartCoinObject
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SmartCoin
2
+ class Installment < SmartCoinObject
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module SmartCoin
2
+ class Refund < SmartCoinObject
3
+ end
4
+ end
@@ -0,0 +1,35 @@
1
+ module SmartCoin
2
+ class Shipping
3
+ BASE_SHIPPING_URL = 'https://shipping.smartcoin.com.br'
4
+ SSL_BUNDLE_PATH = File.dirname(__FILE__) + '/../data/shipping-ssl-bundle.crt'
5
+
6
+ def self.calculator(params)
7
+ method = :get
8
+ url = BASE_SHIPPING_URL + '/shipping_calculator/'
9
+
10
+ begin
11
+ response = RestClient::Request.new(
12
+ method: method,
13
+ url: url,
14
+ payload: params,
15
+ headers: { accept: :json,
16
+ content_type: :json },
17
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER,
18
+ ssl_ca_file: SSL_BUNDLE_PATH
19
+ ).execute
20
+ rescue RestClient::ExceptionWithResponse => e
21
+ if rcode = e.http_code and rbody = e.http_body
22
+ rbody = JSON.parse(rbody)
23
+ rbody = Util.symbolize_names(rbody)
24
+
25
+ raise SmartCoinError.new(rcode, rbody, rbody[:error], rbody[:error][:message])
26
+ else
27
+ raise e
28
+ end
29
+ rescue RestClient::Exception => e
30
+ raise e
31
+ end
32
+ JSON.parse(response.to_str).inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,85 @@
1
+ module SmartCoin
2
+ class SmartCoinObject
3
+ @values
4
+ def metaclass
5
+ class << self; self; end
6
+ end
7
+
8
+ def self.create_from(params)
9
+ obj = self.new
10
+ obj.reflesh_object(params)
11
+ end
12
+
13
+ def reflesh_object(params)
14
+ create_fields(params)
15
+ set_properties(params)
16
+ self
17
+ end
18
+
19
+ def create_fields(params)
20
+ instance_eval do
21
+ metaclass.instance_eval do
22
+ params.keys.each do |key|
23
+ define_method(key) { @values[key] }
24
+
25
+ define_method("#{key}=") do |value|
26
+ @values[key] = value
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def set_properties(params)
34
+ instance_eval do
35
+ params.each do |key, value|
36
+ if value.class == Hash
37
+ @values[key] = Util.get_object_type(value['object']).create_from(value)
38
+ elsif value.class == Array
39
+ @values[key] = value.map{ |v| Util.get_object_type(v['object']).create_from(v) }
40
+ else
41
+ @values[key] = value
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.get_url
48
+ "/v1/#{CGI.escape(class_name.downcase)}s"
49
+ end
50
+
51
+ def self.class_name
52
+ self.name.split('::')[-1]
53
+ end
54
+
55
+ def initialize()
56
+ @values = {}
57
+ end
58
+
59
+ def to_hash
60
+ @values.inject({}) do |result, (key,value)|
61
+ if value.is_a? Array
62
+ list = []
63
+ value.each do |obj|
64
+ list.push(obj.respond_to?(:to_hash) ? obj.to_hash : value)
65
+ end
66
+ result[key] = list
67
+ else if value.respond_to?(:to_hash)
68
+ result[key] = value.to_hash
69
+ else
70
+ result[key] = value
71
+ end
72
+ end
73
+ result
74
+ end
75
+ end
76
+
77
+ def to_json(*a)
78
+ JSON.generate(@values)
79
+ end
80
+
81
+ def to_s
82
+ JSON.generate(@values)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ module SmartCoin
2
+ class Token < SmartCoinObject
3
+ include ApiResource
4
+
5
+ include ApiOperations::Create
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ module SmartCoin
2
+ class Util
3
+ OBJECT_TYPES = {
4
+ 'card' => SmartCoin::Card,
5
+ 'charge' => SmartCoin::Charge,
6
+ 'refund' => SmartCoin::Refund,
7
+ 'fee' => SmartCoin::Fee,
8
+ 'installment' => SmartCoin::Installment,
9
+ 'Token' => SmartCoin::Token,
10
+ }
11
+
12
+ def self.get_object_type(type)
13
+ object_type = SmartCoin::SmartCoinObject
14
+ object_type = OBJECT_TYPES[type] if OBJECT_TYPES[type]
15
+ object_type
16
+ end
17
+
18
+ def self.symbolize_names(object)
19
+ case object
20
+ when Hash
21
+ new = {}
22
+ object.each do |key, value|
23
+ key = (key.to_sym rescue key) || key
24
+ new[key] = symbolize_names(value)
25
+ end
26
+ new
27
+ when Array
28
+ object.map { |value| symbolize_names(value) }
29
+ else
30
+ object
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Smartcoin
2
+ VERSION = "0.2.3"
3
+ end
data/lib/smartcoin.rb ADDED
@@ -0,0 +1,36 @@
1
+ require "rest-client"
2
+ require "json"
3
+
4
+ require "smartcoin/version"
5
+ require "smartcoin/smart_coin_object"
6
+ require "smartcoin/api_resource"
7
+ require "smartcoin/api_operations/create"
8
+ require "smartcoin/api_operations/retrieve"
9
+ require "smartcoin/api_operations/update"
10
+ require "smartcoin/api_operations/list"
11
+ require "smartcoin/card"
12
+ require "smartcoin/token"
13
+ require "smartcoin/refund"
14
+ require "smartcoin/fee"
15
+ require "smartcoin/installment"
16
+ require "smartcoin/charge"
17
+ require "smartcoin/util"
18
+ require "smartcoin/errors/smart_coin_error"
19
+ require "smartcoin/shipping"
20
+
21
+ module SmartCoin
22
+ @@api_key = ''
23
+ @@api_secret = ''
24
+
25
+ def self.api_key(api_key)
26
+ @@api_key = api_key
27
+ end
28
+
29
+ def self.api_secret(api_secret)
30
+ @@api_secret = api_secret
31
+ end
32
+
33
+ def self.access_keys
34
+ "#{@@api_key}:#{@@api_secret}"
35
+ end
36
+ end
data/smartcoin.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'smartcoin/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "smartcoin"
8
+ spec.version = Smartcoin::VERSION
9
+ spec.authors = ["Arthur Granado"]
10
+ spec.email = ["agranado@smartcoin.com.br"]
11
+ spec.summary = %q{Ruby bind to SmartCoin API}
12
+ spec.description = %q{Ruby library to SmartCoin API - https://smartcoin.com.br}
13
+ spec.homepage = "https://smartcoin.com.br"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "rest-client", "~> 1.6.7"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec", "~> 2.14.0"
26
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require_relative '../lib/smartcoin'
@@ -0,0 +1,52 @@
1
+ require_relative '../rspec_helper'
2
+
3
+ describe SmartCoin::ApiResource do
4
+ before(:each) do
5
+ SmartCoin.api_key('pk_test_3ac0794848c339')
6
+ end
7
+
8
+ it 'call SmartCoin API' do
9
+ url = "/v1/tokens"
10
+ method = :post
11
+
12
+ params = {number: 4242424242424242,
13
+ exp_month: 11,
14
+ exp_year: 2017,
15
+ cvc: 111,
16
+ name: 'Arthur Granado'
17
+ }
18
+ response = SmartCoin::Token.api_request(url, method, params)
19
+ expect(response['id']).to match(/tok_(.*)/)
20
+ expect(response['object']).to eq('token')
21
+ expect(response['card']['last4']).to eq('4242')
22
+ expect(response['card']['exp_month']).to eq(11)
23
+ expect(response['card']['exp_year']).to eq(2017)
24
+ expect(response['card']['name']).to eq('Arthur Granado')
25
+ end
26
+
27
+ it 'should throw error' do
28
+ url = "/v1/tokens"
29
+ method = :post
30
+
31
+ params = {exp_month: 11,
32
+ exp_year: 2017,
33
+ cvc: 111,
34
+ name: 'Arthur Granado'
35
+ }
36
+
37
+ expect{ SmartCoin::Token.api_request(url, method, params) }.to raise_error SmartCoin::SmartCoinError
38
+
39
+ end
40
+
41
+ it 'should create SmartCoinError with error message and http code' do
42
+ http_code = 400
43
+ json_message = {error: {type: '', message: ''}}
44
+ http_message = ''
45
+ message = ''
46
+ smartcoin_error = SmartCoin::SmartCoinError.new(http_code, json_message, http_message, message)
47
+ expect(smartcoin_error.http_status).to eq(http_code)
48
+ expect(smartcoin_error.json_message).to eq(json_message)
49
+ expect(smartcoin_error.http_message).to eq(http_message)
50
+ expect(smartcoin_error.message).to eq(message)
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../rspec_helper'
2
+
3
+ describe SmartCoin::Card do
4
+
5
+ it 'should create a card object from hash' do
6
+ card_json = {
7
+ id: "card_23437598768758814",
8
+ object: "card",
9
+ last4: "4242",
10
+ type: "Visa",
11
+ exp_month: 11,
12
+ exp_year: 2017,
13
+ fingerprint: "8535531490d032bf2268c1b4e708655c0287e07017ea19ae79e704c831b27fa6",
14
+ country: "BR",
15
+ name: "Arthur Granado",
16
+ address_line1: nil,
17
+ address_line2: nil,
18
+ address_city: nil,
19
+ address_state: nil,
20
+ address_cep: nil,
21
+ address_country: nil
22
+ }
23
+
24
+ card = SmartCoin::Card.create_from(card_json)
25
+ expect(card.id).to eq(card_json[:id])
26
+ expect(card.object).to eq(card_json[:object])
27
+ expect(card.last4).to eq(card_json[:last4])
28
+ expect(card.exp_month).to eq(card_json[:exp_month])
29
+ expect(card.exp_year).to eq(card_json[:exp_year])
30
+ expect(card.fingerprint).to eq(card_json[:fingerprint])
31
+ expect(card.name).to eq(card_json[:name])
32
+ end
33
+ end
@@ -0,0 +1,172 @@
1
+ require 'rspec'
2
+
3
+ describe SmartCoin::Charge do
4
+ before(:each) do
5
+ SmartCoin.api_key('pk_test_3ac0794848c339')
6
+ SmartCoin.api_secret('sk_test_8bec997b7a0ea1')
7
+ end
8
+
9
+ it 'should create a charge' do
10
+ token_params = {number: 4242424242424242,
11
+ exp_month: 11,
12
+ exp_year: 2017,
13
+ cvc: '111',
14
+ name: 'Arthur Granado'
15
+ }
16
+ token = SmartCoin::Token.create(token_params)
17
+ charge_params = {
18
+ amount: 1000,
19
+ currency: 'brl',
20
+ card: token.id,
21
+ }
22
+
23
+ charge = SmartCoin::Charge.create(charge_params)
24
+ expect(charge.id).to match(/ch_(.*)/)
25
+ expect(charge.amount).to eq(charge_params[:amount])
26
+ expect(charge.paid).to be_true
27
+ expect(charge.captured).to be_true
28
+ expect(charge.card.id).to match(/card_(.*)/)
29
+ expect(charge.card.type).to eq('Visa')
30
+ expect(charge.fees).to have_at_least(2).items
31
+ expect(charge.fees.first.type).to eq('SmartCoin fee: flat')
32
+ expect(charge.fees.first.class).to eq(SmartCoin::Fee)
33
+ expect(charge.installments).to have_at_least(1).item
34
+ expect(charge.installments.first.class).to eq(SmartCoin::Installment)
35
+ end
36
+
37
+ it 'should create a bank_slip charge types' do
38
+ charge_params = {amount: 1000, currency: 'brl', type: 'bank_slip'}
39
+ charge = SmartCoin::Charge.create(charge_params)
40
+ expect(charge.id).to match(/ch_(.*)/)
41
+ expect(charge.amount).to eq(charge_params[:amount])
42
+ expect(charge.paid).to be_false
43
+ expect(charge.card).to be_nil
44
+ expect(charge.bank_slip).to_not be_nil
45
+ expect(charge.bank_slip.link).to match(/https:\/\/api\.smartcoin\.com\.br\/v1\/charges\/ch_(.*)\/bank_slip\/test/)
46
+ end
47
+
48
+ it 'should retrieve a charge that has already created' do
49
+ token_params = {number: 4242424242424242,
50
+ exp_month: 11,
51
+ exp_year: 2017,
52
+ cvc: '111',
53
+ name: 'Arthur Granado'
54
+ }
55
+ token = SmartCoin::Token.create(token_params)
56
+ charge_params = {
57
+ amount: 1000,
58
+ currency: 'brl',
59
+ card: token.id,
60
+ }
61
+
62
+ charge_created = SmartCoin::Charge.create(charge_params)
63
+ charge_retrieved = SmartCoin::Charge.retrieve(charge_created.id)
64
+ expect(charge_retrieved.id).to eq(charge_created.id)
65
+ expect(charge_retrieved.amount).to eq(charge_created.amount)
66
+ expect(charge_retrieved.card.fingerprint).to eq(charge_created.card.fingerprint)
67
+ end
68
+
69
+ it 'should capture charge that has already created' do
70
+ token_params = {number: 4242424242424242,
71
+ exp_month: 11,
72
+ exp_year: 2017,
73
+ cvc: '111',
74
+ name: 'Arthur Granado'
75
+ }
76
+ token = SmartCoin::Token.create(token_params)
77
+ charge_params = {
78
+ amount: 1000,
79
+ currency: 'brl',
80
+ card: token.id,
81
+ capture: false
82
+ }
83
+
84
+ charge_created = SmartCoin::Charge.create(charge_params)
85
+ expect(charge_created.captured).to be_false
86
+ charge_created.capture()
87
+ expect(charge_created.captured).to be_true
88
+ end
89
+
90
+ it 'should partial capture charge that has already created' do
91
+ token_params = {number: 4242424242424242,
92
+ exp_month: 11,
93
+ exp_year: 2017,
94
+ cvc: '111',
95
+ name: 'Arthur Granado'
96
+ }
97
+ token = SmartCoin::Token.create(token_params)
98
+ charge_params = {
99
+ amount: 1000,
100
+ currency: 'brl',
101
+ card: token.id,
102
+ capture: false
103
+ }
104
+
105
+ charge_created = SmartCoin::Charge.create(charge_params)
106
+ expect(charge_created.captured).to be_false
107
+ amount_captured = 300
108
+ charge_created.capture(amount_captured)
109
+ expect(charge_created.captured).to be_true
110
+ expect(charge_created.amount).to eq(charge_params[:amount])
111
+ expect(charge_created.amount_refunded).to eq(charge_params[:amount] - amount_captured)
112
+ end
113
+
114
+ it 'should refund charge that has already created' do
115
+ token_params = {number: 4242424242424242,
116
+ exp_month: 11,
117
+ exp_year: 2017,
118
+ cvc: '111',
119
+ name: 'Arthur Granado'
120
+ }
121
+ token = SmartCoin::Token.create(token_params)
122
+ charge_params = {
123
+ amount: 1000,
124
+ currency: 'brl',
125
+ card: token.id
126
+ }
127
+
128
+ charge_created = SmartCoin::Charge.create(charge_params)
129
+ expect(charge_created.refunded).to be_false
130
+
131
+ charge_created.refund()
132
+ expect(charge_created.refunded).to be_true
133
+ expect(charge_created.amount).to eq(charge_params[:amount])
134
+ expect(charge_created.amount_refunded).to eq(charge_params[:amount])
135
+ expect(charge_created.refunds).to have(1).item
136
+ end
137
+
138
+ it 'should partial refund charge that has already created' do
139
+ token_params = {number: 4242424242424242,
140
+ exp_month: 11,
141
+ exp_year: 2017,
142
+ cvc: '111',
143
+ name: 'Arthur Granado'
144
+ }
145
+ token = SmartCoin::Token.create(token_params)
146
+ charge_params = {
147
+ amount: 1000,
148
+ currency: 'brl',
149
+ card: token.id
150
+ }
151
+
152
+ charge_created = SmartCoin::Charge.create(charge_params)
153
+ expect(charge_created.refunded).to be_false
154
+
155
+ amount_refunded = 600
156
+ charge_created.refund(amount_refunded)
157
+ expect(charge_created.refunded).to be_false
158
+ expect(charge_created.amount).to eq(charge_params[:amount])
159
+ expect(charge_created.amount_refunded).to eq(amount_refunded)
160
+ expect(charge_created.refunds).to have(1).item
161
+ expect(charge_created.refunds[0].amount).to eq(amount_refunded)
162
+ end
163
+
164
+ it 'should list charges that have already created' do
165
+ params = {count: 3}
166
+ charge_list = SmartCoin::Charge.list_all(params)
167
+ expect(charge_list.object).to eq('list')
168
+ expect(charge_list.count).to eq(3)
169
+ expect(charge_list.data).to have(3).items
170
+ expect(charge_list.data[0].class).to eq(SmartCoin::Charge)
171
+ end
172
+ end
@@ -0,0 +1,24 @@
1
+ require 'rspec'
2
+
3
+ describe SmartCoin::Shipping do
4
+
5
+ it 'should calculate a shipping cost (destination_cep 36.600-000)' do
6
+ weight = 0.2 # Kg
7
+ origin_cep = 22280100 #RJ - Rio de Janeiro - Botafogo
8
+ destination_cep = 36600000 #MG - Bicas
9
+ expect_shipping_cost = 1650 #the current value that correios charge for PAC service without deal
10
+
11
+ shipping_info = SmartCoin::Shipping.calculator(weight: weight, origin_cep: origin_cep, destination_cep: destination_cep)
12
+ expect(shipping_info[:amount]).to eq(expect_shipping_cost)
13
+ end
14
+
15
+ it 'should calculate a shipping cost with different destination_cep (24.230-153)' do
16
+ weight = 0.2 # Kg
17
+ origin_cep = 22280100 #RJ - Rio de Janeiro - Botafogo
18
+ destination_cep = 24230153 #RJ - Niterói - Icaraí
19
+ expect_shipping_cost = 1370 #the current value that correios charge for PAC service without deal
20
+
21
+ shipping_info = SmartCoin::Shipping.calculator(weight: weight, origin_cep: origin_cep, destination_cep: destination_cep)
22
+ expect(shipping_info[:amount]).to eq(expect_shipping_cost)
23
+ end
24
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../rspec_helper'
2
+
3
+ describe SmartCoin do
4
+
5
+ it 'should set api key' do
6
+ SmartCoin.api_key('pk_test_1234')
7
+ SmartCoin.api_secret('')
8
+ expect(SmartCoin.access_keys).to eq('pk_test_1234:')
9
+ end
10
+
11
+ it 'should set api secret' do
12
+ SmartCoin.api_key('')
13
+ SmartCoin.api_secret('sk_test_1234')
14
+ expect(SmartCoin.access_keys).to eq(':sk_test_1234')
15
+ end
16
+
17
+ it 'should get empty access keys' do
18
+ SmartCoin.api_key('')
19
+ SmartCoin.api_secret('')
20
+ expect(SmartCoin.access_keys).to eq(":")
21
+ end
22
+
23
+ describe SmartCoin::SmartCoinObject do
24
+ it 'should convert to hash' do
25
+ params_2 = {a: 1, b: 'b'}
26
+ params = {a: 'a', b: 'b', c: 1, d: SmartCoin::SmartCoinObject.create_from(params_2), e:[a: 'a', b: 1, c: SmartCoin::SmartCoinObject.create_from(params_2)]}
27
+ obj = SmartCoin::SmartCoinObject.create_from(params)
28
+ expect(obj.to_hash).to eq(params.merge({d: params_2, e: [a: 'a', b: 1, c: params_2]}))
29
+ end
30
+
31
+ it 'should convert to json' do
32
+ params_2 = {a: 1, b: 'b'}
33
+ params = {a: 'a', b: 'b', c: 1, d: SmartCoin::SmartCoinObject.create_from(params_2), e:[a: 'a', b: 1, c: SmartCoin::SmartCoinObject.create_from(params_2)]}
34
+ obj = SmartCoin::SmartCoinObject.create_from(params)
35
+ expect(obj.to_json).to eq(params.to_json)
36
+ end
37
+
38
+ it 'should convert to stirng' do
39
+ params_2 = {a: 1, b: 'b'}
40
+ params = {a: 'a', b: 'b', c: 1, d: SmartCoin::SmartCoinObject.create_from(params_2), e:[a: 'a', b: 1, c: SmartCoin::SmartCoinObject.create_from(params_2)]}
41
+ obj = SmartCoin::SmartCoinObject.create_from(params)
42
+ expect(obj.to_s).to eq(params.to_json.to_s)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../rspec_helper'
2
+
3
+ describe SmartCoin::Token do
4
+
5
+ it 'should call API to create a Token' do
6
+ SmartCoin.api_key('pk_test_3ac0794848c339')
7
+ token_params = {number: 4242424242424242,
8
+ exp_month: 11,
9
+ exp_year: 2017,
10
+ cvc: '111',
11
+ name: 'Arthur Granado'
12
+ }
13
+
14
+ token = SmartCoin::Token.create(token_params)
15
+ expect(token.id).to match(/tok_(.)/)
16
+ expect(token.object).to eq('token')
17
+ expect(token.card.exp_month).to eq(11)
18
+ expect(token.card.exp_year).to eq(2017)
19
+ expect(token.card.name).to eq('Arthur Granado')
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smartcoin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
5
+ platform: ruby
6
+ authors:
7
+ - Arthur Granado
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.14.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.14.0
69
+ description: Ruby library to SmartCoin API - https://smartcoin.com.br
70
+ email:
71
+ - agranado@smartcoin.com.br
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".ruby-gemset"
78
+ - ".ruby-version"
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - lib/data/shipping-ssl-bundle.crt
84
+ - lib/data/ssl-bundle.crt
85
+ - lib/smartcoin.rb
86
+ - lib/smartcoin/api_operations/create.rb
87
+ - lib/smartcoin/api_operations/list.rb
88
+ - lib/smartcoin/api_operations/retrieve.rb
89
+ - lib/smartcoin/api_operations/update.rb
90
+ - lib/smartcoin/api_resource.rb
91
+ - lib/smartcoin/card.rb
92
+ - lib/smartcoin/charge.rb
93
+ - lib/smartcoin/errors/smart_coin_error.rb
94
+ - lib/smartcoin/fee.rb
95
+ - lib/smartcoin/installment.rb
96
+ - lib/smartcoin/refund.rb
97
+ - lib/smartcoin/shipping.rb
98
+ - lib/smartcoin/smart_coin_object.rb
99
+ - lib/smartcoin/token.rb
100
+ - lib/smartcoin/util.rb
101
+ - lib/smartcoin/version.rb
102
+ - smartcoin.gemspec
103
+ - test/rspec_helper.rb
104
+ - test/smartcoin/api_resource_spec.rb
105
+ - test/smartcoin/card_spec.rb
106
+ - test/smartcoin/charge_spec.rb
107
+ - test/smartcoin/shipping_calculator_spec.rb
108
+ - test/smartcoin/smart_coin_spec.rb
109
+ - test/smartcoin/token_spec.rb
110
+ homepage: https://smartcoin.com.br
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.2.2
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Ruby bind to SmartCoin API
134
+ test_files:
135
+ - test/rspec_helper.rb
136
+ - test/smartcoin/api_resource_spec.rb
137
+ - test/smartcoin/card_spec.rb
138
+ - test/smartcoin/charge_spec.rb
139
+ - test/smartcoin/shipping_calculator_spec.rb
140
+ - test/smartcoin/smart_coin_spec.rb
141
+ - test/smartcoin/token_spec.rb