twitter-ads 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/CONTRIBUTING.md +77 -0
- data/LICENSE +22 -0
- data/README.md +111 -0
- data/Rakefile +86 -0
- data/bin/twitter-ads +42 -0
- data/lib/twitter-ads.rb +54 -0
- data/lib/twitter-ads/account.rb +229 -0
- data/lib/twitter-ads/audiences/tailored_audience.rb +177 -0
- data/lib/twitter-ads/campaign/app_list.rb +42 -0
- data/lib/twitter-ads/campaign/campaign.rb +40 -0
- data/lib/twitter-ads/campaign/funding_instrument.rb +33 -0
- data/lib/twitter-ads/campaign/line_item.rb +91 -0
- data/lib/twitter-ads/campaign/promotable_user.rb +28 -0
- data/lib/twitter-ads/campaign/targeting_criteria.rb +77 -0
- data/lib/twitter-ads/campaign/tweet.rb +83 -0
- data/lib/twitter-ads/client.rb +92 -0
- data/lib/twitter-ads/creative/app_download_card.rb +44 -0
- data/lib/twitter-ads/creative/image_app_download_card.rb +44 -0
- data/lib/twitter-ads/creative/image_conversation_card.rb +44 -0
- data/lib/twitter-ads/creative/lead_gen_card.rb +46 -0
- data/lib/twitter-ads/creative/promoted_account.rb +38 -0
- data/lib/twitter-ads/creative/promoted_tweet.rb +87 -0
- data/lib/twitter-ads/creative/video.rb +43 -0
- data/lib/twitter-ads/creative/video_app_download_card.rb +47 -0
- data/lib/twitter-ads/creative/video_conversation_card.rb +46 -0
- data/lib/twitter-ads/creative/website_card.rb +48 -0
- data/lib/twitter-ads/cursor.rb +127 -0
- data/lib/twitter-ads/enum.rb +135 -0
- data/lib/twitter-ads/error.rb +93 -0
- data/lib/twitter-ads/http/request.rb +127 -0
- data/lib/twitter-ads/http/response.rb +74 -0
- data/lib/twitter-ads/http/ton_upload.rb +140 -0
- data/lib/twitter-ads/legacy.rb +7 -0
- data/lib/twitter-ads/resources/analytics.rb +90 -0
- data/lib/twitter-ads/resources/dsl.rb +108 -0
- data/lib/twitter-ads/resources/persistence.rb +43 -0
- data/lib/twitter-ads/resources/resource.rb +92 -0
- data/lib/twitter-ads/targeting/reach_estimate.rb +69 -0
- data/lib/twitter-ads/utils.rb +76 -0
- data/lib/twitter-ads/version.rb +6 -0
- data/spec/fixtures/accounts_all.json +65 -0
- data/spec/fixtures/accounts_features.json +18 -0
- data/spec/fixtures/accounts_load.json +19 -0
- data/spec/fixtures/app_lists_all.json +22 -0
- data/spec/fixtures/app_lists_load.json +31 -0
- data/spec/fixtures/campaigns_all.json +208 -0
- data/spec/fixtures/campaigns_load.json +27 -0
- data/spec/fixtures/funding_instruments_all.json +74 -0
- data/spec/fixtures/funding_instruments_load.json +28 -0
- data/spec/fixtures/line_items_all.json +292 -0
- data/spec/fixtures/line_items_load.json +36 -0
- data/spec/fixtures/placements.json +35 -0
- data/spec/fixtures/promotable_users_all.json +57 -0
- data/spec/fixtures/promotable_users_load.json +18 -0
- data/spec/fixtures/promoted_tweets_all.json +212 -0
- data/spec/fixtures/promoted_tweets_load.json +19 -0
- data/spec/fixtures/reach_estimate.json +19 -0
- data/spec/fixtures/tailored_audiences_all.json +67 -0
- data/spec/fixtures/tailored_audiences_load.json +29 -0
- data/spec/fixtures/tweet_preview.json +24 -0
- data/spec/fixtures/videos_all.json +50 -0
- data/spec/fixtures/videos_load.json +22 -0
- data/spec/quality_spec.rb +15 -0
- data/spec/shared/properties.rb +20 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/helpers.rb +42 -0
- data/spec/twitter-ads/account_spec.rb +315 -0
- data/spec/twitter-ads/audiences/tailored_audience_spec.rb +45 -0
- data/spec/twitter-ads/campaign/app_list_spec.rb +108 -0
- data/spec/twitter-ads/campaign/line_item_spec.rb +95 -0
- data/spec/twitter-ads/campaign/reach_estimate_spec.rb +98 -0
- data/spec/twitter-ads/campaign/targeting_criteria_spec.rb +39 -0
- data/spec/twitter-ads/campaign/tweet_spec.rb +83 -0
- data/spec/twitter-ads/client_spec.rb +115 -0
- data/spec/twitter-ads/creative/app_download_card_spec.rb +44 -0
- data/spec/twitter-ads/creative/image_app_download_card_spec.rb +43 -0
- data/spec/twitter-ads/creative/image_conversation_card_spec.rb +40 -0
- data/spec/twitter-ads/creative/lead_gen_card_spec.rb +46 -0
- data/spec/twitter-ads/creative/promoted_account_spec.rb +30 -0
- data/spec/twitter-ads/creative/promoted_tweet_spec.rb +46 -0
- data/spec/twitter-ads/creative/video_app_download_card_spec.rb +42 -0
- data/spec/twitter-ads/creative/video_conversation_card_spec.rb +52 -0
- data/spec/twitter-ads/creative/video_legacy_spec.rb +43 -0
- data/spec/twitter-ads/creative/video_spec.rb +43 -0
- data/spec/twitter-ads/creative/website_card_spec.rb +37 -0
- data/spec/twitter-ads/cursor_spec.rb +67 -0
- data/spec/twitter-ads/placements_spec.rb +36 -0
- data/spec/twitter-ads/utils_spec.rb +101 -0
- data/twitter-ads.gemspec +37 -0
- metadata +247 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Video do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_fixture(:get, :accounts_all, "#{ADS_API}/accounts")
|
10
|
+
stub_fixture(:get, :accounts_load, "#{ADS_API}/accounts/2iqph")
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:client) do
|
14
|
+
Client.new(
|
15
|
+
Faker::Lorem.characters(15),
|
16
|
+
Faker::Lorem.characters(40),
|
17
|
+
"123456-#{Faker::Lorem.characters(40)}",
|
18
|
+
Faker::Lorem.characters(40)
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:account) { client.accounts.first }
|
23
|
+
|
24
|
+
# check model properties
|
25
|
+
subject { described_class.new(account) }
|
26
|
+
|
27
|
+
read = %w(
|
28
|
+
id
|
29
|
+
tweeted
|
30
|
+
ready_to_tweet
|
31
|
+
duration
|
32
|
+
reasons_not_servable
|
33
|
+
preview_url
|
34
|
+
created_at
|
35
|
+
updated_at
|
36
|
+
deleted
|
37
|
+
)
|
38
|
+
|
39
|
+
write = %w(title description video_media_id)
|
40
|
+
|
41
|
+
include_examples 'object property check', read, write
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Creative::Video do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_fixture(:get, :accounts_all, "#{ADS_API}/accounts")
|
10
|
+
stub_fixture(:get, :accounts_load, "#{ADS_API}/accounts/2iqph")
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:client) do
|
14
|
+
Client.new(
|
15
|
+
Faker::Lorem.characters(15),
|
16
|
+
Faker::Lorem.characters(40),
|
17
|
+
"123456-#{Faker::Lorem.characters(40)}",
|
18
|
+
Faker::Lorem.characters(40)
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:account) { client.accounts.first }
|
23
|
+
|
24
|
+
# check model properties
|
25
|
+
subject { described_class.new(account) }
|
26
|
+
|
27
|
+
read = %w(
|
28
|
+
id
|
29
|
+
tweeted
|
30
|
+
ready_to_tweet
|
31
|
+
duration
|
32
|
+
reasons_not_servable
|
33
|
+
preview_url
|
34
|
+
created_at
|
35
|
+
updated_at
|
36
|
+
deleted
|
37
|
+
)
|
38
|
+
|
39
|
+
write = %w(title description video_media_id)
|
40
|
+
|
41
|
+
include_examples 'object property check', read, write
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Creative::WebsiteCard do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_fixture(:get, :accounts_all, "#{ADS_API}/accounts")
|
10
|
+
stub_fixture(:get, :accounts_load, "#{ADS_API}/accounts/2iqph")
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:client) do
|
14
|
+
Client.new(
|
15
|
+
Faker::Lorem.characters(15),
|
16
|
+
Faker::Lorem.characters(40),
|
17
|
+
"123456-#{Faker::Lorem.characters(40)}",
|
18
|
+
Faker::Lorem.characters(40)
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:account) { client.accounts.first }
|
23
|
+
|
24
|
+
# check model properties
|
25
|
+
subject { described_class.new(account) }
|
26
|
+
read = %w(id preview_url created_at updated_at deleted)
|
27
|
+
write = %w(name website_title website_url website_cta image_media_id)
|
28
|
+
include_examples 'object property check', read, write
|
29
|
+
|
30
|
+
it 'raises a warning message each time website_cta is set' do
|
31
|
+
expect(TwitterAds::Utils).to receive(:deprecated).with(
|
32
|
+
'TwitterAds::Creative::WebsiteCard#website_cta',
|
33
|
+
refer: 'https://t.co/deprecated-website-card-cta')
|
34
|
+
subject.website_cta = 'any value'
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Cursor do
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
stub_fixture(:get, :accounts_all, "#{ADS_API}/accounts")
|
10
|
+
stub_fixture(:get, :accounts_load, "#{ADS_API}/accounts/2iqph")
|
11
|
+
stub_fixture(:get, :campaigns_all, "#{ADS_API}/accounts/2iqph/campaigns")
|
12
|
+
stub_fixture(:get, :app_lists_all, "#{ADS_API}/accounts/2iqph/app_lists")
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:client) do
|
16
|
+
Client.new(
|
17
|
+
Faker::Lorem.characters(15),
|
18
|
+
Faker::Lorem.characters(40),
|
19
|
+
"123456-#{Faker::Lorem.characters(40)}",
|
20
|
+
Faker::Lorem.characters(40)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:account) { client.accounts.first }
|
25
|
+
|
26
|
+
describe '#last' do
|
27
|
+
|
28
|
+
let(:cursor) { account.campaigns }
|
29
|
+
|
30
|
+
it 'exhausts the Cursor and returns the last object' do
|
31
|
+
expect(cursor).to receive(:each).and_call_original
|
32
|
+
result = cursor.last
|
33
|
+
expect(result).not_to be_nil
|
34
|
+
expect(result).to eq(cursor.instance_variable_get('@collection').last)
|
35
|
+
expect(cursor.exhausted?).to be true
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#count' do
|
41
|
+
|
42
|
+
context 'for non-standard responses' do
|
43
|
+
|
44
|
+
let(:cursor) { account.app_lists }
|
45
|
+
|
46
|
+
it 'returns the correct count for non-standard responses' do
|
47
|
+
expect(cursor.count).to eq(3)
|
48
|
+
expect(cursor.instance_variable_get('@total_count')).to be_nil
|
49
|
+
expect(cursor.exhausted?).to be true
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'for standard responses' do
|
55
|
+
|
56
|
+
let(:cursor) { account.campaigns }
|
57
|
+
|
58
|
+
it 'returns the correct count for non-standard responses' do
|
59
|
+
expect(cursor.instance_variable_get('@total_count')).not_to be_nil
|
60
|
+
expect(cursor.count).to eq(cursor.instance_variable_get('@total_count'))
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Placement do
|
7
|
+
|
8
|
+
let(:client) do
|
9
|
+
Client.new(
|
10
|
+
Faker::Lorem.characters(15),
|
11
|
+
Faker::Lorem.characters(40),
|
12
|
+
"123456-#{Faker::Lorem.characters(40)}",
|
13
|
+
Faker::Lorem.characters(40)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#valid_combinations' do
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
url = Addressable::Template.new "#{ADS_API}/line_items/placements{?product_type}"
|
21
|
+
stub_fixture(:get, :placements, url)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:product_type) { TwitterAds::Product::PROMOTED_TWEETS }
|
25
|
+
|
26
|
+
it 'successfully fetches valid placement / product type combinations' do
|
27
|
+
expect(TwitterAds::Utils).to receive(:deprecated).and_call_original
|
28
|
+
expect(TwitterAds::LineItem).to receive(:placements).and_call_original
|
29
|
+
result = silence { subject.valid_combinations(client, product_type) }
|
30
|
+
expect(result.size).not_to be_nil
|
31
|
+
expect(result).to all(be_a(Array))
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
describe TwitterAds::Utils do
|
7
|
+
|
8
|
+
describe '#to_bool' do
|
9
|
+
|
10
|
+
it 'successfully coerces "nil" to its correct boolean value' do
|
11
|
+
expect(subject.to_bool(nil)).to be false
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'successfully coerces "true" to its correct boolean value' do
|
15
|
+
expect(subject.to_bool(true)).to be true
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'successfully coerces "false" to its correct boolean value' do
|
19
|
+
expect(subject.to_bool(false)).to be false
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'does not coerces numerical values' do
|
23
|
+
expect(subject.to_bool(0)).to be true
|
24
|
+
expect(subject.to_bool(1)).to be true
|
25
|
+
expect(subject.to_bool(999)).to be true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#to_time' do
|
31
|
+
|
32
|
+
let(:time) { Time.now }
|
33
|
+
|
34
|
+
context 'when a granularity is not specified' do
|
35
|
+
|
36
|
+
it 'returns the ISO 8601 formatted string' do
|
37
|
+
expect(subject.to_time(time)).to eq(time.iso8601)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when a granularity is specified' do
|
43
|
+
|
44
|
+
it 'returns the ISO 8601 formatted string for :hour rounded to the hour' do
|
45
|
+
expected_result = Time.new(time.year, time.month, time.day, time.hour).iso8601
|
46
|
+
expect(subject.to_time(time, :hour)).to eq(expected_result)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns the ISO 8601 formatted string for :day rounded to the day' do
|
50
|
+
expected_result = Time.new(time.year, time.month, time.day).iso8601
|
51
|
+
expect(subject.to_time(time, :day)).to eq(expected_result)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns the ISO 8601 formatted string for all other granularities' do
|
55
|
+
expect(subject.to_time(time, :total)).to eq(time.iso8601)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#symbolize!' do
|
63
|
+
|
64
|
+
context 'with a simple object' do
|
65
|
+
|
66
|
+
let(:simple) { { 'key1' => 'foo', 'key2' => 'bar', 'key3' => 1234 } }
|
67
|
+
|
68
|
+
it 'successfully converts all keys to symbols' do
|
69
|
+
result = subject.symbolize!(simple)
|
70
|
+
expect(result.keys).to all(be_a(Symbol))
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with a nested object' do
|
76
|
+
|
77
|
+
let(:nested) { { 'key1' => 'foo', 'key2' => { 'key3' => 1 } } }
|
78
|
+
|
79
|
+
it 'successfully converts the nested object keys to symbols' do
|
80
|
+
result = subject.symbolize!(nested)
|
81
|
+
expect(result.keys).to all(be_a(Symbol))
|
82
|
+
expect(result[:key2].keys).to all(be_a(Symbol))
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with a nested collection of objects' do
|
88
|
+
|
89
|
+
let(:nested) { { 'key1' => 'foo', 'key2' => [{ 'key3' => 1 }] } }
|
90
|
+
|
91
|
+
it 'successfully converts the collection of objects keys to symbols' do
|
92
|
+
result = subject.symbolize!(nested)
|
93
|
+
expect(result.keys).to all(be_a(Symbol))
|
94
|
+
expect(result[:key2][0].keys).to all(be_a(Symbol))
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
data/twitter-ads.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright (C) 2015 Twitter, Inc.
|
3
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
4
|
+
require File.expand_path('../lib/twitter-ads/version', __FILE__)
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'twitter-ads'
|
8
|
+
s.version = TwitterAds::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.licenses = ['MIT']
|
11
|
+
s.authors = ['Brandon Black']
|
12
|
+
s.email = ['brandonmblack@gmail.com']
|
13
|
+
s.homepage = 'https://github.com/twitterdev/twitter-ruby-ads-sdk'
|
14
|
+
s.description = 'The officially supported Twitter Ads API SDK for Ruby.'
|
15
|
+
s.summary = s.description
|
16
|
+
|
17
|
+
s.required_ruby_version = '>= 2.0.0'
|
18
|
+
s.required_rubygems_version = '>= 2.0.0'
|
19
|
+
|
20
|
+
if File.exist?('private.pem')
|
21
|
+
s.signing_key = 'private.pem'
|
22
|
+
s.cert_chain = ['public.pem']
|
23
|
+
else
|
24
|
+
warn 'WARNING: No private key present, creating unsigned gem.'
|
25
|
+
end
|
26
|
+
|
27
|
+
s.add_dependency 'multi_json', '~> 1.11'
|
28
|
+
s.add_dependency 'oauth', '~> 0.4'
|
29
|
+
|
30
|
+
s.add_development_dependency 'bundler', '~> 1.6'
|
31
|
+
|
32
|
+
s.files = Dir.glob('{bin,lib}/**/*')
|
33
|
+
s.files += %w(twitter-ads.gemspec LICENSE README.md CONTRIBUTING.md Rakefile)
|
34
|
+
s.test_files = Dir.glob('{spec,feature}/**/*')
|
35
|
+
s.executables = 'twitter-ads'
|
36
|
+
s.require_paths = ['lib']
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twitter-ads
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brandon Black
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ8wDQYDVQQDDAZiYmxh
|
14
|
+
Y2sxFzAVBgoJkiaJk/IsZAEZFgd0d2l0dGVyMRMwEQYKCZImiZPyLGQBGRYDY29t
|
15
|
+
MB4XDTE1MDUxNDIwMzE0OFoXDTE2MDUxMzIwMzE0OFowPzEPMA0GA1UEAwwGYmJs
|
16
|
+
YWNrMRcwFQYKCZImiZPyLGQBGRYHdHdpdHRlcjETMBEGCgmSJomT8ixkARkWA2Nv
|
17
|
+
bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALFcA39CQg7YbcP8v2By
|
18
|
+
AzyhEpVlrxa2ohJ7LFmi8/Xw8cxS3/XvweWJuufambhfpT/KkUcf0FMA4egt3w8c
|
19
|
+
PYanwpUCyBnLCXsMvFWGBnyWQqVNSg6CKTVcY1urtCUSA3Jv5KKBPffSUoTOCL5E
|
20
|
+
uLD3BW9VnPS4Z9SOKzhg7c4aIr0siNBf0/AU0aiwtOhqgJpRkECcd5C74JdYTLdF
|
21
|
+
5Gdxzxifr50Em+lojr+hatfYZ51gOksPBtqotQ4l+vSth9JQB8jX1DOfHf/4LdGJ
|
22
|
+
Y7b9bOORAx4XPncn6VXlNH5YUVRu/pshNf5N0YbQUgXKMG/M0Drxv+VmHpxeg3Ep
|
23
|
+
MSsCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJdU
|
24
|
+
3qERWamEyBidCvO8vyO4Ofj8MB0GA1UdEQQWMBSBEmJibGFja0B0d2l0dGVyLmNv
|
25
|
+
bTAdBgNVHRIEFjAUgRJiYmxhY2tAdHdpdHRlci5jb20wDQYJKoZIhvcNAQEFBQAD
|
26
|
+
ggEBAAEqjpDTcLHBKDhqqSDMmW0gWQTYHBuyKAUuaEleE9fWBS+q9SIPmQSoj2yX
|
27
|
+
aqzkMmCvcTpiIoVlu2QtYvxtI6bef+HM50hkNjF+AeEyhTSucLxRmg232CzykGZa
|
28
|
+
sIuWL8AhyPmyLaIi5gsGXUIChk4aXcXE8iD/VGWyPZ3r8zV/EA8dTnT/iVYkxpTv
|
29
|
+
dUlOT1v22STyPF3Zttqqe5XtOtIN9+i3Szoi1OGueqSB9+XMZyinZoxherrs1BVH
|
30
|
+
8Jwp/juPnThUiQlA6qjWMlKQJW9Junn+gQJWm6jW/hR3klmk4uPIB+wxSW2J2K50
|
31
|
+
aU47pXYcbHgF3qfpEAXAq9qH06E=
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2016-02-10 00:00:00.000000000 Z
|
34
|
+
dependencies:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: multi_json
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.11'
|
42
|
+
type: :runtime
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.11'
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: oauth
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0.4'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0.4'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: bundler
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.6'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '1.6'
|
77
|
+
description: The officially supported Twitter Ads API SDK for Ruby.
|
78
|
+
email:
|
79
|
+
- brandonmblack@gmail.com
|
80
|
+
executables:
|
81
|
+
- twitter-ads
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- CONTRIBUTING.md
|
86
|
+
- LICENSE
|
87
|
+
- README.md
|
88
|
+
- Rakefile
|
89
|
+
- bin/twitter-ads
|
90
|
+
- lib/twitter-ads.rb
|
91
|
+
- lib/twitter-ads/account.rb
|
92
|
+
- lib/twitter-ads/audiences/tailored_audience.rb
|
93
|
+
- lib/twitter-ads/campaign/app_list.rb
|
94
|
+
- lib/twitter-ads/campaign/campaign.rb
|
95
|
+
- lib/twitter-ads/campaign/funding_instrument.rb
|
96
|
+
- lib/twitter-ads/campaign/line_item.rb
|
97
|
+
- lib/twitter-ads/campaign/promotable_user.rb
|
98
|
+
- lib/twitter-ads/campaign/targeting_criteria.rb
|
99
|
+
- lib/twitter-ads/campaign/tweet.rb
|
100
|
+
- lib/twitter-ads/client.rb
|
101
|
+
- lib/twitter-ads/creative/app_download_card.rb
|
102
|
+
- lib/twitter-ads/creative/image_app_download_card.rb
|
103
|
+
- lib/twitter-ads/creative/image_conversation_card.rb
|
104
|
+
- lib/twitter-ads/creative/lead_gen_card.rb
|
105
|
+
- lib/twitter-ads/creative/promoted_account.rb
|
106
|
+
- lib/twitter-ads/creative/promoted_tweet.rb
|
107
|
+
- lib/twitter-ads/creative/video.rb
|
108
|
+
- lib/twitter-ads/creative/video_app_download_card.rb
|
109
|
+
- lib/twitter-ads/creative/video_conversation_card.rb
|
110
|
+
- lib/twitter-ads/creative/website_card.rb
|
111
|
+
- lib/twitter-ads/cursor.rb
|
112
|
+
- lib/twitter-ads/enum.rb
|
113
|
+
- lib/twitter-ads/error.rb
|
114
|
+
- lib/twitter-ads/http/request.rb
|
115
|
+
- lib/twitter-ads/http/response.rb
|
116
|
+
- lib/twitter-ads/http/ton_upload.rb
|
117
|
+
- lib/twitter-ads/legacy.rb
|
118
|
+
- lib/twitter-ads/resources/analytics.rb
|
119
|
+
- lib/twitter-ads/resources/dsl.rb
|
120
|
+
- lib/twitter-ads/resources/persistence.rb
|
121
|
+
- lib/twitter-ads/resources/resource.rb
|
122
|
+
- lib/twitter-ads/targeting/reach_estimate.rb
|
123
|
+
- lib/twitter-ads/utils.rb
|
124
|
+
- lib/twitter-ads/version.rb
|
125
|
+
- spec/fixtures/accounts_all.json
|
126
|
+
- spec/fixtures/accounts_features.json
|
127
|
+
- spec/fixtures/accounts_load.json
|
128
|
+
- spec/fixtures/app_lists_all.json
|
129
|
+
- spec/fixtures/app_lists_load.json
|
130
|
+
- spec/fixtures/campaigns_all.json
|
131
|
+
- spec/fixtures/campaigns_load.json
|
132
|
+
- spec/fixtures/funding_instruments_all.json
|
133
|
+
- spec/fixtures/funding_instruments_load.json
|
134
|
+
- spec/fixtures/line_items_all.json
|
135
|
+
- spec/fixtures/line_items_load.json
|
136
|
+
- spec/fixtures/placements.json
|
137
|
+
- spec/fixtures/promotable_users_all.json
|
138
|
+
- spec/fixtures/promotable_users_load.json
|
139
|
+
- spec/fixtures/promoted_tweets_all.json
|
140
|
+
- spec/fixtures/promoted_tweets_load.json
|
141
|
+
- spec/fixtures/reach_estimate.json
|
142
|
+
- spec/fixtures/tailored_audiences_all.json
|
143
|
+
- spec/fixtures/tailored_audiences_load.json
|
144
|
+
- spec/fixtures/tweet_preview.json
|
145
|
+
- spec/fixtures/videos_all.json
|
146
|
+
- spec/fixtures/videos_load.json
|
147
|
+
- spec/quality_spec.rb
|
148
|
+
- spec/shared/properties.rb
|
149
|
+
- spec/spec_helper.rb
|
150
|
+
- spec/support/helpers.rb
|
151
|
+
- spec/twitter-ads/account_spec.rb
|
152
|
+
- spec/twitter-ads/audiences/tailored_audience_spec.rb
|
153
|
+
- spec/twitter-ads/campaign/app_list_spec.rb
|
154
|
+
- spec/twitter-ads/campaign/line_item_spec.rb
|
155
|
+
- spec/twitter-ads/campaign/reach_estimate_spec.rb
|
156
|
+
- spec/twitter-ads/campaign/targeting_criteria_spec.rb
|
157
|
+
- spec/twitter-ads/campaign/tweet_spec.rb
|
158
|
+
- spec/twitter-ads/client_spec.rb
|
159
|
+
- spec/twitter-ads/creative/app_download_card_spec.rb
|
160
|
+
- spec/twitter-ads/creative/image_app_download_card_spec.rb
|
161
|
+
- spec/twitter-ads/creative/image_conversation_card_spec.rb
|
162
|
+
- spec/twitter-ads/creative/lead_gen_card_spec.rb
|
163
|
+
- spec/twitter-ads/creative/promoted_account_spec.rb
|
164
|
+
- spec/twitter-ads/creative/promoted_tweet_spec.rb
|
165
|
+
- spec/twitter-ads/creative/video_app_download_card_spec.rb
|
166
|
+
- spec/twitter-ads/creative/video_conversation_card_spec.rb
|
167
|
+
- spec/twitter-ads/creative/video_legacy_spec.rb
|
168
|
+
- spec/twitter-ads/creative/video_spec.rb
|
169
|
+
- spec/twitter-ads/creative/website_card_spec.rb
|
170
|
+
- spec/twitter-ads/cursor_spec.rb
|
171
|
+
- spec/twitter-ads/placements_spec.rb
|
172
|
+
- spec/twitter-ads/utils_spec.rb
|
173
|
+
- twitter-ads.gemspec
|
174
|
+
homepage: https://github.com/twitterdev/twitter-ruby-ads-sdk
|
175
|
+
licenses:
|
176
|
+
- MIT
|
177
|
+
metadata: {}
|
178
|
+
post_install_message:
|
179
|
+
rdoc_options: []
|
180
|
+
require_paths:
|
181
|
+
- lib
|
182
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: 2.0.0
|
187
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
|
+
requirements:
|
189
|
+
- - ">="
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: 2.0.0
|
192
|
+
requirements: []
|
193
|
+
rubyforge_project:
|
194
|
+
rubygems_version: 2.5.1
|
195
|
+
signing_key:
|
196
|
+
specification_version: 4
|
197
|
+
summary: The officially supported Twitter Ads API SDK for Ruby.
|
198
|
+
test_files:
|
199
|
+
- spec/fixtures/accounts_all.json
|
200
|
+
- spec/fixtures/accounts_features.json
|
201
|
+
- spec/fixtures/accounts_load.json
|
202
|
+
- spec/fixtures/app_lists_all.json
|
203
|
+
- spec/fixtures/app_lists_load.json
|
204
|
+
- spec/fixtures/campaigns_all.json
|
205
|
+
- spec/fixtures/campaigns_load.json
|
206
|
+
- spec/fixtures/funding_instruments_all.json
|
207
|
+
- spec/fixtures/funding_instruments_load.json
|
208
|
+
- spec/fixtures/line_items_all.json
|
209
|
+
- spec/fixtures/line_items_load.json
|
210
|
+
- spec/fixtures/placements.json
|
211
|
+
- spec/fixtures/promotable_users_all.json
|
212
|
+
- spec/fixtures/promotable_users_load.json
|
213
|
+
- spec/fixtures/promoted_tweets_all.json
|
214
|
+
- spec/fixtures/promoted_tweets_load.json
|
215
|
+
- spec/fixtures/reach_estimate.json
|
216
|
+
- spec/fixtures/tailored_audiences_all.json
|
217
|
+
- spec/fixtures/tailored_audiences_load.json
|
218
|
+
- spec/fixtures/tweet_preview.json
|
219
|
+
- spec/fixtures/videos_all.json
|
220
|
+
- spec/fixtures/videos_load.json
|
221
|
+
- spec/quality_spec.rb
|
222
|
+
- spec/shared/properties.rb
|
223
|
+
- spec/spec_helper.rb
|
224
|
+
- spec/support/helpers.rb
|
225
|
+
- spec/twitter-ads/account_spec.rb
|
226
|
+
- spec/twitter-ads/audiences/tailored_audience_spec.rb
|
227
|
+
- spec/twitter-ads/campaign/app_list_spec.rb
|
228
|
+
- spec/twitter-ads/campaign/line_item_spec.rb
|
229
|
+
- spec/twitter-ads/campaign/reach_estimate_spec.rb
|
230
|
+
- spec/twitter-ads/campaign/targeting_criteria_spec.rb
|
231
|
+
- spec/twitter-ads/campaign/tweet_spec.rb
|
232
|
+
- spec/twitter-ads/client_spec.rb
|
233
|
+
- spec/twitter-ads/creative/app_download_card_spec.rb
|
234
|
+
- spec/twitter-ads/creative/image_app_download_card_spec.rb
|
235
|
+
- spec/twitter-ads/creative/image_conversation_card_spec.rb
|
236
|
+
- spec/twitter-ads/creative/lead_gen_card_spec.rb
|
237
|
+
- spec/twitter-ads/creative/promoted_account_spec.rb
|
238
|
+
- spec/twitter-ads/creative/promoted_tweet_spec.rb
|
239
|
+
- spec/twitter-ads/creative/video_app_download_card_spec.rb
|
240
|
+
- spec/twitter-ads/creative/video_conversation_card_spec.rb
|
241
|
+
- spec/twitter-ads/creative/video_legacy_spec.rb
|
242
|
+
- spec/twitter-ads/creative/video_spec.rb
|
243
|
+
- spec/twitter-ads/creative/website_card_spec.rb
|
244
|
+
- spec/twitter-ads/cursor_spec.rb
|
245
|
+
- spec/twitter-ads/placements_spec.rb
|
246
|
+
- spec/twitter-ads/utils_spec.rb
|
247
|
+
has_rdoc:
|