zuck 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. data/CHANGELOG.markdown +4 -0
  2. data/README.markdown +35 -0
  3. data/VERSION +1 -1
  4. data/lib/zuck/facebook/ad_account.rb +8 -5
  5. data/lib/zuck/facebook/ad_campaign.rb +0 -1
  6. data/lib/zuck/facebook/ad_creative.rb +11 -10
  7. data/lib/zuck/facebook/ad_group.rb +5 -7
  8. data/lib/zuck/fb_object/hash_delegator.rb +5 -1
  9. data/lib/zuck/fb_object/helpers.rb +1 -1
  10. data/lib/zuck/fb_object/read.rb +0 -35
  11. data/spec/fixtures/a_single_account.yml +32 -57
  12. data/spec/fixtures/a_single_campaign.yml +12 -12
  13. data/spec/fixtures/a_single_group.yml +48 -0
  14. data/spec/fixtures/ad_keyword_search_disney.yml +12 -12
  15. data/spec/fixtures/{ad_keyword_search_steve_carell.yml → ad_keyword_search_moviepilot.yml} +8 -9
  16. data/spec/fixtures/ad_keyword_search_nonexistant.yml +5 -5
  17. data/spec/fixtures/create_ad_campaign.yml +12 -15
  18. data/spec/fixtures/create_ad_group.yml +15 -14
  19. data/spec/fixtures/delete_ad_group.yml +11 -15
  20. data/spec/fixtures/find_a_single_group_and_update_it.yml +224 -0
  21. data/spec/fixtures/list_of_ad_accounts.yml +26 -23
  22. data/spec/fixtures/list_of_ad_campaigns.yml +23 -24
  23. data/spec/fixtures/list_of_ad_creatives.yml +13 -15
  24. data/spec/fixtures/list_of_ad_groups.yml +62 -31
  25. data/spec/fixtures/list_of_all_ad_creatives_of_account.yml +41 -34
  26. data/spec/fixtures/reach_for_invalid_keyword.yml +9 -56
  27. data/spec/fixtures/reach_for_valid_keywords.yml +11 -56
  28. data/spec/fixtures/reach_for_valid_keywords_male_young.yml +11 -56
  29. data/spec/lib/zuck/facebook/ad_keyword_spec.rb +3 -3
  30. data/spec/lib/zuck/facebook/targeting_spec_spec.rb +4 -4
  31. data/spec/lib/zuck/fb_object/helpers_spec.rb +3 -2
  32. data/spec/lib/zuck_spec.rb +17 -24
  33. data/spec/spec_helper.rb +3 -0
  34. data/zuck.gemspec +5 -4
  35. metadata +6 -5
  36. data/spec/fixtures/find_a_single_campaign_and_update_it.yml +0 -247
@@ -1,3 +1,7 @@
1
+ 0.2.0
2
+ -----
3
+ - implement Facbook's [Oct 2013 breaking changes](https://developers.facebook.com/roadmap/#q4_2013)
4
+
1
5
  0.0.9
2
6
  -----
3
7
  - add Zuck::TargetingSpec.valid_countries? method to allow for country
@@ -88,6 +88,41 @@ group.ad_status
88
88
  => 3
89
89
  ```
90
90
 
91
+ AdKeyword convenience methods
92
+ --------
93
+
94
+ ```ruby
95
+ graph = Zuck.graph
96
+
97
+ # Search for keywords (to auto complete, for example) (yes, facebook sometimes returns ids as string and sometimes as numbers)
98
+ Zuck::AdKeyword.search(graph, "Auto")
99
+ => [
100
+ {:keyword=>"Auto", :id=>"6003156165433", :audience=>nil},
101
+ {:keyword=>"#Automobile", :id=>6003176678152, :audience=>97900000},
102
+ {:keyword=>"#Auto racing", :id=>6003146718552, :audience=>21800000},
103
+ {:keyword=>"#Auto mechanic", :id=>6003109384433, :audience=>14600000}
104
+ ]
105
+
106
+ # Quickly check if a keyword is valid
107
+ Zuck::AdKeyword.validate(graph, '#Eminem')
108
+ => {"#Eminem" => true}
109
+
110
+ # Quickly check a couple of keywords
111
+ Zuck::AdKeyword.validate(graph, ['#Eminem', 'Wil Ferel', 'Bronson'])
112
+ => {"#Eminem"=>true, "Bronson"=>true, "Wil Ferel"=>false}
113
+
114
+ # Make a best guess on how a keyword is called on Facebook
115
+ Zuck::AdKeyword.best_guess(graph, 'Disney')
116
+ => {:keyword=>"#The Walt Disney Company", :id=>6003270522085, :audience=>72500000}
117
+
118
+ # Sometimes a best guess does not return a keyword with a # prefix, and that
119
+ # means that we don't know the audience of that keyword:
120
+ Zuck::AdKeyword.best_guess(graph, 'Moviepilot')
121
+ => {:keyword=>"Moviepilot", :id=>6003327847780, :audience=>nil}
122
+
123
+ ```
124
+
125
+
91
126
  Supported objects
92
127
  -----------------
93
128
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -4,28 +4,31 @@ module Zuck
4
4
  # The [fb docs](https://developers.facebook.com/docs/reference/ads-api/adaccount/)
5
5
  # were incomplete, so I added here what the graph explorer
6
6
  # actually returned.
7
- known_keys :account_id,
7
+ known_keys :account_groups,
8
+ :account_id,
8
9
  :account_status,
10
+ :age,
11
+ :agency_client_declaration,
12
+ :amount_spent,
9
13
  :balance,
10
14
  :business_city,
11
15
  :business_country_code,
12
16
  :business_name,
13
17
  :business_state,
14
- :business_street,
15
18
  :business_street2,
19
+ :business_street,
16
20
  :business_zip,
17
21
  :capabilities,
18
22
  :currency,
19
23
  :daily_spend_limit,
20
24
  :id,
21
25
  :is_personal,
22
- :moo_default_bid,
23
- :moo_default_conversion_bid,
24
26
  :name,
25
- :notification_settings,
27
+ :spend_cap,
26
28
  :timezone_id,
27
29
  :timezone_name,
28
30
  :timezone_offset_hours_utc,
31
+ :tos_accepted,
29
32
  :users,
30
33
  :vat_status
31
34
 
@@ -5,7 +5,6 @@ module Zuck
5
5
  # were incomplete, so I added here what the graph explorer
6
6
  # actually returned.
7
7
  known_keys :account_id,
8
- :campaign_id,
9
8
  :campaign_status,
10
9
  :created_time,
11
10
  :daily_imps,
@@ -7,21 +7,22 @@ module Zuck
7
7
  # The [fb docs](https://developers.facebook.com/docs/reference/ads-api/adaccount/)
8
8
  # were incomplete, so I added here what the graph explorer
9
9
  # actually returned.
10
- known_keys :alt_view_tags,
10
+ known_keys :name,
11
+ :type,
12
+ :object_id,
11
13
  :body,
12
- :count_current_adgroups,
13
- :creative_id,
14
- :id,
15
14
  :image_hash,
16
15
  :image_url,
16
+ :id,
17
+ :title,
17
18
  :link_url,
18
- :name,
19
- :object_id,
19
+ :url_tags,
20
20
  :preview_url,
21
- :run_status,
22
- :title,
23
- :type,
24
- :view_tag
21
+ :related_fan_page,
22
+ :follow_redirect,
23
+ :auto_update,
24
+ :story_id,
25
+ :action_spec
25
26
 
26
27
  parent_object :ad_group
27
28
  list_path :adcreatives
@@ -7,9 +7,6 @@ module Zuck
7
7
  # were incomplete, so I added here what the graph explorer
8
8
  # actually returned.
9
9
  known_keys :account_id,
10
- :ad_id,
11
- :ad_status,
12
- :adgroup_id,
13
10
  :adgroup_status,
14
11
  :bid_info,
15
12
  :bid_type,
@@ -17,13 +14,14 @@ module Zuck
17
14
  :conversion_specs,
18
15
  :created_time,
19
16
  :creative_ids,
20
- :end_time,
21
17
  :id,
22
- :max_bid,
18
+ :disapprove_reason_descriptions,
19
+ :last_updated_by_app_id,
23
20
  :name,
24
- :start_time,
25
21
  :targeting,
26
- :updated_time
22
+ :tracking_specs,
23
+ :updated_time,
24
+ :view_tags
27
25
 
28
26
  parent_object :ad_campaign
29
27
  list_path :adgroups
@@ -50,6 +50,11 @@ module Zuck
50
50
  def known_keys(*args)
51
51
  args.each do |key|
52
52
 
53
+ # Define list of known keys
54
+ self.send(:define_method, :known_keys) do
55
+ args || []
56
+ end
57
+
53
58
  # Define getter
54
59
  self.send(:define_method, key) do
55
60
  init_hash
@@ -106,6 +111,5 @@ module Zuck
106
111
  def init_hash
107
112
  @hash_delegator_hash ||= {}
108
113
  end
109
-
110
114
  end
111
115
  end
@@ -6,7 +6,7 @@ module Zuck
6
6
 
7
7
  def get(graph, path)
8
8
  begin
9
- graph.get_object(path)
9
+ graph.get_object(path, fields: known_keys.compact.join(','))
10
10
  rescue => e
11
11
  puts "#{e} graph.get_object(#{path.to_json})" if in_irb?
12
12
  raise e
@@ -24,7 +24,6 @@ module Zuck
24
24
  # Refetches the data from façeboko
25
25
  def reload
26
26
  data = get(graph, path)
27
- validate_data(data)
28
27
  set_data(data)
29
28
  self
30
29
  end
@@ -41,40 +40,6 @@ module Zuck
41
40
  @parent_object = parent
42
41
  end
43
42
 
44
- # Makes sure that the data passed comes from a facebook
45
- # object of the same type. We check this by comparing
46
- # the 'group_id' value or the 'ad_group_id' value
47
- # with the 'id' value, when this
48
- # is called on a {Zuck::AdGroup} for example.
49
- #
50
- # Facebook omits the "ad" prefix sometimes, so we check
51
- # for both.
52
- def validate_data(data)
53
- singular_list_path = self.class.list_path.to_s.singularize
54
-
55
- # This is a special case for ad accounts (they have weird ids
56
- # that begin with act: "act_12345" instead of "12345"
57
- return if data['account_id'] and "act_#{data['account_id']}" == data['id'].to_s
58
-
59
- # This is the case for all other objects
60
- long_id_key = "#{singular_list_path}_id"
61
- short_id_key = "#{singular_list_path[2..-1]}_id"
62
- return if data[long_id_key] and data[long_id_key].to_s == data["id"].to_s
63
- return if data[short_id_key] and data[short_id_key].to_s == data["id"].to_s
64
-
65
- # Something went wrong. Either the data provided by the user is
66
- # not consistent, or a wrong object type was belongs to this id on facebook
67
- # (an ad group instead of an ad campaign, for example).
68
- #
69
- # Maybe we can make somebody's life easier by raising a verbose exception.
70
- error = "Invalid type.\n\nExpected data['id']=#{data['id'].inspect} to be equal to one of these:\n"
71
- error += " * data['account_id']=#{data['account_id'].inspect}\n"
72
- error += " * data['#{short_id_key}']=#{data[short_id_key].inspect}\n"
73
- error += " * data['#{long_id_key}']=#{data[long_id_key].inspect}\n"
74
-
75
- raise error
76
- end
77
-
78
43
  module ClassMethods
79
44
 
80
45
  # Finds by object id and checks type
@@ -2,74 +2,49 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://graph.facebook.com/act_10150585630710217?access_token=AAAEvJ5vzhl8BABhTSazJZB2D0B4N0l242VX22Hg9J2WZA7fptcAztfXxfAZB9mhZB6W1nl5dz5tXMlb9DJk9ibs6RqtP7PtO6a3XCiHWVwZDZD
5
+ uri: https://graph.facebook.com/act_10150585630710217?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_groups,account_id,account_status,age,agency_client_declaration,amount_spent,balance,business_city,business_country_code,business_name,business_state,business_street2,business_street,business_zip,capabilities,currency,daily_spend_limit,id,is_personal,name,spend_cap,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,users,vat_status
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
+ User-Agent:
11
+ - Faraday v0.8.7
10
12
  Accept-Encoding:
11
13
  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
14
  Accept:
13
15
  - ! '*/*'
14
- User-Agent:
15
- - Ruby
16
16
  response:
17
17
  status:
18
18
  code: 200
19
- message: !binary |-
20
- T0s=
19
+ message: OK
21
20
  headers:
22
- !binary "QWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2lu":
23
- - !binary |-
24
- Kg==
25
- !binary "Q2FjaGUtQ29udHJvbA==":
26
- - !binary |-
27
- cHJpdmF0ZSwgbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGU=
28
- !binary "Q29udGVudC1UeXBl":
29
- - !binary |-
30
- dGV4dC9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04
31
- !binary "RXRhZw==":
32
- - !binary |-
33
- Ijc1NWUyMTBmYjE2N2NkOTQxNWI3ODIzZTZjOGM4YjYwYTQ1MzUwZTUi
34
- !binary "RXhwaXJlcw==":
35
- - !binary |-
36
- U2F0LCAwMSBKYW4gMjAwMCAwMDowMDowMCBHTVQ=
37
- !binary "UHJhZ21h":
38
- - !binary |-
39
- bm8tY2FjaGU=
40
- !binary "WC1GYi1SZXY=":
41
- - !binary |-
42
- NjEyNTY1
43
- !binary "Q29udGVudC1FbmNvZGluZw==":
44
- - !binary |-
45
- Z3ppcA==
46
- !binary "WC1GYi1EZWJ1Zw==":
47
- - !binary |-
48
- L3l3UTJxVWc2L0toZVhhTnFXY21lVFFsSW0vVkFEV09tUFIvQVkzVWsxTT0=
49
- !binary "RGF0ZQ==":
50
- - !binary |-
51
- VHVlLCAyMSBBdWcgMjAxMiAxNDo1MjoyNCBHTVQ=
52
- !binary "Q29ubmVjdGlvbg==":
53
- - !binary |-
54
- a2VlcC1hbGl2ZQ==
55
- !binary "Q29udGVudC1MZW5ndGg=":
56
- - !binary |-
57
- NTA1
21
+ Access-Control-Allow-Origin:
22
+ - ! '*'
23
+ Cache-Control:
24
+ - private, no-cache, no-store, must-revalidate
25
+ Content-Type:
26
+ - application/json; charset=UTF-8
27
+ Etag:
28
+ - ! '"3974cd2e1bd6adde467a920e740351a73e2d5889"'
29
+ Expires:
30
+ - Sat, 01 Jan 2000 00:00:00 GMT
31
+ Pragma:
32
+ - no-cache
33
+ X-Fb-Rev:
34
+ - '934677'
35
+ X-Fb-Debug:
36
+ - X2mEeMJUPl6v6oa677ct5KWrnQJIEqYykFRDw7P1OOE=
37
+ Date:
38
+ - Thu, 12 Sep 2013 13:21:40 GMT
39
+ Connection:
40
+ - keep-alive
41
+ Content-Length:
42
+ - '697'
58
43
  body:
59
- encoding: ASCII-8BIT
60
- string: !binary |-
61
- H4sIAAAAAAAAA6VSTWvcMBD9K0anFgSV7LU361tDQqHQU8mlTRGyLO8OsSWj
62
- j8Bm2f/e0W7i2MS3nOz39GbmzceJQEtqIlUQnPGSlTdlVbAtZznfEoq8stEE
63
- cRGtCYwcND7NpD7IED2pOSUqOqeNOqLg4fcdagIM+sUafcm32c6I1zz30dlR
64
- P3671a4HM4+wXed1EAcbnRcxKFLnlIAXo3beGtmTmlHSRA9Gey9e093CPvsF
65
- Tzr73jvYH0L28CP7cpBdiGbvG+3VwT1GxvTGPIWvWG2K98FpHdD3JzPkmOLn
66
- tcReO9Na12mX/dHQ66zi84oKQprT1PjMigxpxB9fXmBMW8lztltkShtzR6Fs
67
- m+Lu7vHxWQbxtpiCklZCfxR+1KYVPQyAneYlYzjB6HGepP57IjHtqGR8W+At
68
- VJTgoAfwHqxJ75zmtKAbWtLtP0qc7bEUZ4yfERkboAMlA2oFLi0ATpvUJzJl
69
- SwDV7PLFwDNNEP/mEGd3hZTgb8WuomKV3SxDyyWslnC3gHzpgs9d5DOP7y6Q
70
- nUQL9uL4zSuqVrwiO3ldxE6W39litTqyK9WRXVRHvFI97XjWfPUBzpvfrZa/
71
- WWHPuBolR9lADwF0uo8c76CRvTQKDwPvarBWtLqTsQ94mOYZryxdR5OOLF3C
72
- +T90T7SjiQQAAA==
44
+ encoding: US-ASCII
45
+ string: ! '{"account_id":"10150585630710217","account_status":1,"age":590.89847222222,"amount_spent":4093,"balance":0,"business_city":"Berlin","business_country_code":"DE","business_name":"Big
46
+ Mike Alright UG (haftungsbeschr\u00e4nkt)","business_state":"Berlin","business_street2":"J\u00e4gerndorfer
47
+ Zeile 61","business_street":"Big Mike Alright UG (haftungsbeschr\u00e4nkt)","business_zip":"12209","capabilities":[2,6,15,11,16],"currency":"USD","daily_spend_limit":150000,"id":"act_10150585630710217","is_personal":0,"name":"","spend_cap":5000,"timezone_id":47,"timezone_name":"Europe\/Berlin","timezone_offset_hours_utc":2,"users":[{"uid":501730216,"permissions":[1,2,3,4,5,7],"role":1001}],"vat_status":3}'
73
48
  http_version:
74
- recorded_at: Tue, 21 Aug 2012 14:52:25 GMT
75
- recorded_with: VCR 2.2.4
49
+ recorded_at: Thu, 12 Sep 2013 13:21:40 GMT
50
+ recorded_with: VCR 2.3.0
@@ -2,17 +2,17 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://graph.facebook.com/6005950787751?access_token=AAAEvJ5vzhl8BABhTSazJZB2D0B4N0l242VX22Hg9J2WZA7fptcAztfXxfAZB9mhZB6W1nl5dz5tXMlb9DJk9ibs6RqtP7PtO6a3XCiHWVwZDZD
5
+ uri: https://graph.facebook.com/6005950787751?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_id,campaign_status,created_time,daily_imps,end_time,id,lifetime_budget,name,start_time,updated_time
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
+ User-Agent:
11
+ - Faraday v0.8.7
10
12
  Accept-Encoding:
11
13
  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
14
  Accept:
13
15
  - ! '*/*'
14
- User-Agent:
15
- - Ruby
16
16
  response:
17
17
  status:
18
18
  code: 200
@@ -23,26 +23,26 @@ http_interactions:
23
23
  Cache-Control:
24
24
  - private, no-cache, no-store, must-revalidate
25
25
  Content-Type:
26
- - text/javascript; charset=UTF-8
26
+ - application/json; charset=UTF-8
27
27
  Etag:
28
- - ! '"050868a2c006f558b70017a737ca8f72419e7bc1"'
28
+ - ! '"e86bfdbd29a6618779f20e958e1dfe705bb806de"'
29
29
  Expires:
30
30
  - Sat, 01 Jan 2000 00:00:00 GMT
31
31
  Pragma:
32
32
  - no-cache
33
33
  X-Fb-Rev:
34
- - '612565'
34
+ - '934677'
35
35
  X-Fb-Debug:
36
- - o5ZT1cHA5d8AdQpUe+7pBF0kc5dqhirTcSEjdEaM7m8=
36
+ - i6CJnwde2dK30oFKSKB+yrtbjQtBwOx7j7wbo7jQdwQ=
37
37
  Date:
38
- - Tue, 21 Aug 2012 14:13:01 GMT
38
+ - Thu, 12 Sep 2013 13:21:40 GMT
39
39
  Connection:
40
40
  - keep-alive
41
41
  Content-Length:
42
- - '294'
42
+ - '230'
43
43
  body:
44
44
  encoding: US-ASCII
45
- string: ! '{"account_id":"10150585630710217","campaign_id":6005950787751,"name":"bloody","daily_budget":1000,"campaign_status":1,"daily_imps":0,"id":"6005950787751","start_time":"2012-08-21T14:04:13+0000","end_time":null,"updated_time":"2012-08-21T14:08:34+0000","created_time":"2012-08-21T14:04:13+0000"}'
45
+ string: ! '{"account_id":"10150585630710217","campaign_status":3,"created_time":"2012-08-21T16:04:13+0200","daily_imps":0,"id":"6005950787751","name":"bloody","start_time":"2012-08-21T16:04:13+0200","updated_time":"2013-03-25T12:40:29+0100"}'
46
46
  http_version:
47
- recorded_at: Tue, 21 Aug 2012 14:13:02 GMT
48
- recorded_with: VCR 2.2.4
47
+ recorded_at: Thu, 12 Sep 2013 13:21:40 GMT
48
+ recorded_with: VCR 2.3.0
@@ -0,0 +1,48 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://graph.facebook.com/6010889111951?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&fields=account_id,adgroup_status,bid_info,bid_type,campaign_id,conversion_specs,created_time,creative_ids,id,disapprove_reason_descriptions,last_updated_by_app_id,name,targeting,tracking_specs,updated_time,view_tags
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.8.7
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - ! '*/*'
16
+ response:
17
+ status:
18
+ code: 400
19
+ message: Bad Request
20
+ headers:
21
+ Access-Control-Allow-Origin:
22
+ - ! '*'
23
+ Cache-Control:
24
+ - no-store
25
+ Content-Type:
26
+ - application/json; charset=UTF-8
27
+ Expires:
28
+ - Sat, 01 Jan 2000 00:00:00 GMT
29
+ Pragma:
30
+ - no-cache
31
+ Www-Authenticate:
32
+ - ! 'OAuth "Facebook Platform" "invalid_request" "(#100) Unknown fields: adgroup_status,bid_info,bid_type,conversion_specs,creative_ids,disapprove_reason_descriptions,last_updated_by_app_id,targeting,tracking_specs,view_tags."'
33
+ X-Fb-Rev:
34
+ - '934677'
35
+ X-Fb-Debug:
36
+ - Gks1Vwa18J2bq9/Zxb9ya6ywWnVPynwEDSmFjSxKc9k=
37
+ Date:
38
+ - Thu, 12 Sep 2013 13:21:40 GMT
39
+ Connection:
40
+ - keep-alive
41
+ Content-Length:
42
+ - '234'
43
+ body:
44
+ encoding: US-ASCII
45
+ string: ! '{"error":{"message":"(#100) Unknown fields: adgroup_status,bid_info,bid_type,conversion_specs,creative_ids,disapprove_reason_descriptions,last_updated_by_app_id,targeting,tracking_specs,view_tags.","type":"OAuthException","code":100}}'
46
+ http_version:
47
+ recorded_at: Thu, 12 Sep 2013 13:21:41 GMT
48
+ recorded_with: VCR 2.3.0