twitter-ads 0.3.4

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.
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: