eloqua 1.1.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/.gitignore +11 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +23 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +81 -0
- data/LICENSE +21 -0
- data/README.md +245 -0
- data/Rakefile +13 -0
- data/TODO.md +8 -0
- data/eloqua.gemspec +32 -0
- data/eloqua_initializer.tpl.rb +3 -0
- data/lib/eloqua.rb +51 -0
- data/lib/eloqua/api.rb +119 -0
- data/lib/eloqua/api/action.rb +41 -0
- data/lib/eloqua/api/service.rb +240 -0
- data/lib/eloqua/asset.rb +31 -0
- data/lib/eloqua/builder/templates.rb +31 -0
- data/lib/eloqua/builder/xml.rb +129 -0
- data/lib/eloqua/entity.rb +72 -0
- data/lib/eloqua/exceptions.rb +5 -0
- data/lib/eloqua/helper/attribute_map.rb +78 -0
- data/lib/eloqua/query.rb +291 -0
- data/lib/eloqua/remote_object.rb +274 -0
- data/lib/eloqua/version.rb +3 -0
- data/lib/eloqua/wsdl/action.wsdl +1 -0
- data/lib/eloqua/wsdl/data.wsdl +1 -0
- data/lib/eloqua/wsdl/email.wsdl +1 -0
- data/lib/eloqua/wsdl/service.wsdl +1 -0
- data/lib/tasks/test.rake +24 -0
- data/rspec.watchr +74 -0
- data/spec/fixtures/add_group_member/success.xml +18 -0
- data/spec/fixtures/create/contact_duplicate.xml +30 -0
- data/spec/fixtures/create/contact_success.xml +25 -0
- data/spec/fixtures/create_asset/failure.xml +30 -0
- data/spec/fixtures/create_asset/group_success.xml +25 -0
- data/spec/fixtures/delete_asset/access_deny.xml +31 -0
- data/spec/fixtures/describe_asset/success.xml +72 -0
- data/spec/fixtures/describe_asset_type/success.xml +23 -0
- data/spec/fixtures/describe_entity/success.xml +54 -0
- data/spec/fixtures/describe_entity_type/success.xml +45 -0
- data/spec/fixtures/get_member_count_in_step_by_status/success.xml +15 -0
- data/spec/fixtures/list_asset_types/success.xml +28 -0
- data/spec/fixtures/list_entity_types/success.xml +21 -0
- data/spec/fixtures/list_group_membership/success.xml +25 -0
- data/spec/fixtures/list_members_in_step_by_status/success.xml +15 -0
- data/spec/fixtures/query/contact_email_one.xml +38 -0
- data/spec/fixtures/query/contact_email_two.xml +56 -0
- data/spec/fixtures/query/contact_missing.xml +19 -0
- data/spec/fixtures/query/fault.xml +43 -0
- data/spec/fixtures/remove_group_member/success.xml +18 -0
- data/spec/fixtures/retrieve/contact_missing.xml +17 -0
- data/spec/fixtures/retrieve/contact_multiple.xml +3460 -0
- data/spec/fixtures/retrieve/contact_single.xml +38 -0
- data/spec/fixtures/retrieve_asset/failure.xml +17 -0
- data/spec/fixtures/retrieve_asset/success.xml +50 -0
- data/spec/fixtures/update/contact_success.xml +26 -0
- data/spec/lib/eloqua/api/action_spec.rb +36 -0
- data/spec/lib/eloqua/api/service_spec.rb +498 -0
- data/spec/lib/eloqua/api_spec.rb +133 -0
- data/spec/lib/eloqua/asset_spec.rb +63 -0
- data/spec/lib/eloqua/builder/templates_spec.rb +68 -0
- data/spec/lib/eloqua/builder/xml_spec.rb +254 -0
- data/spec/lib/eloqua/entity_spec.rb +224 -0
- data/spec/lib/eloqua/helper/attribute_map_spec.rb +14 -0
- data/spec/lib/eloqua/query_spec.rb +596 -0
- data/spec/lib/eloqua/remote_object_spec.rb +742 -0
- data/spec/lib/eloqua_spec.rb +171 -0
- data/spec/shared/attribute_map.rb +173 -0
- data/spec/shared/class_to_api_delegation.rb +50 -0
- data/spec/spec_helper.rb +48 -0
- data/spec/support/helper.rb +73 -0
- metadata +366 -0
data/.gitignore
ADDED
data/.yardopts
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
## 0.2.3
|
2
|
+
- Added last_request, last_response to Eloqua::API
|
3
|
+
|
4
|
+
- Added wrapper around the Savon SOAP and HTTP exceptions.
|
5
|
+
Savon should disable its error handling and let Eloqua raise its own
|
6
|
+
errors by using `Savon::configure {|config| config.raise_errors =
|
7
|
+
false }`. This allows us to capture last_request and last_response
|
8
|
+
even when there is a Soap or HTTP fault
|
9
|
+
|
10
|
+
## 0.2
|
11
|
+
- Abstracted out majority of requests into Eloqua::Api::Service
|
12
|
+
|
13
|
+
- Added Eloqua::Api::Service for a lightweight interface to Eloqua used
|
14
|
+
by other components like RemoteObject, Entity and Asset
|
15
|
+
|
16
|
+
- Eloqua::Query advanced Query builder with support for paging through
|
17
|
+
the entire set of records spanning multiple requests
|
18
|
+
|
19
|
+
|
20
|
+
## 0.1
|
21
|
+
- Initial Release
|
22
|
+
|
23
|
+
- Support for Service Api
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
eloqua (1.1.0)
|
5
|
+
activemodel
|
6
|
+
activesupport (= 3.0.6)
|
7
|
+
builder
|
8
|
+
i18n (= 0.5.0)
|
9
|
+
savon
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: http://rubygems.org/
|
13
|
+
specs:
|
14
|
+
activemodel (3.0.6)
|
15
|
+
activesupport (= 3.0.6)
|
16
|
+
builder (~> 2.1.2)
|
17
|
+
i18n (~> 0.5.0)
|
18
|
+
activesupport (3.0.6)
|
19
|
+
archive-tar-minitar (0.5.2)
|
20
|
+
builder (2.1.2)
|
21
|
+
ci_reporter (1.6.4)
|
22
|
+
builder (>= 2.1.2)
|
23
|
+
columnize (0.3.6)
|
24
|
+
crack (0.1.8)
|
25
|
+
diff-lcs (1.1.2)
|
26
|
+
flexmock (0.9.0)
|
27
|
+
gyoku (0.4.2)
|
28
|
+
builder (>= 2.1.2)
|
29
|
+
httpi (0.9.2)
|
30
|
+
ntlm-http (>= 0.1.1)
|
31
|
+
rack
|
32
|
+
i18n (0.5.0)
|
33
|
+
linecache19 (0.5.12)
|
34
|
+
ruby_core_source (>= 0.1.4)
|
35
|
+
mocha (0.9.12)
|
36
|
+
ntlm-http (0.1.1)
|
37
|
+
rack (1.2.2)
|
38
|
+
rspec (2.5.0)
|
39
|
+
rspec-core (~> 2.5.0)
|
40
|
+
rspec-expectations (~> 2.5.0)
|
41
|
+
rspec-mocks (~> 2.5.0)
|
42
|
+
rspec-core (2.5.1)
|
43
|
+
rspec-expectations (2.5.0)
|
44
|
+
diff-lcs (~> 1.1.2)
|
45
|
+
rspec-mocks (2.5.0)
|
46
|
+
ruby-debug-base19 (0.11.25)
|
47
|
+
columnize (>= 0.3.1)
|
48
|
+
linecache19 (>= 0.5.11)
|
49
|
+
ruby_core_source (>= 0.1.4)
|
50
|
+
ruby-debug19 (0.11.6)
|
51
|
+
columnize (>= 0.3.1)
|
52
|
+
linecache19 (>= 0.5.11)
|
53
|
+
ruby-debug-base19 (>= 0.11.19)
|
54
|
+
ruby-fsevent (0.2.1)
|
55
|
+
ruby_core_source (0.1.5)
|
56
|
+
archive-tar-minitar (>= 0.5.2)
|
57
|
+
savon (0.8.6)
|
58
|
+
builder (>= 2.1.2)
|
59
|
+
crack (~> 0.1.8)
|
60
|
+
gyoku (>= 0.3.0)
|
61
|
+
httpi (>= 0.7.8)
|
62
|
+
savon_spec (0.1.4)
|
63
|
+
mocha (>= 0.9.8)
|
64
|
+
rspec (>= 2.0.0)
|
65
|
+
savon (~> 0.8.0)
|
66
|
+
timecop (0.3.5)
|
67
|
+
watchr (0.7)
|
68
|
+
|
69
|
+
PLATFORMS
|
70
|
+
ruby
|
71
|
+
|
72
|
+
DEPENDENCIES
|
73
|
+
ci_reporter
|
74
|
+
eloqua!
|
75
|
+
flexmock
|
76
|
+
rspec
|
77
|
+
ruby-debug19
|
78
|
+
ruby-fsevent
|
79
|
+
savon_spec
|
80
|
+
timecop
|
81
|
+
watchr
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2011 Sahaja James Lal
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/README.md
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
# Eloqua API for Ruby
|
2
|
+
|
3
|
+
Currently supports the majority of the ServiceAPI for Eloqua.
|
4
|
+
|
5
|
+
The Service API supports the CURD of Entities (Contacts, etc..) and Assets (ContactGroups)
|
6
|
+
|
7
|
+
Through {Eloqua::Query} supports advanced queries spanning multiple
|
8
|
+
requests.
|
9
|
+
|
10
|
+
## At a low level
|
11
|
+
|
12
|
+
For low level requests we offer the {Eloqua::Api::Service} (other Api's
|
13
|
+
soon) with the "api" you can make calls like this:
|
14
|
+
|
15
|
+
Eloqua::Api::Service.describe_type(:asset, 'ContactGroup')
|
16
|
+
|
17
|
+
The majority of the functions in the api require a "group" which
|
18
|
+
is either :entity or :asset.
|
19
|
+
|
20
|
+
The other common object you will need to have on hand is the "type"
|
21
|
+
both entities and assets in Eloqua have types. Types look like this:
|
22
|
+
|
23
|
+
{
|
24
|
+
:id => 1,
|
25
|
+
:type => 'Base',
|
26
|
+
:name => 'Contact'
|
27
|
+
}
|
28
|
+
|
29
|
+
The most important thing is the :type. See
|
30
|
+
{Eloqua::Api::Service.describe} and {Eloqua::Api::Service.describe_type}
|
31
|
+
eloqua provides describe and describe_type for gathering information of
|
32
|
+
types the what fields those types provide. Types are similar to SQL
|
33
|
+
tables.
|
34
|
+
|
35
|
+
Also see {Eloqua::Api.remote_type} a helper method for generating the
|
36
|
+
hash above.
|
37
|
+
|
38
|
+
Here is an example of a find request (which requires a group and type)
|
39
|
+
|
40
|
+
group = :entity
|
41
|
+
type = Eloqua::Api.remote_type('Contact')
|
42
|
+
# => {:id => 1, :type => 'Base', :name => 'Contact'}
|
43
|
+
|
44
|
+
# Executes a Retreive SOAP call
|
45
|
+
record = Eloqua::Api::Service.find_object(
|
46
|
+
group,
|
47
|
+
type,
|
48
|
+
1 # object id
|
49
|
+
)
|
50
|
+
|
51
|
+
record
|
52
|
+
# Keys are internal_name of fields
|
53
|
+
# => {:id => 1, :C_EmailAddress => 'email@address.com', ...}
|
54
|
+
|
55
|
+
Through the low level api we offer the following Eloqua SOAP methods
|
56
|
+
|
57
|
+
|
58
|
+
### Supported low level requests
|
59
|
+
|
60
|
+
- CURD (+ Find)
|
61
|
+
- Retrieve[Asset] => {Eloqua::Api::Service.find_object}
|
62
|
+
- Update[Asset] => {Eloqua::Api::Service.update_object}
|
63
|
+
- Create[Asset] => {Eloqua::Api::Service.create_object}
|
64
|
+
- Delete[Asset] => {Eloqua::Api::Service.delete_object}
|
65
|
+
|
66
|
+
- Describing Fields and Types
|
67
|
+
- Describe[Asset|Entity]Type => {Eloqua::Api::Service.describe_type}
|
68
|
+
- Describe[Asset|Entity] => {Eloqua::Api::Service.describe}
|
69
|
+
- List[Asset|Entity]Types => {Eloqua::Api::Service.list_types}
|
70
|
+
|
71
|
+
- Memberships (Contact Groups)
|
72
|
+
- AddGroupMember => {Eloqua::Api::Service.add_group_member}
|
73
|
+
- RemoveGroupMember => {Eloqua::Api::Service.remove_group_member}
|
74
|
+
- ListGroupMembership => {Eloqua::Api::Service.list_memberships}
|
75
|
+
|
76
|
+
## At a high level (Models)
|
77
|
+
|
78
|
+
Through {Eloqua::Entity} and {Eloqua::Asset} we offer base classes
|
79
|
+
for modeling both entities and assets.
|
80
|
+
|
81
|
+
Both inherit from {Eloqua::RemoteObject} which implements a number of
|
82
|
+
ActiveModel features (persistance, dirty attributes, validations mass
|
83
|
+
assignment security)
|
84
|
+
|
85
|
+
To create a model (Sorry, no generator yet!) its as simple as inheriting
|
86
|
+
from entity or asset and then specifying a type.
|
87
|
+
|
88
|
+
class Contact < Eloqua::Entity
|
89
|
+
self.remote_type = api.remote_type('Contact')
|
90
|
+
end
|
91
|
+
|
92
|
+
With just this you have instant access to the data with familiar
|
93
|
+
{Eloqua::RemoteObject#save save}, {Eloqua::RemoteObject#update_attributes update attributes}, {Eloqua::RemoteObject#persisted? persisted?}, {Eloqua::RemoteObject etc}
|
94
|
+
|
95
|
+
Magic accessor are also created for "map(ped)" attributes or objects
|
96
|
+
that where retreived remotely. See below
|
97
|
+
|
98
|
+
### Attribute Mapping
|
99
|
+
|
100
|
+
|
101
|
+
First you should note that C\_ (thats `/^C\_/`) is replaced from
|
102
|
+
all attribute names and they are underscored (`.underscore`) for instance:
|
103
|
+
|
104
|
+
eloqua_does_this = 'C_EmailAddress'
|
105
|
+
you_do_this = your_model.email_addres
|
106
|
+
|
107
|
+
Because of the naming schema for Eloqua "internal_name" there where many
|
108
|
+
times where I felt I would rather use a different name that was easier
|
109
|
+
to type and remember. With this in mind I created attribute mapping.
|
110
|
+
|
111
|
+
Here we map C_EmailAddress to email
|
112
|
+
|
113
|
+
class Contact < Eloqua::Entity
|
114
|
+
self.remote_type = api.remote_type('Contact')
|
115
|
+
# use the FULL original name including C_ and CamelCase
|
116
|
+
map :C_EmailAddress => :email
|
117
|
+
end
|
118
|
+
|
119
|
+
Now we can reference our contacts email with `.email`
|
120
|
+
|
121
|
+
### Saving your data
|
122
|
+
|
123
|
+
When you retrieve object from Eloqua through {Eloqua::RemoteObject#find
|
124
|
+
find} or through {Eloqua::Query} that object will be aware of all of its
|
125
|
+
attributes (or the ones selected in the query) and will map them back to
|
126
|
+
Eloqua's original `internal_name` scheme during the save.
|
127
|
+
|
128
|
+
When you create a new object however you need define those fields through map.
|
129
|
+
|
130
|
+
class Contact < Eloqua::Entity
|
131
|
+
self.remote_type = api.remote_type('Contact')
|
132
|
+
end
|
133
|
+
|
134
|
+
record = Contact.new
|
135
|
+
record.email_address = 'new@email.com' # ERROR
|
136
|
+
|
137
|
+
class Contact < Eloqua::Entity
|
138
|
+
self.remote_type = api.remote_type('Contact')
|
139
|
+
map :C_EmailAddress => :email_address
|
140
|
+
end
|
141
|
+
|
142
|
+
record = Contact.new
|
143
|
+
record.email= 'new@email.com'
|
144
|
+
record.save # SUCCESS
|
145
|
+
|
146
|
+
# This will successfuly map .email => C_EmailAddress
|
147
|
+
|
148
|
+
### What about class methods?
|
149
|
+
|
150
|
+
Models support all functionality provided in {Eloqua::Api::Service}
|
151
|
+
through {Eloqua.delegate_with_args}.
|
152
|
+
|
153
|
+
Where a group is argument is needed by the low level api the
|
154
|
+
model will provide it with its group (entity or asset).
|
155
|
+
Where a type is needed the model will provide the models
|
156
|
+
{Eloqua::RemoteObject.remote_type remote_type}
|
157
|
+
|
158
|
+
|
159
|
+
# delegates to Eloqua::Api::Service.describe(:entity, Contact.remote_type)
|
160
|
+
Contact.describe
|
161
|
+
|
162
|
+
# delegates to Eloqua::Api::Service.describe_type(:entity, 'Contact')
|
163
|
+
# Notice that the second argument is now the first and is required
|
164
|
+
Contact.describe_type('Contact')
|
165
|
+
|
166
|
+
|
167
|
+
## Queries
|
168
|
+
|
169
|
+
Eloqua provides a method for accessing your data.
|
170
|
+
|
171
|
+
There are a few important things you need to know about this first.
|
172
|
+
|
173
|
+
1. You may only query 200 records at once. You may pull in more via
|
174
|
+
pages in a seperate request (pagination)
|
175
|
+
|
176
|
+
2. You may only make a Query request once per second.
|
177
|
+
(Concurency is a no-go in some situations)
|
178
|
+
|
179
|
+
3. I would highly recommend limiting the returned rows.
|
180
|
+
The limit on other requests is very high so you can make many more
|
181
|
+
find/update/create/delete, etc.. requests then you can queries.
|
182
|
+
|
183
|
+
I would reccomend gathering EloquaIDs through query and then manipulating
|
184
|
+
data through those EloquaIDs in other operations
|
185
|
+
|
186
|
+
Through {Eloqua::Query} you can search through your Eloqua database.
|
187
|
+
|
188
|
+
Given we have this Contact class:
|
189
|
+
|
190
|
+
|
191
|
+
class Contact < Eloqua::Contact
|
192
|
+
self.remote_type = api.remote_type('Contact')
|
193
|
+
|
194
|
+
map :C_EmailAddress => :email
|
195
|
+
map :C_DateCreated => :created_at
|
196
|
+
map :C_DateModified => :updated_at
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
We can then search for all email addresses in the lightsofapollo.com
|
201
|
+
domain.
|
202
|
+
|
203
|
+
# Entity.where is an alias for Eloqua::Query.new(Contact)
|
204
|
+
query = Contact.where
|
205
|
+
query.on(:email, '=', '*@lightsofapollo.com') # * is a wildcard
|
206
|
+
query.all # makes request returns Array
|
207
|
+
|
208
|
+
Or all contacts created today
|
209
|
+
|
210
|
+
query.clear_conditions! # resets request
|
211
|
+
query.on(:created_at, '>', Time.now.strftime('%Y-%m-%d'))
|
212
|
+
query.each do |record| # this will also make request and iterator through results
|
213
|
+
...
|
214
|
+
end
|
215
|
+
|
216
|
+
Or something more complex
|
217
|
+
|
218
|
+
query.clear_conditions!
|
219
|
+
query.on(:email, '=', '*@lightsofapollo.com').\ # email search
|
220
|
+
on(:updated_at, '>', '2011-01-01').\ # updated at >
|
221
|
+
limit(1).\ # we only want one record
|
222
|
+
fields([:email, 'ContactID']) # only return a record with the email and id fields populated
|
223
|
+
|
224
|
+
query.all
|
225
|
+
|
226
|
+
As you might have guessed query will return an Array of Objects of the
|
227
|
+
type given.
|
228
|
+
|
229
|
+
# Will return ContactGroup.new(s)
|
230
|
+
Eloqua::Query.new(ContactGroup)
|
231
|
+
|
232
|
+
|
233
|
+
### For queries that match over 200 records
|
234
|
+
|
235
|
+
For queries that span multiple requests (and you want all records at once)
|
236
|
+
use {Eloqua::Query#each_page} each page functions just like each but
|
237
|
+
will make consecutive requests to fetch all pages. It also takes an
|
238
|
+
optional max pages parameter which allows you to limit the number of
|
239
|
+
pages to fetch and/or pause and resume requests.
|
240
|
+
|
241
|
+
## TODO
|
242
|
+
|
243
|
+
- (inline) Docs [DONE FOR QUERY]
|
244
|
+
- Guide
|
245
|
+
- Email API (ongoing)
|
data/Rakefile
ADDED
data/TODO.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
- Improved SSL for specifying the map of the element and what
|
2
|
+
importer/export to use.
|
3
|
+
|
4
|
+
- Rename 'map' to 'field'
|
5
|
+
|
6
|
+
- Shared Spec helper for better BDD. Currently I run into issues from
|
7
|
+
duplicating from 'map' and the fact there is no easy way to test the
|
8
|
+
mappings themselves.
|
data/eloqua.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require "eloqua/version"
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'eloqua'
|
6
|
+
s.version = Eloqua::VERSION
|
7
|
+
s.date = '2012-07-04'
|
8
|
+
s.authors = ["Brian Jou", "Ryan Caught", "James Lal"]
|
9
|
+
s.email = 'brian@vidyard.com'
|
10
|
+
s.files = ["lib/eloqua.rb"]
|
11
|
+
s.summary = 'Eloqua API for Ruby'
|
12
|
+
s.description = 'An Eloqua API Wrapper for Ruby'
|
13
|
+
|
14
|
+
s.add_runtime_dependency 'savon'
|
15
|
+
s.add_runtime_dependency 'builder'
|
16
|
+
s.add_runtime_dependency 'activemodel'
|
17
|
+
s.add_runtime_dependency 'activesupport', '= 3.0.6'
|
18
|
+
s.add_runtime_dependency 'i18n', '= 0.5.0'
|
19
|
+
s.add_development_dependency 'watchr'
|
20
|
+
s.add_development_dependency 'ruby-fsevent'
|
21
|
+
s.add_development_dependency 'ruby-debug19'
|
22
|
+
s.add_development_dependency 'savon_spec'
|
23
|
+
s.add_development_dependency 'rspec'
|
24
|
+
s.add_development_dependency 'flexmock'
|
25
|
+
s.add_development_dependency 'timecop'
|
26
|
+
s.add_development_dependency 'ci_reporter'
|
27
|
+
|
28
|
+
s.files = `git ls-files`.split("\n")
|
29
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
30
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
31
|
+
s.require_paths = ["lib"]
|
32
|
+
end
|