bloom-ad_gear_client 0.3.5

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 (48) hide show
  1. data/.gitignore +6 -0
  2. data/LICENSE +21 -0
  3. data/README.rdoc +55 -0
  4. data/Rakefile +131 -0
  5. data/VERSION +1 -0
  6. data/ad_gear_client.gemspec +105 -0
  7. data/examples/.gitignore +1 -0
  8. data/examples/ad_gear.yml.sample +8 -0
  9. data/examples/create_placement.rb +57 -0
  10. data/examples/prelude.rb +27 -0
  11. data/examples/read_write_site.rb +36 -0
  12. data/examples/upload_file_to_ad_unit.rb +49 -0
  13. data/lib/ad_gear/ad_spot.rb +7 -0
  14. data/lib/ad_gear/ad_spot_membership.rb +5 -0
  15. data/lib/ad_gear/ad_unit.rb +14 -0
  16. data/lib/ad_gear/ad_unit_click.rb +5 -0
  17. data/lib/ad_gear/ad_unit_file.rb +6 -0
  18. data/lib/ad_gear/ad_unit_interaction.rb +5 -0
  19. data/lib/ad_gear/ad_unit_variable.rb +5 -0
  20. data/lib/ad_gear/advertiser.rb +4 -0
  21. data/lib/ad_gear/base.rb +168 -0
  22. data/lib/ad_gear/click.rb +4 -0
  23. data/lib/ad_gear/config.rb +143 -0
  24. data/lib/ad_gear/core_ext.rb +18 -0
  25. data/lib/ad_gear/file.rb +4 -0
  26. data/lib/ad_gear/format.rb +4 -0
  27. data/lib/ad_gear/has_many_array.rb +58 -0
  28. data/lib/ad_gear/interaction.rb +4 -0
  29. data/lib/ad_gear/placement_membership.rb +5 -0
  30. data/lib/ad_gear/placement_rule.rb +5 -0
  31. data/lib/ad_gear/publisher.rb +7 -0
  32. data/lib/ad_gear/site.rb +6 -0
  33. data/lib/ad_gear/template.rb +4 -0
  34. data/lib/ad_gear/upload.rb +46 -0
  35. data/lib/ad_gear/variable.rb +4 -0
  36. data/lib/ad_gear/web_campaign.rb +4 -0
  37. data/lib/ad_gear/web_placement.rb +26 -0
  38. data/lib/ad_gear/xml_format.rb +35 -0
  39. data/lib/ad_gear.rb +105 -0
  40. data/test/ad_gear/ad_spot_test.rb +43 -0
  41. data/test/ad_gear/config_test.rb +114 -0
  42. data/test/ad_gear/placement_rule_test.rb +22 -0
  43. data/test/ad_gear/site_test.rb +69 -0
  44. data/test/ad_gear/upload_test.rb +58 -0
  45. data/test/ad_gear_test.rb +23 -0
  46. data/test/fixtures/access-denied-no-auth.txt +13 -0
  47. data/test/test_helper.rb +33 -0
  48. metadata +150 -0
@@ -0,0 +1,43 @@
1
+ require "test_helper"
2
+ require "ostruct"
3
+
4
+ class AdGear::AdSpotTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ AdGear.config = OpenStruct.new(:site => "http://test.host", :format => :xml)
8
+ end
9
+
10
+ def teardown
11
+ AdGear::Base.site = nil
12
+ super
13
+ end
14
+
15
+ def test_embed_code_should_not_be_encoded
16
+ spot = AdGear::AdSpot.new(:id => 84, :name => "XLsuite", :format_id => 42, :embed_code => "some code")
17
+
18
+ doc = Nokogiri::XML(spot.encode)
19
+ xpath doc, "/ad-spot/embed-code" do |ns|
20
+ assert ns.empty?, doc
21
+ end
22
+ end
23
+
24
+ def test_setting_format_sets_format_id_internally
25
+ format = stub("AdGear::Format", :id => 231)
26
+
27
+ spot = AdGear::AdSpot.new
28
+ spot.format = format
29
+ assert_equal 231, spot.attributes["format_id"], spot.attributes
30
+ end
31
+
32
+ def test_instantiating_with_format_sets_format_id_internally
33
+ format = stub("AdGear::Format", :id => 231)
34
+ spot = AdGear::AdSpot.new(:format => format)
35
+ assert_equal 231, spot.attributes["format_id"], spot.attributes
36
+ end
37
+
38
+ def test_setting_format_to_nil_sets_format_id_to_nil
39
+ spot = AdGear::AdSpot.new
40
+ spot.format = nil
41
+ assert_nil spot.attributes["format_id"]
42
+ end
43
+ end
@@ -0,0 +1,114 @@
1
+ require "test_helper"
2
+ require "tempfile"
3
+ require "stringio"
4
+
5
+ class AdGear::ConfigTest < Test::Unit::TestCase
6
+ should "read a file on disk when given a path" do
7
+ econf = {"site" => "http://whatever.com/", "user" => "francois", "password" => "many"}
8
+ Tempfile.open("config") do |io|
9
+ io.write econf.to_yaml
10
+ io.close
11
+
12
+ aconf = AdGear::Config.new(io.path)
13
+ assert_equal econf, aconf.to_hash
14
+ end
15
+ end
16
+
17
+ should "pass a file's content through ERB before evaluating configuration" do
18
+ conf = {"user" => "<%= :whoami %>"}
19
+ econf = {"user" => "whoami"}
20
+ Tempfile.open("config") do |io|
21
+ io.write conf.to_yaml
22
+ io.close
23
+
24
+ aconf = AdGear::Config.new(io.path)
25
+ assert_equal econf, aconf.to_hash
26
+ end
27
+ end
28
+
29
+ should "read a stream" do
30
+ econf = {"site" => "http://whatever.com/", "user" => "francois", "password" => "many"}
31
+ Tempfile.open("config") do |io|
32
+ io.write econf.to_yaml
33
+ io.rewind
34
+
35
+ aconf = AdGear::Config.new(io)
36
+ assert_equal econf, aconf.to_hash
37
+ end
38
+ end
39
+
40
+ should "read the specified env" do
41
+ econf = {"site" => "http://whatever.com/", "user" => "francois", "password" => "many"}
42
+ env = {"development" => econf}
43
+ aconf = AdGear::Config.new(StringIO.new(env.to_yaml), "development")
44
+ assert_equal econf, aconf.to_hash
45
+ end
46
+
47
+ should "raise a MissingEnvironmentSpecification when the file is empty" do
48
+ assert_raise AdGear::Config::MissingEnvironmentSpecification do
49
+ AdGear::Config.new(StringIO.new(""), "development")
50
+ end
51
+ end
52
+
53
+ should "raise a MissingEnvironmentSpecification when the env doesn't exist" do
54
+ econf = {"site" => "http://whatever.com/", "user" => "francois", "password" => "many"}
55
+ env = {"development" => econf}
56
+
57
+ assert_raise AdGear::Config::MissingEnvironmentSpecification do
58
+ AdGear::Config.new(StringIO.new(env.to_yaml), "test")
59
+ end
60
+ end
61
+
62
+ should "instantiate a Logger for STDOUT when the logger key is 'stdout'" do
63
+ Logger.expects(:new).with(STDOUT).returns(mock("Logger"))
64
+ AdGear::Config.new(StringIO.new({"logger" => "stdout"}.to_yaml))
65
+ end
66
+
67
+ should "instantiate a Logger for STDERR when the logger key is 'stderr'" do
68
+ Logger.expects(:new).with(STDERR).returns(mock("Logger"))
69
+ AdGear::Config.new("logger" => "stderr")
70
+ end
71
+
72
+ should "instantiate a Logger for the file named 'log/adgear.log' when the key is 'log/adgear.log'" do
73
+ Logger.expects(:new).with(File.join(Dir.pwd, "log/adgear.log")).returns(mock("Logger"))
74
+ AdGear::Config.new(StringIO.new({"logger" => File.join(Dir.pwd, "log/adgear.log")}.to_yaml))
75
+ end
76
+
77
+ should "pass the config file through ERB before using the values" do
78
+ conf = AdGear::Config.new(StringIO.new({"user" => "<%= :whoami %>"}.to_yaml))
79
+ assert_equal "whoami", conf.user
80
+ end
81
+
82
+ should "warn when the path to the logger is relative" do
83
+ config = AdGear::Config.new
84
+ config.expects(:warn)
85
+ config.logger = "development.log"
86
+ end
87
+
88
+ context "Given a configured AdGear::Config" do
89
+ setup do
90
+ conf = {"site" => "http://whatever.com/", "user" => "francois", "password" => "many", "use_basic_authentication" => false, "use_digest_authentication" => true}
91
+ @config = AdGear::Config.new(conf)
92
+ end
93
+
94
+ should "return the correct site from #site" do
95
+ assert_equal "http://whatever.com/", @config.site
96
+ end
97
+
98
+ should "return the correct user from #user" do
99
+ assert_equal "francois", @config.user
100
+ end
101
+
102
+ should "return the correct password from #password" do
103
+ assert_equal "many", @config.password
104
+ end
105
+
106
+ should "return the correct use_basic_authentication from #use_basic_authentication" do
107
+ assert_equal false, @config.use_basic_authentication
108
+ end
109
+
110
+ should "return the correct use_digest_authentication from #use_digest_authentication" do
111
+ assert_equal true, @config.use_digest_authentication
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,22 @@
1
+ require "test_helper"
2
+
3
+ class AdGear::PlacementRuleTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ AdGear.config = OpenStruct.new(:site => "http://test.host", :format => :xml)
7
+ end
8
+
9
+ def teardown
10
+ AdGear::Base.site = nil
11
+ super
12
+ end
13
+
14
+ should "polymorphically assign the bookable" do
15
+ publisher = AdGear::Publisher.new
16
+ publisher.stubs(:id).returns(42)
17
+
18
+ rule = AdGear::PlacementRule.new(:bookable => publisher)
19
+ assert_equal "Publisher", rule.bookable_type
20
+ assert_equal 42, rule.bookable_id
21
+ end
22
+ end
@@ -0,0 +1,69 @@
1
+ require "test_helper"
2
+ require "ostruct"
3
+
4
+ class AdGear::SiteTest < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ AdGear.config = OpenStruct.new(:site => "http://test.host", :format => :xml)
8
+ end
9
+
10
+ def teardown
11
+ AdGear::Base.site = nil
12
+ super
13
+ end
14
+
15
+ def test_adding_an_ad_spot_puts_it_in_the_new_collection
16
+ site = AdGear::Site.new(:name => "XLsuite", :url => "http://xlsuite.com/", :publisher_id => 1)
17
+ site.ad_spots << AdGear::AdSpot.new(:format_id => 13, :name => "sidebar top")
18
+
19
+ doc = Nokogiri::XML(site.to_xml)
20
+ xpath doc, "/site/ad-spot-attributes/new/*/name" do |ns|
21
+ assert_equal 1, ns.length, doc
22
+ end
23
+ end
24
+
25
+ def test_adding_an_existing_ad_spot_puts_it_in_the_old_collection
26
+ site = AdGear::Site.new(:name => "XLsuite", :url => "http://xlsuite.com/", :publisher_id => 1)
27
+ FakeWeb.register_uri(:get, "http://test.host/ad_spots/42.xml", :body => "<ad-spot><id>42</id><name>bla</name></ad-spot>")
28
+ site.ad_spots << AdGear::AdSpot.find(42)
29
+
30
+ doc = Nokogiri::XML(site.to_xml)
31
+ xpath doc, "/site/ad-spot-attributes/n42/name" do |ns|
32
+ assert_equal 1, ns.length, doc
33
+ end
34
+ end
35
+
36
+ def test_instantiating_with_ad_spots_still_generates_ad_spots_in_the_new_collection
37
+ site = AdGear::Site.new(:name => "XLsuite",
38
+ :url => "http://xlsuite.com/",
39
+ :publisher_id => 1,
40
+ :ad_spots => [{:format_id => 13, :name => "sidebar top"}])
41
+
42
+ doc = Nokogiri::XML(site.to_xml)
43
+ xpath doc, "/site/ad-spot-attributes/new/*/name" do |ns|
44
+ assert_equal 1, ns.length, doc
45
+ end
46
+ end
47
+
48
+ def test_adding_a_new_ad_spot_to_existing_ad_spots_adds_to_new_collection
49
+ site = AdGear::Site.new(:name => "XLsuite",
50
+ :url => "http://xlsuite.com/",
51
+ :publisher_id => 1,
52
+ :ad_spots => [{:format_id => 13, :name => "sidebar top"}])
53
+ site.ad_spots << AdGear::AdSpot.new(:format_id => 13, :name => "homepage bottom")
54
+
55
+ doc = Nokogiri::XML(site.to_xml)
56
+ xpath doc, "/site/ad-spot-attributes/new/*/name" do |ns|
57
+ assert_equal 2, ns.length, doc
58
+ end
59
+ end
60
+
61
+ def test_embed_code_should_not_be_encoded
62
+ site = AdGear::Site.new(:id => 84, :name => "XLsuite", :url => "http://xlsuite.com/", :embed_code => "some code")
63
+
64
+ doc = Nokogiri::XML(site.encode)
65
+ xpath doc, "/site/embed-code" do |ns|
66
+ assert ns.empty?, doc
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,58 @@
1
+ require "test_helper"
2
+
3
+ class AdGear::UploadTest < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ AdGear.config = OpenStruct.new(:site => "http://test.host/api", :format => :xml)
7
+ end
8
+
9
+ def teardown
10
+ AdGear::Base.site = nil
11
+ super
12
+ end
13
+
14
+ should "upload the data using RestClient" do
15
+ xml = Builder::XmlMarkup.new
16
+ xml.upload do
17
+ xml.id 42
18
+ end
19
+
20
+ uri = URI.parse("http://test.host/api/uploads.xml")
21
+ RestClient.expects(:post).with(uri.to_s, all_of(has_key("upload[uploaded_data]"), has_key("upload[filename]")), {}).returns(xml.target!)
22
+ upload = AdGear::Upload.new(:filename => "test/fixtures/access-denied-no-auth.txt")
23
+ upload.save
24
+ assert_equal 42, upload.id.to_i
25
+ end
26
+
27
+ should "raise an exception when calling #update_attribute" do
28
+ assert_raise(AdGear::UnsupportedOperation) do
29
+ AdGear::Upload.new.update_attribute
30
+ end
31
+ end
32
+
33
+ should "raise an exception when calling #update_attributes" do
34
+ assert_raise(AdGear::UnsupportedOperation) do
35
+ AdGear::Upload.new.update_attributes
36
+ end
37
+ end
38
+
39
+ should "retry with Digest authentication when RestClient::Unauthorized is raised" do
40
+ xml = Builder::XmlMarkup.new
41
+ xml.upload do
42
+ xml.id 42
43
+ end
44
+
45
+ uri = URI.parse("http://test.host/api/uploads.xml")
46
+
47
+ ActiveResource::Digest.stubs(:authenticate).returns("Calculated Authorization Header")
48
+ headers = {"www-authenticate" => ""}
49
+ unauthorized_response = stub("response", :[] => "Server Generated WWW-Authenticate Header")
50
+
51
+ RestClient.stubs(:post).with(anything, anything, {}).raises(RestClient::Unauthorized.new(unauthorized_response))
52
+ RestClient.expects(:post).with(anything, anything, has_key("Authorization")).returns(xml.target!)
53
+
54
+ upload = AdGear::Upload.new(:filename => "test/fixtures/access-denied-no-auth.txt")
55
+ upload.save
56
+ assert_equal 42, upload.id.to_i
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ require "test_helper"
2
+ require "ostruct"
3
+
4
+ class AdGearTest < Test::Unit::TestCase
5
+ should "configure AdGear::Base when calling #config= with config object" do
6
+ assert_nil AdGear::Base.site
7
+
8
+ AdGear.config = OpenStruct.new(:site => "http://bla.com", :user => "user", :password => "test", :format => :xml)
9
+
10
+ assert_equal "http://bla.com", AdGear::Base.site.to_s
11
+ assert_equal "user", AdGear::Base.user
12
+ assert_equal "test", AdGear::Base.password
13
+ end
14
+
15
+ should "override Array#to_xml to generate XML envelopes containing only class name" do
16
+ sites = [ AdGear::Site.new, AdGear::Site.new ]
17
+
18
+ doc = Nokogiri::XML(sites.to_xml)
19
+ xpath doc, "/sites/site" do |ns|
20
+ assert_equal 2, ns.length, doc
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 401 Authorization Required
2
+ Date: Mon, 03 Aug 2009 20:06:42 GMT
3
+ Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.7l DAV/2 Phusion_Passenger/2.2.2
4
+ X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.2.2
5
+ WWW-Authenticate: Digest realm="AdGear API", qop="auth", algorithm=MD5, nonce="MTI0OTMzMDAwMjphN2NkNGU0YmUwZDQ5MjhhZjYzNzA4NzZiNjA4YTU0Ng==", opaque="a21e6002d2bd70e6dbeaca094ded4f93"
6
+ X-Runtime: 13
7
+ Cache-Control: no-cache
8
+ Set-Cookie: _AdGear_session=BAh7BjoPc2Vzc2lvbl9pZCIlYmE3NGNiZWIxN2ZhNmMyZDNjYWM5ZDEyMDFjMDhkZGI%3D--102443fec5480274e2163b6eb98ef2722c8f90cc; path=/; HttpOnly
9
+ Content-Length: 28
10
+ Status: 401
11
+ Content-Type: text/html; charset=utf-8
12
+
13
+ HTTP Digest: Access denied.
@@ -0,0 +1,33 @@
1
+ require "rubygems"
2
+ require "test/unit"
3
+ require "shoulda"
4
+ require "mocha"
5
+ require "fakeweb"
6
+ require "builder"
7
+
8
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
9
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
10
+ require "ad_gear"
11
+
12
+ begin
13
+ require "ruby-debug"
14
+ rescue LoadError
15
+ # Don't care, it's nice but not required
16
+ end
17
+
18
+ class Test::Unit::TestCase
19
+ BASE_URI = "http://api.adgear.com/services"
20
+
21
+ def setup
22
+ FakeWeb.allow_net_connect = false
23
+ end
24
+
25
+ def teardown
26
+ FakeWeb.allow_net_connect = true
27
+ end
28
+
29
+ protected
30
+ def xpath(doc, path)
31
+ yield doc.xpath(path)
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bloom-ad_gear_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.5
5
+ platform: ruby
6
+ authors:
7
+ - "Fran\xC3\xA7ois Beausoleil"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-23 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: lsegal-yard
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.2.3
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.5
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: activeresource
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">"
42
+ - !ruby/object:Gem::Version
43
+ version: "2.0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: francois-rest-client
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: "1"
54
+ version:
55
+ description:
56
+ email: francois@teksol.info
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - LICENSE
63
+ - README.rdoc
64
+ files:
65
+ - .gitignore
66
+ - LICENSE
67
+ - README.rdoc
68
+ - Rakefile
69
+ - VERSION
70
+ - ad_gear_client.gemspec
71
+ - examples/.gitignore
72
+ - examples/ad_gear.yml.sample
73
+ - examples/create_placement.rb
74
+ - examples/prelude.rb
75
+ - examples/read_write_site.rb
76
+ - examples/upload_file_to_ad_unit.rb
77
+ - lib/ad_gear.rb
78
+ - lib/ad_gear/ad_spot.rb
79
+ - lib/ad_gear/ad_spot_membership.rb
80
+ - lib/ad_gear/ad_unit.rb
81
+ - lib/ad_gear/ad_unit_click.rb
82
+ - lib/ad_gear/ad_unit_file.rb
83
+ - lib/ad_gear/ad_unit_interaction.rb
84
+ - lib/ad_gear/ad_unit_variable.rb
85
+ - lib/ad_gear/advertiser.rb
86
+ - lib/ad_gear/base.rb
87
+ - lib/ad_gear/click.rb
88
+ - lib/ad_gear/config.rb
89
+ - lib/ad_gear/core_ext.rb
90
+ - lib/ad_gear/file.rb
91
+ - lib/ad_gear/format.rb
92
+ - lib/ad_gear/has_many_array.rb
93
+ - lib/ad_gear/interaction.rb
94
+ - lib/ad_gear/placement_membership.rb
95
+ - lib/ad_gear/placement_rule.rb
96
+ - lib/ad_gear/publisher.rb
97
+ - lib/ad_gear/site.rb
98
+ - lib/ad_gear/template.rb
99
+ - lib/ad_gear/upload.rb
100
+ - lib/ad_gear/variable.rb
101
+ - lib/ad_gear/web_campaign.rb
102
+ - lib/ad_gear/web_placement.rb
103
+ - lib/ad_gear/xml_format.rb
104
+ - test/ad_gear/ad_spot_test.rb
105
+ - test/ad_gear/config_test.rb
106
+ - test/ad_gear/placement_rule_test.rb
107
+ - test/ad_gear/site_test.rb
108
+ - test/ad_gear/upload_test.rb
109
+ - test/ad_gear_test.rb
110
+ - test/fixtures/access-denied-no-auth.txt
111
+ - test/test_helper.rb
112
+ has_rdoc: false
113
+ homepage: http://github.com/francois/ad_gear_client
114
+ licenses:
115
+ post_install_message:
116
+ rdoc_options:
117
+ - --charset=UTF-8
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: "0"
125
+ version:
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: "0"
131
+ version:
132
+ requirements: []
133
+
134
+ rubyforge_project: ad_gear_client
135
+ rubygems_version: 1.3.5
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: A Ruby client for accessing AdGear http://bloomdigital.com/
139
+ test_files:
140
+ - test/ad_gear/ad_spot_test.rb
141
+ - test/ad_gear/config_test.rb
142
+ - test/ad_gear/placement_rule_test.rb
143
+ - test/ad_gear/site_test.rb
144
+ - test/ad_gear/upload_test.rb
145
+ - test/ad_gear_test.rb
146
+ - test/test_helper.rb
147
+ - examples/create_placement.rb
148
+ - examples/prelude.rb
149
+ - examples/read_write_site.rb
150
+ - examples/upload_file_to_ad_unit.rb