zuck 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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