vcx-elements 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.markdown +57 -0
- data/Rakefile +9 -0
- data/gem-create.gemspec +19 -0
- data/lib/elements.rb +358 -0
- data/lib/rubygems/commands/create_command.rb +178 -0
- data/lib/rubygems/create/builder.rb +63 -0
- data/lib/rubygems/create/templates/Gemfile +3 -0
- data/lib/rubygems/create/templates/LICENSE.erb +21 -0
- data/lib/rubygems/create/templates/README.markdown.erb +20 -0
- data/lib/rubygems/create/templates/Rakefile +11 -0
- data/lib/rubygems/create/templates/gem_name.gemspec.erb +28 -0
- data/lib/rubygems/create/templates/lib/gem_name/version.rb.erb +3 -0
- data/lib/rubygems/create/templates/lib/gem_name.rb.erb +1 -0
- data/lib/rubygems/create/templates/spec/gem_name_spec.rb.erb +5 -0
- data/lib/rubygems/create/templates/spec/spec_helper.rb.erb +8 -0
- data/lib/rubygems_plugin.rb +3 -0
- data/spec/create_command_spec.rb +76 -0
- data/spec/minitest/gem_command_test_case.rb +73 -0
- data/spec/spec_helper.rb +4 -0
- metadata +100 -0
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2012 Joshua Priddle <jpriddle@me.com>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person ob-
|
4
|
+
taining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without restric-
|
6
|
+
tion, including without limitation the rights to use, copy, modi-
|
7
|
+
fy, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
the Software, and to permit persons to whom the Software is fur-
|
9
|
+
nished to do so, subject to 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
|
16
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONIN-
|
17
|
+
FRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
19
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Gem::Create [![Gem::Create Build Status][Build Icon]][Build Status]
|
2
|
+
|
3
|
+
> This is my gem template. There are many like it, but this one is mine.
|
4
|
+
|
5
|
+
Gem::Create provides a `gem create` command which can be used to generate a
|
6
|
+
skeleton for a new RubyGem.
|
7
|
+
|
8
|
+
[Build Icon]: https://secure.travis-ci.org/itspriddle/gem-create.png?branch=master
|
9
|
+
[Build Status]: http://travis-ci.org/itspriddle/gem-create
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Usage: gem create GEM_NAME [options]
|
14
|
+
|
15
|
+
Options:
|
16
|
+
--force Overwrite existing files
|
17
|
+
--git GIT_PATH The path to git
|
18
|
+
--author AUTHOR The author name used in gemspec
|
19
|
+
--github-name NAME The Github account that will own the gem
|
20
|
+
--email EMAIL The author's email address used in gemspec
|
21
|
+
--template-directory DIR A custom template directory to use
|
22
|
+
|
23
|
+
|
24
|
+
Common Options:
|
25
|
+
-h, --help Get help on this command
|
26
|
+
-V, --[no-]verbose Set the verbose level of output
|
27
|
+
-q, --quiet Silence commands
|
28
|
+
--config-file FILE Use this config file instead of default
|
29
|
+
--backtrace Show stack backtrace on errors
|
30
|
+
--debug Turn on Ruby debugging
|
31
|
+
|
32
|
+
|
33
|
+
Summary:
|
34
|
+
Creates a new RubyGem skeleton
|
35
|
+
|
36
|
+
## Development
|
37
|
+
|
38
|
+
Gem::Create depends on rake and minitest for testing.
|
39
|
+
|
40
|
+
git clone git://github.com/itspriddle/gem-create
|
41
|
+
cd gem-create
|
42
|
+
bundle install
|
43
|
+
bundle exec rake spec
|
44
|
+
|
45
|
+
## Note on Patches/Pull Requests
|
46
|
+
|
47
|
+
* Fork the project.
|
48
|
+
* Make your feature addition or bug fix.
|
49
|
+
* Add tests for it. This is important so I don't break it in a future version
|
50
|
+
unintentionally.
|
51
|
+
* Commit, do not bump version. (If you want to have your own version, that is
|
52
|
+
fine but bump version in a commit by itself I can ignore when I pull).
|
53
|
+
* Send me a pull request. Bonus points for topic branches.
|
54
|
+
|
55
|
+
## Copyright
|
56
|
+
|
57
|
+
Copyright (c) 2012 Joshua Priddle. See LICENSE for details.
|
data/Rakefile
ADDED
data/gem-create.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.unshift 'lib'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.name = "vcx-elements"
|
6
|
+
s.version = "0.2.0"
|
7
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
8
|
+
s.homepage = "https://github.com/livegamervcxdevteam/elementsapi.git"
|
9
|
+
s.authors = ["livegamer"]
|
10
|
+
s.email = "todd@livegamer.com"
|
11
|
+
s.summary = "Elements Api"
|
12
|
+
s.description= " Elements Api"
|
13
|
+
s.files = %w[ Gemfile Rakefile README.markdown gem-create.gemspec LICENSE ]
|
14
|
+
s.files += Dir['lib/**/*']
|
15
|
+
s.test_files = Dir['spec/**/*']
|
16
|
+
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'minitest'
|
19
|
+
end
|
data/lib/elements.rb
ADDED
@@ -0,0 +1,358 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'xmlsimple'
|
3
|
+
#Elements module provides a list of all the interfaces for making calls to Elements
|
4
|
+
module Elements
|
5
|
+
DEFAULTURL = "https://vcxdev.tfelements.com/tfel2rs/v2/"
|
6
|
+
V1URL = "https://vcxdev.tfelements.com/starterkit/v1/"
|
7
|
+
|
8
|
+
#Api class defaults to the V2 of the elements API
|
9
|
+
class Api
|
10
|
+
public
|
11
|
+
@url = DEFAULTURL
|
12
|
+
@store_id = 3190
|
13
|
+
|
14
|
+
#Add_user is a class method of Api class that provides adding users to elements
|
15
|
+
def self.add_user(user)
|
16
|
+
params = {
|
17
|
+
name: user.email.gsub('@','_'),
|
18
|
+
emailaddress: user.email,
|
19
|
+
namespaceId: '0'
|
20
|
+
#gender: user.gender,
|
21
|
+
#dateOfBirth: user.dob.strftime("%m/%d/%Y")
|
22
|
+
}
|
23
|
+
response = post_data 'user', params
|
24
|
+
result = XmlSimple.xml_in(response)
|
25
|
+
user.update_column(:elements_id, result['id'])
|
26
|
+
end
|
27
|
+
|
28
|
+
#Find_user is a class method of Api class that provides finding users that are added in elements
|
29
|
+
def self.find_user(user)
|
30
|
+
get_data "user/#{user.elements_id}"
|
31
|
+
end
|
32
|
+
|
33
|
+
#Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies
|
34
|
+
#input: eg. 'AMS', 'AMG'
|
35
|
+
#output: xml with attributes eg. exchangeRate="0.011"
|
36
|
+
def self.find_forex_offer_by_id(forex_offer_id)
|
37
|
+
params = {'id' => forex_offer_id }
|
38
|
+
get_data("forexOffer/#{forex_offer_id}", params)
|
39
|
+
end
|
40
|
+
|
41
|
+
#Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies
|
42
|
+
#input: eg. 'AMS', 'AMG'
|
43
|
+
#output: xml with attributes eg. exchangeRate="0.011"
|
44
|
+
def self.find_forex_offer_by_currency(from_currency, to_currency)
|
45
|
+
params = {'fromCurrencyName' => from_currency, 'toCurrencyName' => to_currency }
|
46
|
+
get_data("forexOffers", params)
|
47
|
+
end
|
48
|
+
|
49
|
+
#Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies
|
50
|
+
#input: eg. exchange_rate
|
51
|
+
#output: xml with attributes eg. exchangeRate="0.011"
|
52
|
+
def self.find_active_forex_offer(exchange_rate)
|
53
|
+
params = {'fromCurrencyName' => exchange_rate.from_currency.vcx_name, 'toCurrencyName' => exchange_rate.to_currency.vcx_name, 'statuses' => 'ACTIVE' }
|
54
|
+
get_data("forexOffers", params)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.find_or_create_forex_offer(exchange_rate, ipaddress)
|
59
|
+
response = XmlSimple.xml_in find_active_forex_offer(exchange_rate)
|
60
|
+
if(!response.nil? and !response['forexOffer'].nil?)
|
61
|
+
response['forexOffer'].each do |forex_offer|
|
62
|
+
if(forex_offer['externalKey'] == exchange_rate.id.to_s and forex_offer['status']== "ACTIVE") then
|
63
|
+
return forex_offer["id"]
|
64
|
+
else
|
65
|
+
cancel_forex_offer(forex_offer["id"], ipaddress)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
add_forex_offer(exchange_rate)
|
70
|
+
#TODO Header info needs to be captured for optimization
|
71
|
+
find_or_create_forex_offer(exchange_rate, ipaddress)
|
72
|
+
end
|
73
|
+
|
74
|
+
#Find Forex Offer is a class method that returns the foreign exchange rate for virtual currencies
|
75
|
+
#input: eg. exchange_rate
|
76
|
+
#output: xml with attributes eg. exchangeRate="0.011"
|
77
|
+
def self.find_forex_offer_by_external_key(external_key)
|
78
|
+
params = {'externalKey' => external_key}
|
79
|
+
get_data("forexOffers", params)
|
80
|
+
end
|
81
|
+
|
82
|
+
#Update Forex Offer to Status CANCELLED
|
83
|
+
def self.cancel_forex_offer(forex_offer_id, ipaddress)
|
84
|
+
params = {'forexOfferId' => forex_offer_id, 'ipAddress' => ipaddress, 'status' => 'CANCELLED'}
|
85
|
+
put_data("forexOffer/#{forex_offer_id}", params)
|
86
|
+
end
|
87
|
+
|
88
|
+
#Add Forex Offer is a class method that add the foreign exchange rate for virtual currencies
|
89
|
+
#input: 'AMG', 100, 'AMS', 60
|
90
|
+
def self.add_forex_offer(exchange_rate)
|
91
|
+
params = {
|
92
|
+
storeId: 3190,
|
93
|
+
description: exchange_rate.to_s,
|
94
|
+
fromCurrencyName: exchange_rate.from_currency.vcx_name,
|
95
|
+
toCurrencyName: exchange_rate.to_currency.vcx_name,
|
96
|
+
exchangeRate: exchange_rate.exchange_rate,
|
97
|
+
externalKey: exchange_rate.id,
|
98
|
+
effectiveDate: generate_date(DateTime.now),
|
99
|
+
expirationDate: generate_date(DateTime.now + 75.years),
|
100
|
+
isDefault: false,
|
101
|
+
isSpecial: false,
|
102
|
+
status: 'ACTIVE'
|
103
|
+
}
|
104
|
+
post_data("forexOffer", params)
|
105
|
+
end
|
106
|
+
|
107
|
+
#Create purchase order is a class method that creates a new purchaseOrder in the elements system depending on the order type
|
108
|
+
def self.create_purchase_order( order, ipaddress='1.1.1.1' )
|
109
|
+
lineItems, payment = send("#{order.order_type}_purchase_info", order, ipaddress)
|
110
|
+
elements_ids = Array.new
|
111
|
+
|
112
|
+
|
113
|
+
lineItems.each_with_index do |lineItem, index|
|
114
|
+
params = {
|
115
|
+
orderCommand: 'AUTHORIZE',
|
116
|
+
buyerUser: {'@id' => order.user.elements_id},
|
117
|
+
lineItems: lineItem,
|
118
|
+
payment: payment[index]
|
119
|
+
}
|
120
|
+
rs = XmlSimple.xml_in post_xml_data("purchaseOrder", params,"purchaseOrder")
|
121
|
+
elements_ids << rs['id']
|
122
|
+
end
|
123
|
+
save_order_elements(elements_ids, order)
|
124
|
+
end
|
125
|
+
|
126
|
+
#Process purchase order is a class method that processes an already created order
|
127
|
+
def self.process_purchase_order( order, ipaddress='1.1.1.1' )
|
128
|
+
#elements_id = create_purchase_order(order, ipaddress)
|
129
|
+
params = {
|
130
|
+
commandType: 'CHARGE'
|
131
|
+
}
|
132
|
+
|
133
|
+
elements_ids = fetch_order_elements(order)
|
134
|
+
elements_ids.each do |elements_id|
|
135
|
+
XmlSimple.xml_in post_xml_data("purchaseOrder/#{elements_id}/command", params,"purchaseOrderCommand")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
#Cancel Purchase Order is a class method that cancels an order that has already been created
|
140
|
+
def self.cancel_purchase_order( order, ipaddress='1.1.1.1' )
|
141
|
+
params = {
|
142
|
+
commandType: 'CANCEL'
|
143
|
+
}
|
144
|
+
XmlSimple.xml_in post_xml_data("purchaseOrder/#{order.elements_id}/command", params,"purchaseOrderCommand")
|
145
|
+
end
|
146
|
+
|
147
|
+
#Find purchase Order is a class method that returns the purchase order
|
148
|
+
#output: xml with attributes
|
149
|
+
def self.find_purchase_order(purchase_order_id)
|
150
|
+
params = {'id' => purchase_order_id }
|
151
|
+
get_data("purchaseOrder/#{purchase_order_id}", params)
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
#Buy Purchase Info is a class method that returns the buy line items and payment information for the order
|
156
|
+
def self.buy_purchase_info(order, ipaddress)
|
157
|
+
sell_purchase_info(order, ipaddress)
|
158
|
+
end
|
159
|
+
|
160
|
+
#Sell Purchase Info is a class method that returns the sell line items and payment information for the order
|
161
|
+
def self.sell_purchase_info(order, ipaddress)
|
162
|
+
line_items = Array.new
|
163
|
+
line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs, '@id' => find_or_create_forex_offer(ExchangeRate.find(order.exchange_rate_id), ipaddress), '@buyerAccountId' => order.to_account.elements_id } } }]
|
164
|
+
|
165
|
+
payment = [{
|
166
|
+
'@currencyId' => order.from_currency.elements_id,
|
167
|
+
'tfeAccountId' => order.from_account.elements_id
|
168
|
+
}]
|
169
|
+
|
170
|
+
return line_items, payment
|
171
|
+
end
|
172
|
+
|
173
|
+
#Sell Purchase Info is a class method that returns the exchange line items and payment information for the order
|
174
|
+
def self.exchange_purchase_info(order, ipaddress)
|
175
|
+
vcx_currency = Currency.find_by_currency_type('real')
|
176
|
+
|
177
|
+
sell_exchange_rate = Forex.find_exchange_rate(Forex.find_by_currency_id(order.from_currency), Forex.find_by_currency_id(vcx_currency))
|
178
|
+
buy_exchange_rate = Forex.find_exchange_rate(Forex.find_by_currency_id(vcx_currency), Forex.find_by_currency_id(order.to_currency))
|
179
|
+
|
180
|
+
line_items = Array.new
|
181
|
+
line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs, '@id' => find_or_create_forex_offer(sell_exchange_rate, ipaddress), '@buyerAccountId' => order.user.accounts.find_by_currency_id(vcx_currency).elements_id } } }]
|
182
|
+
line_items << [{ 'forexOffer' => { 'forexOfferRequest' => { '@amountFromCurrency' => order.from_amount.abs * sell_exchange_rate.exchange_rate, '@id' => find_or_create_forex_offer(buy_exchange_rate, ipaddress), '@buyerAccountId' => order.to_account.elements_id } } }]
|
183
|
+
|
184
|
+
|
185
|
+
payment = [
|
186
|
+
{
|
187
|
+
'@currencyId' => order.from_currency.elements_id,
|
188
|
+
'tfeAccountId' => order.from_account.elements_id
|
189
|
+
},
|
190
|
+
{
|
191
|
+
'@currencyId' => vcx_currency.elements_id,
|
192
|
+
'tfeAccountId' => order.user.accounts.find_by_currency_id(vcx_currency).elements_id
|
193
|
+
}
|
194
|
+
]
|
195
|
+
|
196
|
+
return line_items, payment
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
#Fetch Order Elements is a class method that fetches the elements_id from order table depending on the order type
|
201
|
+
def self.fetch_order_elements(order)
|
202
|
+
elements_id = order.elements_id
|
203
|
+
case order.order_type
|
204
|
+
when /['sell'|'buy']/
|
205
|
+
[elements_id]
|
206
|
+
when 'exchange'
|
207
|
+
order.elements_id.split('|')
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
#Save Order Elements is a class method that saves the elements_id from order table depending on the order type
|
212
|
+
def self.save_order_elements(elements_ids, order)
|
213
|
+
case order.order_type
|
214
|
+
when /['sell'|'buy']/
|
215
|
+
order.update_column 'elements_id', elements_ids.first
|
216
|
+
when 'exchange'
|
217
|
+
order.update_column 'elements_id', elements_ids.join('|')
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
|
222
|
+
#Find account is a class method that find account via account_id
|
223
|
+
#input: eg. Account.find(254)
|
224
|
+
#output: eg. "account254"
|
225
|
+
def self.find_account_name(account)
|
226
|
+
params = {program: "var account = es.findAccountById(#{account.elements_id}, authInfo); '' + account.name;", ipAddress: '123.123.123.123'}
|
227
|
+
post_data("batch", params)
|
228
|
+
end
|
229
|
+
|
230
|
+
#Create account is a class method that creates an account in elements from the Account model object
|
231
|
+
#input: eg. Account.find(254), '255.255.255.255'
|
232
|
+
#output: elements id
|
233
|
+
def self.create_account(account, ip_address)
|
234
|
+
params ={
|
235
|
+
program: "
|
236
|
+
var accountId = es.addAccount(#{account.user.elements_id}, 'account#{account.id}', #{account.currency.elements_id}, null, authInfo);
|
237
|
+
es.addToAccountBalance(new java.lang.Long(accountId), new java.math.BigDecimal(#{account.balance}), requestContext, authInfo);
|
238
|
+
'' + accountId;
|
239
|
+
",
|
240
|
+
ipAddress: ip_address
|
241
|
+
}
|
242
|
+
elements_account_id = post_data("batch", params) + ''
|
243
|
+
#account.update_column('elements_id', elements_account_id.to_i)
|
244
|
+
elements_account_id
|
245
|
+
end
|
246
|
+
|
247
|
+
#Find balance is a class method that returns the balance of the Account model object from elements
|
248
|
+
#input eg. Account.find(254), '255.255.255.255'
|
249
|
+
#output: eg. 3214
|
250
|
+
def self.find_balance(account, ip_address)
|
251
|
+
params = {
|
252
|
+
program: "
|
253
|
+
var balance = es.balanceInquiry(#{account.elements_id}, authInfo);
|
254
|
+
'' + balance.amount;
|
255
|
+
",
|
256
|
+
ipAddress: ip_address
|
257
|
+
}
|
258
|
+
post_data("batch", params)
|
259
|
+
end
|
260
|
+
|
261
|
+
#Add account balance is a class method that adds the account balance to the elements
|
262
|
+
#input: eg. Account.find(254), '255.255.255.255'
|
263
|
+
#output
|
264
|
+
def self.set_account_balance(account, ip_address)
|
265
|
+
balance = account.balance.to_f - find_balance(account, ip_address).to_f
|
266
|
+
command = balance >=0 ? "addToAccountBalance" : "subtractFromAccountBalance"
|
267
|
+
params ={program: "es.#{command}(#{account.elements_id}, new java.math.BigDecimal(#{balance.abs}), requestContext, authInfo);''", ipAddress: ip_address}
|
268
|
+
post_data('batch', params)
|
269
|
+
end
|
270
|
+
|
271
|
+
|
272
|
+
private
|
273
|
+
#Get_default_params are a list of common params required for all the calls made to elements
|
274
|
+
def self.get_default_params
|
275
|
+
{
|
276
|
+
'auth.partnerId' => '$apiactor',
|
277
|
+
'auth.accessKey' => 'hvTmKSjSdj' ,
|
278
|
+
'auth.appFamilyId' => '1327520603300',
|
279
|
+
'auth.namespaceId' => '0'
|
280
|
+
}
|
281
|
+
end
|
282
|
+
|
283
|
+
def self.get_xml_default_params
|
284
|
+
newparams={}
|
285
|
+
get_default_params.each{|key,value| newparams["@#{key.gsub(/auth./,'')}"]=value}
|
286
|
+
newparams
|
287
|
+
end
|
288
|
+
|
289
|
+
#Generate_url method returns the string of the current url used
|
290
|
+
def self.generate_url(url)
|
291
|
+
@url + url
|
292
|
+
end
|
293
|
+
|
294
|
+
#Get_data method gets data from elements using the get http method
|
295
|
+
def self.get_data(api_url, params={} )
|
296
|
+
RestClient.get generate_url(api_url), {params: get_default_params.merge(params)}
|
297
|
+
end
|
298
|
+
|
299
|
+
#Post_data method posts data to elements using the post http method
|
300
|
+
def self.post_data(api_url, params={}, *content_type )
|
301
|
+
RestClient.post( generate_url(api_url), params.merge(get_default_params), content_type)
|
302
|
+
end
|
303
|
+
|
304
|
+
def self.post_xml_data(api_url, params, root_name)
|
305
|
+
xml = XmlSimple.xml_out get_xml_default_params.merge(params), { 'AttrPrefix' => true, 'RootName' => root_name, 'XmlDeclaration' => true, 'GroupTags' => { :lineItems => 'lineItem' } }
|
306
|
+
response = RestClient.post generate_url(api_url), xml, :content_type => :xml
|
307
|
+
end
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
#Put_data method posts data to elements using the post http method
|
312
|
+
def self.put_data(api_url,params={})
|
313
|
+
RestClient.put generate_url(api_url), params.merge(get_default_params )
|
314
|
+
end
|
315
|
+
|
316
|
+
#Delete method makes a call to elements Api using the delete http method
|
317
|
+
def self.delete(api_url)
|
318
|
+
RestClient.delete generate_url(api_url), DEFAULTAPI
|
319
|
+
end
|
320
|
+
|
321
|
+
#Generate_date method generates date [YYYY]-[MM]-[DD]T[hh]:[mm] as specified by ISO 8601
|
322
|
+
def self.generate_date(date_time)
|
323
|
+
date_time.strftime "%FT%T%:z"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
#ApiV1 class uses the older v1 version of the elements Api
|
328
|
+
class ApiV1 < Api
|
329
|
+
@url = V1URL
|
330
|
+
#Update_user method updates the user information using elements API
|
331
|
+
def self.update_user(user, ipaddress='123.123.123.123')
|
332
|
+
params = {
|
333
|
+
'user.id' => user.elements_id,
|
334
|
+
'ipAddress' => ipaddress,
|
335
|
+
'user.emailAddress' => user.email,
|
336
|
+
'user.gender' => user.gender[0],
|
337
|
+
'user.dateOfBirth' => user.dob.strftime("%Y/%m/%d")
|
338
|
+
}
|
339
|
+
post_data 'user/update', params
|
340
|
+
end
|
341
|
+
|
342
|
+
#Find Currencies is a class method that returns all the currencies added to Elements
|
343
|
+
def self.find_currencies
|
344
|
+
get_data('currency')
|
345
|
+
end
|
346
|
+
|
347
|
+
#Find currency is a class method that finds a particular currency depending on the currency name or elements_id
|
348
|
+
def self.find_currency(currency)
|
349
|
+
params = if(currency.elements_id.blank?)
|
350
|
+
{"currency.name" => currency.vcx_name}
|
351
|
+
else
|
352
|
+
{"currency.id" => currency.elements_id}
|
353
|
+
end
|
354
|
+
get_data('currency', params)
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require 'rubygems/create/builder'
|
2
|
+
require 'erb'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
# The Gem::Commands::CreateCommand class facilitates the `gem create` command.
|
6
|
+
class Gem::Commands::CreateCommand < Gem::Command
|
7
|
+
|
8
|
+
# Default path to templates provided by this plugin.
|
9
|
+
TEMPLATES = File.expand_path('../../create/templates', __FILE__)
|
10
|
+
|
11
|
+
# Initializes the plugin.
|
12
|
+
def initialize
|
13
|
+
super "create", "Creates a new RubyGem skeleton"
|
14
|
+
add_options!
|
15
|
+
end
|
16
|
+
|
17
|
+
# Creates the gem.
|
18
|
+
def execute
|
19
|
+
@gem_name = get_one_gem_name
|
20
|
+
create_gem!
|
21
|
+
end
|
22
|
+
|
23
|
+
# The usage banner displayed for `gem create --help`.
|
24
|
+
def usage
|
25
|
+
"gem create GEM_NAME"
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Private: Adds command line switches used by this plugin.
|
31
|
+
def add_options!
|
32
|
+
add_option "--force", "Overwrite existing files" do |force, options|
|
33
|
+
options[:force] = force
|
34
|
+
end
|
35
|
+
|
36
|
+
add_option "--git GIT_PATH", "The path to git" do |git, options|
|
37
|
+
options[:git] = git
|
38
|
+
end
|
39
|
+
|
40
|
+
add_option "--author AUTHOR", "The author name used in gemspec" do |author, options|
|
41
|
+
options[:author] = author
|
42
|
+
end
|
43
|
+
|
44
|
+
add_option "--github-name NAME", "The Github account that will own the gem" do |github, options|
|
45
|
+
options[:github_name] = github
|
46
|
+
end
|
47
|
+
|
48
|
+
add_option "--email EMAIL", "The author's email address used in gemspec" do |email, options|
|
49
|
+
options[:email] = email
|
50
|
+
end
|
51
|
+
|
52
|
+
add_option "--template-directory DIR", "A custom template directory to use" do |directory, options|
|
53
|
+
if File.directory?(directory)
|
54
|
+
options[:template_directory] = directory
|
55
|
+
else
|
56
|
+
raise "Directory #{directory.inspect} doesn't exist!"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Private: Creates the gem skeleton.
|
62
|
+
#
|
63
|
+
# First any requires directories are created. Then, templates are rendered
|
64
|
+
# via ERB and written as new files.
|
65
|
+
#
|
66
|
+
# When creating directories and files, any occurrence of 'gem_name' is
|
67
|
+
# replaced with the name of the gem to be created.
|
68
|
+
def create_gem!
|
69
|
+
manifest[:directories].each do |dir|
|
70
|
+
FileUtils.mkdir_p dir.gsub('gem_name', builder.name)
|
71
|
+
end
|
72
|
+
|
73
|
+
manifest[:files].each do |file|
|
74
|
+
dest = file.gsub('gem_name', builder.name).gsub(/\.erb$/, '')
|
75
|
+
write_template_file(file, dest)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Private: Returns true if files should be overwritten when creating the new
|
80
|
+
# gem.
|
81
|
+
#
|
82
|
+
# Returns true or false.
|
83
|
+
def force?
|
84
|
+
!! options[:force]
|
85
|
+
end
|
86
|
+
|
87
|
+
# Private: The directory that contains template files to use when creating
|
88
|
+
# the new gem. By default, this is TEMPLATES. A user can specify their own
|
89
|
+
# directory with the `--template-directory` command line option.
|
90
|
+
#
|
91
|
+
# If a block is supplied, it is called within the template directory (i.e.
|
92
|
+
# Dir.pwd in the block will be set to the template directory), and the value
|
93
|
+
# of this block is returned.
|
94
|
+
#
|
95
|
+
# If no block is supplied, the String template directory is returned.
|
96
|
+
def template_dir
|
97
|
+
dir = options[:template_directory] || TEMPLATES
|
98
|
+
Dir.chdir(dir) { return yield } if block_given?
|
99
|
+
dir
|
100
|
+
end
|
101
|
+
|
102
|
+
# Private: A Hash containing :files and :directories to create.
|
103
|
+
#
|
104
|
+
# :files - An Array of files that will be created.
|
105
|
+
# :directories - An Array of directories that will be created.
|
106
|
+
#
|
107
|
+
# Returns a Hash.
|
108
|
+
def manifest
|
109
|
+
@manifest ||= Hash.new.tap do |h|
|
110
|
+
template_dir do
|
111
|
+
templates = Dir.glob("**/*", File::FNM_DOTMATCH).reject { |t| t =~ /\.\.?$/ }
|
112
|
+
h[:files] = templates.reject { |t| File.directory?(t) }
|
113
|
+
h[:directories] = templates.select { |t| File.directory?(t) }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Private: Writes a new file from a template.
|
119
|
+
#
|
120
|
+
# source - Path to the source template.
|
121
|
+
# dest - Path to the destination file.
|
122
|
+
def write_template_file(source, dest)
|
123
|
+
if can_write_file?(dest)
|
124
|
+
s = render_file(source)
|
125
|
+
File.open(dest, "w") { |file| file.puts s }
|
126
|
+
else
|
127
|
+
raise "Can't create #{dest.inspect} as it already exists!"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Private: Returns true if the given file can be written.
|
132
|
+
#
|
133
|
+
# A file can be written if the user specified `--force` via the command
|
134
|
+
# line, or the file does not yet exist.
|
135
|
+
#
|
136
|
+
# file - Path to the file to check.
|
137
|
+
#
|
138
|
+
# Returns true or false.
|
139
|
+
def can_write_file?(file)
|
140
|
+
force? || ! File.exists?(file)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Private: Renders a file via ERB within the context of a
|
144
|
+
# Gem::Create::Builder instance. This makes methods in that class available
|
145
|
+
# in the template.
|
146
|
+
#
|
147
|
+
# file - Path to the template file.
|
148
|
+
#
|
149
|
+
# Returns the rendered template as a String.
|
150
|
+
def render_file(file)
|
151
|
+
ERB.new(read_file(file)).result(builder.get_binding)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Private: Gets the content from the specified file.
|
155
|
+
#
|
156
|
+
# file - Path to the file to read.
|
157
|
+
#
|
158
|
+
# Raises RuntimeError if the file doesn't exist.
|
159
|
+
#
|
160
|
+
# Returns a String.
|
161
|
+
def read_file(file)
|
162
|
+
template_dir do
|
163
|
+
if File.exists?(file)
|
164
|
+
File.read(file)
|
165
|
+
else
|
166
|
+
raise "Template #{file.inspect} doesnt exist!"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Private: Creates/returns a Gem::Create::Builder instance. This will be
|
172
|
+
# used to provide variables in template files.
|
173
|
+
#
|
174
|
+
# Returns a Gem::Create::Builder instance.
|
175
|
+
def builder
|
176
|
+
@builder ||= Gem::Create::Builder.new(@gem_name, options)
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Gem::Create
|
2
|
+
# The Builder class is used to provide variables in ERB templates.
|
3
|
+
class Builder
|
4
|
+
# The name of the gem.
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
# The options supplied to the command line.
|
8
|
+
attr_reader :options
|
9
|
+
|
10
|
+
# Creates a new Builder
|
11
|
+
#
|
12
|
+
# name - The name of the gem.
|
13
|
+
# options - The options used to create the gem.
|
14
|
+
def initialize(name, options = {})
|
15
|
+
@options = options
|
16
|
+
@name = name
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the binding of this object.
|
20
|
+
def get_binding
|
21
|
+
binding
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the gem author's name.
|
25
|
+
def author
|
26
|
+
options[:author] || git_config('user.name')
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the gem author's email address.
|
30
|
+
def email
|
31
|
+
options[:email] || git_config('user.email')
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns the gem author's Github username.
|
35
|
+
def github_name
|
36
|
+
options[:github_name] || git_config('github.user')
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the given variable from `git config`
|
40
|
+
#
|
41
|
+
# key - The key to query.
|
42
|
+
#
|
43
|
+
# Returns a String.
|
44
|
+
def git_config(key)
|
45
|
+
%x{#{git} config --global #{key} 2> /dev/null}.chomp.strip
|
46
|
+
end
|
47
|
+
|
48
|
+
# The path to git.
|
49
|
+
def git
|
50
|
+
options[:git] || "git"
|
51
|
+
end
|
52
|
+
|
53
|
+
# The path of the gem.
|
54
|
+
def path
|
55
|
+
name.gsub('-', '/')
|
56
|
+
end
|
57
|
+
|
58
|
+
# The class name of the gem in CamelCase.
|
59
|
+
def gem_class
|
60
|
+
name.split('-').map { |seg| seg.gsub(/(?:^|_| )(.)/) { $1.upcase } }.join('::')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) <%= Time.now.year %> <%= author %> <<%= email %>>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person ob-
|
4
|
+
taining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without restric-
|
6
|
+
tion, including without limitation the rights to use, copy, modi-
|
7
|
+
fy, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
the Software, and to permit persons to whom the Software is fur-
|
9
|
+
nished to do so, subject to 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
|
16
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONIN-
|
17
|
+
FRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
19
|
+
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# <%= gem_class %> [![<%= gem_class %> Build Status][Build Icon]][Build Status]
|
2
|
+
|
3
|
+
Description Here
|
4
|
+
|
5
|
+
[Build Icon]: https://secure.travis-ci.org/<%= github_name %>/<%= name %>.png?branch=master
|
6
|
+
[Build Status]: http://travis-ci.org/<%= github_name %>/<%= name %>
|
7
|
+
|
8
|
+
## Note on Patches/Pull Requests
|
9
|
+
|
10
|
+
* Fork the project.
|
11
|
+
* Make your feature addition or bug fix.
|
12
|
+
* Add tests for it. This is important so I don't break it in a future version
|
13
|
+
unintentionally.
|
14
|
+
* Commit, do not bump version. (If you want to have your own version, that is
|
15
|
+
fine but bump version in a commit by itself I can ignore when I pull).
|
16
|
+
* Send me a pull request. Bonus points for topic branches.
|
17
|
+
|
18
|
+
## Copyright
|
19
|
+
|
20
|
+
Copyright (c) <%= Time.now.year %> <%= author %>. See LICENSE for details.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift "lib"
|
2
|
+
|
3
|
+
require "<%= name %>/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.name = "<%= path %>"
|
8
|
+
s.version = <%= gem_class %>::Version
|
9
|
+
s.date = Time.now.strftime("%Y-%m-%d")
|
10
|
+
s.summary = "<%= gem_class %>: Description here"
|
11
|
+
s.homepage = "https://github.com/<%= github_name %>/<%= name %>"
|
12
|
+
s.authors = ["<%= author %>"]
|
13
|
+
s.email = "<%= email %>"
|
14
|
+
|
15
|
+
s.files = %w[ Rakefile README.markdown ]
|
16
|
+
s.files += Dir["bin/**/*"] if File.exists? "bin"
|
17
|
+
s.files += Dir["lib/**/*", "spec/**/*"]
|
18
|
+
|
19
|
+
# s.executables = ["templates"]
|
20
|
+
|
21
|
+
# s.add_dependency("gem", "= 0.0.0")
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency "rake"
|
25
|
+
|
26
|
+
s.extra_rdoc_files = ["README.markdown"]
|
27
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "<%= path %>/version"
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Gem::Commands::CreateCommand do
|
4
|
+
it "prints help" do
|
5
|
+
out, err = run_command('--help')
|
6
|
+
err.must_equal "", "should not write to STDERR"
|
7
|
+
|
8
|
+
out.must_match "Usage: gem create GEM_NAME [options]"
|
9
|
+
out.must_match "--force"
|
10
|
+
out.must_match "--git"
|
11
|
+
out.must_match "--author"
|
12
|
+
out.must_match "--github-name"
|
13
|
+
out.must_match "--email"
|
14
|
+
out.must_match "--template-directory"
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "generated files" do
|
18
|
+
before do
|
19
|
+
run_command *%W(
|
20
|
+
some_gem
|
21
|
+
--author Bender\ Rodriguez
|
22
|
+
--email bender@planex.com
|
23
|
+
--github bender
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
it_renders "README.markdown" do |data|
|
28
|
+
data.must_match "# SomeGem [![SomeGem Build Status"
|
29
|
+
data.must_match "https://secure.travis-ci.org/bender/some_gem.png?branch=master"
|
30
|
+
data.must_match "http://travis-ci.org/bender/some_gem"
|
31
|
+
data.must_match "Copyright (c) #{Time.now.year} Bender Rodriguez"
|
32
|
+
end
|
33
|
+
|
34
|
+
it_renders "LICENSE" do |data|
|
35
|
+
data.must_match "Copyright (c) #{Time.now.year} Bender Rodriguez <bender@planex.com>"
|
36
|
+
end
|
37
|
+
|
38
|
+
it_renders "some_gem.gemspec" do |data|
|
39
|
+
data.must_match %r{require "some_gem/version}
|
40
|
+
data.must_match %r{s\.version\s*= SomeGem::Version}
|
41
|
+
data.must_match %r{s\.name\s*= "some_gem"}
|
42
|
+
data.must_match %r{s\.summary\s*= "SomeGem: Description here"}
|
43
|
+
data.must_match %r{s\.homepage\s*= "https://github\.com/bender/some_gem"}
|
44
|
+
data.must_match %r{s\.authors\s*= \["Bender Rodriguez"\]}
|
45
|
+
data.must_match %r{s\.email\s*= "bender@planex\.com"}
|
46
|
+
end
|
47
|
+
|
48
|
+
it_renders "lib/some_gem.rb" do |data|
|
49
|
+
data.must_match 'require "some_gem/version"'
|
50
|
+
end
|
51
|
+
|
52
|
+
it_renders "lib/some_gem/version.rb" do |data|
|
53
|
+
data.must_match "module SomeGem"
|
54
|
+
data.must_match " VERSION = Version = '0.0.0'"
|
55
|
+
end
|
56
|
+
|
57
|
+
it_renders "spec/spec_helper.rb"
|
58
|
+
|
59
|
+
it_renders "spec/some_gem_spec.rb"
|
60
|
+
|
61
|
+
it_renders "Rakefile"
|
62
|
+
|
63
|
+
it_renders "Gemfile"
|
64
|
+
|
65
|
+
it_renders ".travis.yml" do |data|
|
66
|
+
data.must_match "recipients:\n - bender@planex.com"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "custom template directory" do
|
71
|
+
it "raises with a non-existing directory" do
|
72
|
+
proc { run_command *%W(some_gem --template-dir /dev/null/asdf) }.
|
73
|
+
must_raise RuntimeError, 'Directory "/dev/null/asdf" doesn\'t exist!'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rubygems/mock_gem_ui"
|
3
|
+
require "minitest/spec"
|
4
|
+
require "tmpdir"
|
5
|
+
require "fileutils"
|
6
|
+
|
7
|
+
class Gem::Create::TestCase < MiniTest::Spec
|
8
|
+
# Apply this TestCase to any specs with
|
9
|
+
# `describe Gem::Commands::CreateCommand`
|
10
|
+
register_spec_type /Gem::Commands::CreateCommand/, Gem::Create::TestCase
|
11
|
+
|
12
|
+
# Clear the tmpdir if needed.
|
13
|
+
before { self.class.rm_tmpdir }
|
14
|
+
|
15
|
+
# Create a temporary directory.
|
16
|
+
def self.tmpdir
|
17
|
+
@tmpdir ||= Dir.mktmpdir
|
18
|
+
end
|
19
|
+
|
20
|
+
# Remove the temporary directory.
|
21
|
+
def self.rm_tmpdir
|
22
|
+
FileUtils.rm_r(tmpdir) if File.exists?(tmpdir)
|
23
|
+
ensure
|
24
|
+
@tmpdir = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
# Shortcut for specs dealing with generated files.
|
28
|
+
#
|
29
|
+
# Asserts that the file exists within the temporary directory.
|
30
|
+
#
|
31
|
+
# path - Path to the subject file
|
32
|
+
#
|
33
|
+
# If a block is given, it yields the contents of the file.
|
34
|
+
#
|
35
|
+
# Examples:
|
36
|
+
#
|
37
|
+
# it_renders "README" do |data|
|
38
|
+
# data.must_match /Hello World!/
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# it_renders "Gemspec"
|
42
|
+
def self.it_renders(path)
|
43
|
+
it "renders #{path}" do
|
44
|
+
file = File.join(self.class.tmpdir, path)
|
45
|
+
File.exists?(file).must_equal true, "Expected #{path.inspect} to exist"
|
46
|
+
|
47
|
+
yield File.read(file) if block_given?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns a Gem::MockGemUI. This allows us to work with IO in tests.
|
52
|
+
def ui
|
53
|
+
@ui ||= Gem::MockGemUi.new
|
54
|
+
end
|
55
|
+
|
56
|
+
# Run the CreateCommand with the specified arguments.
|
57
|
+
#
|
58
|
+
# Returns an Array, [0] is the output of the command, [1] is the error
|
59
|
+
# output.
|
60
|
+
def run_command(*args)
|
61
|
+
cmd = Gem::Commands::CreateCommand.new
|
62
|
+
|
63
|
+
Dir.chdir(self.class.tmpdir) do
|
64
|
+
Gem::DefaultUserInteraction.use_ui(ui) do
|
65
|
+
capture_io { cmd.invoke *args }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
return ui.output, ui.error
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
MiniTest::Unit.after_tests { Gem::Create::TestCase.rm_tmpdir }
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vcx-elements
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- livegamer
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: minitest
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: ! ' Elements Api'
|
47
|
+
email: todd@livegamer.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- Gemfile
|
53
|
+
- Rakefile
|
54
|
+
- README.markdown
|
55
|
+
- gem-create.gemspec
|
56
|
+
- LICENSE
|
57
|
+
- lib/elements.rb
|
58
|
+
- lib/rubygems/commands/create_command.rb
|
59
|
+
- lib/rubygems/create/builder.rb
|
60
|
+
- lib/rubygems/create/templates/gem_name.gemspec.erb
|
61
|
+
- lib/rubygems/create/templates/Gemfile
|
62
|
+
- lib/rubygems/create/templates/lib/gem_name/version.rb.erb
|
63
|
+
- lib/rubygems/create/templates/lib/gem_name.rb.erb
|
64
|
+
- lib/rubygems/create/templates/LICENSE.erb
|
65
|
+
- lib/rubygems/create/templates/Rakefile
|
66
|
+
- lib/rubygems/create/templates/README.markdown.erb
|
67
|
+
- lib/rubygems/create/templates/spec/gem_name_spec.rb.erb
|
68
|
+
- lib/rubygems/create/templates/spec/spec_helper.rb.erb
|
69
|
+
- lib/rubygems_plugin.rb
|
70
|
+
- spec/create_command_spec.rb
|
71
|
+
- spec/minitest/gem_command_test_case.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
homepage: https://github.com/livegamervcxdevteam/elementsapi.git
|
74
|
+
licenses: []
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 1.8.24
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Elements Api
|
97
|
+
test_files:
|
98
|
+
- spec/create_command_spec.rb
|
99
|
+
- spec/minitest/gem_command_test_case.rb
|
100
|
+
- spec/spec_helper.rb
|