twitter-ads 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -0
  4. data/CONTRIBUTING.md +77 -0
  5. data/LICENSE +22 -0
  6. data/README.md +111 -0
  7. data/Rakefile +86 -0
  8. data/bin/twitter-ads +42 -0
  9. data/lib/twitter-ads.rb +54 -0
  10. data/lib/twitter-ads/account.rb +229 -0
  11. data/lib/twitter-ads/audiences/tailored_audience.rb +177 -0
  12. data/lib/twitter-ads/campaign/app_list.rb +42 -0
  13. data/lib/twitter-ads/campaign/campaign.rb +40 -0
  14. data/lib/twitter-ads/campaign/funding_instrument.rb +33 -0
  15. data/lib/twitter-ads/campaign/line_item.rb +91 -0
  16. data/lib/twitter-ads/campaign/promotable_user.rb +28 -0
  17. data/lib/twitter-ads/campaign/targeting_criteria.rb +77 -0
  18. data/lib/twitter-ads/campaign/tweet.rb +83 -0
  19. data/lib/twitter-ads/client.rb +92 -0
  20. data/lib/twitter-ads/creative/app_download_card.rb +44 -0
  21. data/lib/twitter-ads/creative/image_app_download_card.rb +44 -0
  22. data/lib/twitter-ads/creative/image_conversation_card.rb +44 -0
  23. data/lib/twitter-ads/creative/lead_gen_card.rb +46 -0
  24. data/lib/twitter-ads/creative/promoted_account.rb +38 -0
  25. data/lib/twitter-ads/creative/promoted_tweet.rb +87 -0
  26. data/lib/twitter-ads/creative/video.rb +43 -0
  27. data/lib/twitter-ads/creative/video_app_download_card.rb +47 -0
  28. data/lib/twitter-ads/creative/video_conversation_card.rb +46 -0
  29. data/lib/twitter-ads/creative/website_card.rb +48 -0
  30. data/lib/twitter-ads/cursor.rb +127 -0
  31. data/lib/twitter-ads/enum.rb +135 -0
  32. data/lib/twitter-ads/error.rb +93 -0
  33. data/lib/twitter-ads/http/request.rb +127 -0
  34. data/lib/twitter-ads/http/response.rb +74 -0
  35. data/lib/twitter-ads/http/ton_upload.rb +140 -0
  36. data/lib/twitter-ads/legacy.rb +7 -0
  37. data/lib/twitter-ads/resources/analytics.rb +90 -0
  38. data/lib/twitter-ads/resources/dsl.rb +108 -0
  39. data/lib/twitter-ads/resources/persistence.rb +43 -0
  40. data/lib/twitter-ads/resources/resource.rb +92 -0
  41. data/lib/twitter-ads/targeting/reach_estimate.rb +69 -0
  42. data/lib/twitter-ads/utils.rb +76 -0
  43. data/lib/twitter-ads/version.rb +6 -0
  44. data/spec/fixtures/accounts_all.json +65 -0
  45. data/spec/fixtures/accounts_features.json +18 -0
  46. data/spec/fixtures/accounts_load.json +19 -0
  47. data/spec/fixtures/app_lists_all.json +22 -0
  48. data/spec/fixtures/app_lists_load.json +31 -0
  49. data/spec/fixtures/campaigns_all.json +208 -0
  50. data/spec/fixtures/campaigns_load.json +27 -0
  51. data/spec/fixtures/funding_instruments_all.json +74 -0
  52. data/spec/fixtures/funding_instruments_load.json +28 -0
  53. data/spec/fixtures/line_items_all.json +292 -0
  54. data/spec/fixtures/line_items_load.json +36 -0
  55. data/spec/fixtures/placements.json +35 -0
  56. data/spec/fixtures/promotable_users_all.json +57 -0
  57. data/spec/fixtures/promotable_users_load.json +18 -0
  58. data/spec/fixtures/promoted_tweets_all.json +212 -0
  59. data/spec/fixtures/promoted_tweets_load.json +19 -0
  60. data/spec/fixtures/reach_estimate.json +19 -0
  61. data/spec/fixtures/tailored_audiences_all.json +67 -0
  62. data/spec/fixtures/tailored_audiences_load.json +29 -0
  63. data/spec/fixtures/tweet_preview.json +24 -0
  64. data/spec/fixtures/videos_all.json +50 -0
  65. data/spec/fixtures/videos_load.json +22 -0
  66. data/spec/quality_spec.rb +15 -0
  67. data/spec/shared/properties.rb +20 -0
  68. data/spec/spec_helper.rb +61 -0
  69. data/spec/support/helpers.rb +42 -0
  70. data/spec/twitter-ads/account_spec.rb +315 -0
  71. data/spec/twitter-ads/audiences/tailored_audience_spec.rb +45 -0
  72. data/spec/twitter-ads/campaign/app_list_spec.rb +108 -0
  73. data/spec/twitter-ads/campaign/line_item_spec.rb +95 -0
  74. data/spec/twitter-ads/campaign/reach_estimate_spec.rb +98 -0
  75. data/spec/twitter-ads/campaign/targeting_criteria_spec.rb +39 -0
  76. data/spec/twitter-ads/campaign/tweet_spec.rb +83 -0
  77. data/spec/twitter-ads/client_spec.rb +115 -0
  78. data/spec/twitter-ads/creative/app_download_card_spec.rb +44 -0
  79. data/spec/twitter-ads/creative/image_app_download_card_spec.rb +43 -0
  80. data/spec/twitter-ads/creative/image_conversation_card_spec.rb +40 -0
  81. data/spec/twitter-ads/creative/lead_gen_card_spec.rb +46 -0
  82. data/spec/twitter-ads/creative/promoted_account_spec.rb +30 -0
  83. data/spec/twitter-ads/creative/promoted_tweet_spec.rb +46 -0
  84. data/spec/twitter-ads/creative/video_app_download_card_spec.rb +42 -0
  85. data/spec/twitter-ads/creative/video_conversation_card_spec.rb +52 -0
  86. data/spec/twitter-ads/creative/video_legacy_spec.rb +43 -0
  87. data/spec/twitter-ads/creative/video_spec.rb +43 -0
  88. data/spec/twitter-ads/creative/website_card_spec.rb +37 -0
  89. data/spec/twitter-ads/cursor_spec.rb +67 -0
  90. data/spec/twitter-ads/placements_spec.rb +36 -0
  91. data/spec/twitter-ads/utils_spec.rb +101 -0
  92. data/twitter-ads.gemspec +37 -0
  93. metadata +247 -0
  94. 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
@@ -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: