bsm-openx 1.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +22 -0
- data/README.txt +85 -0
- data/Rakefile +51 -0
- data/VERSION +1 -0
- data/bsm-openx.gemspec +92 -0
- data/lib/openx.rb +41 -0
- data/lib/openx/image.rb +22 -0
- data/lib/openx/invocation.rb +62 -0
- data/lib/openx/services.rb +32 -0
- data/lib/openx/services/advertiser.rb +31 -0
- data/lib/openx/services/agency.rb +34 -0
- data/lib/openx/services/banner.rb +94 -0
- data/lib/openx/services/base.rb +97 -0
- data/lib/openx/services/campaign.rb +52 -0
- data/lib/openx/services/channel.rb +42 -0
- data/lib/openx/services/persistance.rb +64 -0
- data/lib/openx/services/publisher.rb +36 -0
- data/lib/openx/services/session.rb +44 -0
- data/lib/openx/services/targeting_rule.rb +125 -0
- data/lib/openx/services/targeting_rules.rb +26 -0
- data/lib/openx/services/zone.rb +82 -0
- data/lib/openx/xmlrpc_client.rb +72 -0
- data/test/assets/300x250.jpg +0 -0
- data/test/assets/cat.swf +0 -0
- data/test/helper.rb +131 -0
- data/test/test_advertiser.rb +82 -0
- data/test/test_agency.rb +94 -0
- data/test/test_banner.rb +85 -0
- data/test/test_base.rb +40 -0
- data/test/test_campaign.rb +64 -0
- data/test/test_channel.rb +65 -0
- data/test/test_openx.rb +17 -0
- data/test/test_publisher.rb +69 -0
- data/test/test_services.rb +16 -0
- data/test/test_session.rb +42 -0
- data/test/test_targeting_rule.rb +86 -0
- data/test/test_targeting_rules.rb +13 -0
- data/test/test_zone.rb +101 -0
- metadata +122 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (3.0.0)
|
5
|
+
gemcutter (0.6.1)
|
6
|
+
git (1.2.5)
|
7
|
+
jeweler (1.4.0)
|
8
|
+
gemcutter (>= 0.1.0)
|
9
|
+
git (>= 1.2.5)
|
10
|
+
rubyforge (>= 2.0.0)
|
11
|
+
json_pure (1.4.6)
|
12
|
+
rake (0.8.7)
|
13
|
+
rubyforge (2.0.4)
|
14
|
+
json_pure (>= 1.1.7)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
activesupport
|
21
|
+
jeweler
|
22
|
+
rake
|
data/README.txt
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
= OpenX
|
2
|
+
|
3
|
+
A Ruby interface to the OpenX XML-RPC API.
|
4
|
+
|
5
|
+
== SYNOPSIS:
|
6
|
+
|
7
|
+
OpenX.configuration = {
|
8
|
+
'username' => 'admin',
|
9
|
+
'password' => 'password',
|
10
|
+
'url' => 'http://localhost/www/api/v2/xmlrpc/',
|
11
|
+
'timeout' => 10, # Optional
|
12
|
+
'reconnect' => true # Optional
|
13
|
+
}
|
14
|
+
|
15
|
+
OpenX::Services::Agency.find(:all).each do |agency|
|
16
|
+
puts agency.name
|
17
|
+
|
18
|
+
# Look up publishers
|
19
|
+
agency.publishers.each do |publisher|
|
20
|
+
puts "-- #{publisher.name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create a publisher
|
24
|
+
OpenX::Services::Publisher.create!(
|
25
|
+
:agency => agency,
|
26
|
+
:name => 'My Test Publisher',
|
27
|
+
:contact_name => 'Aaron Patterson',
|
28
|
+
:email => 'aaron@tenderlovemaking.com',
|
29
|
+
:username => 'user',
|
30
|
+
:password => 'password'
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
== REQUIREMENTS:
|
35
|
+
|
36
|
+
* ruby
|
37
|
+
|
38
|
+
== INSTALL:
|
39
|
+
|
40
|
+
* sudo gem install bsm-openx
|
41
|
+
* Update your $HOME/.openx/credentials.yml file.
|
42
|
+
You can set your own path via OpenX.config_file = '/path/pto/file.yml'.
|
43
|
+
Here is a sample:
|
44
|
+
|
45
|
+
---
|
46
|
+
production:
|
47
|
+
username: admin
|
48
|
+
password: admin
|
49
|
+
url: http://www.example.com/www/api/v2/xmlrpc/
|
50
|
+
invocation_url: http://www.example.com/www/delivery/axmlrpc.php
|
51
|
+
|
52
|
+
The YAML file lists configuration for each environment. The gem uses the
|
53
|
+
'production' environment by default. Trailing slash is required on the 'url'.
|
54
|
+
'invocation_url' is only used by the OpenX::Invocation methods to serve
|
55
|
+
advertisements over XML-RPC
|
56
|
+
|
57
|
+
== LICENSE:
|
58
|
+
|
59
|
+
(The MIT License)
|
60
|
+
|
61
|
+
Copyright (c) 2010:
|
62
|
+
|
63
|
+
* {Aaron Patterson}[http://tenderlovemaking.com]
|
64
|
+
* Andy Smith
|
65
|
+
* {TouchLocal P/L}[http://www.touchlocal.com]
|
66
|
+
* Dimitrij Denissenko
|
67
|
+
|
68
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
69
|
+
a copy of this software and associated documentation files (the
|
70
|
+
'Software'), to deal in the Software without restriction, including
|
71
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
72
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
73
|
+
permit persons to whom the Software is furnished to do so, subject to
|
74
|
+
the following conditions:
|
75
|
+
|
76
|
+
The above copyright notice and this permission notice shall be
|
77
|
+
included in all copies or substantial portions of the Software.
|
78
|
+
|
79
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
80
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
81
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
82
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
83
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
84
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
85
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
$: << File.join(File.dirname(__FILE__), "lib")
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rake'
|
5
|
+
require 'rake/testtask'
|
6
|
+
require 'openx'
|
7
|
+
|
8
|
+
Rake::TestTask.new(:test) do |test|
|
9
|
+
test.test_files = FileList["test/**/test_*.rb"].sort
|
10
|
+
test.libs << "test"
|
11
|
+
test.verbose = false
|
12
|
+
test.warning = true
|
13
|
+
end
|
14
|
+
|
15
|
+
task :default => :test
|
16
|
+
|
17
|
+
namespace :openx do
|
18
|
+
task :clean do
|
19
|
+
ENV['OPENX_ENV'] = 'test'
|
20
|
+
include OpenX::Services
|
21
|
+
|
22
|
+
Agency.find(:all) do |agency|
|
23
|
+
Advertiser.find(:all, agency.id).each do |advertiser|
|
24
|
+
Campaign.find(:all, advertiser.id).each do |campaign|
|
25
|
+
Banner.find(:all, campaign.id).each do |banner|
|
26
|
+
banner.destroy
|
27
|
+
end
|
28
|
+
campaign.destroy
|
29
|
+
end
|
30
|
+
advertiser.destroy
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
begin
|
39
|
+
require 'jeweler'
|
40
|
+
Jeweler::Tasks.new do |gemspec|
|
41
|
+
gemspec.name = "bsm-openx"
|
42
|
+
gemspec.summary = "A Ruby interface to the OpenX XML-RPC API"
|
43
|
+
gemspec.description = "A Ruby interface to the OpenX XML-RPC API"
|
44
|
+
gemspec.email = "dimitrij@blacksquaremedia.com"
|
45
|
+
gemspec.homepage = "http://github.com/dim/openx"
|
46
|
+
gemspec.authors = ["Aaron Patterson", "Andy Smith", "TouchLocal P/L", "Dimitrij Denissenko"]
|
47
|
+
end
|
48
|
+
Jeweler::GemcutterTasks.new
|
49
|
+
rescue LoadError
|
50
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
51
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.1
|
data/bsm-openx.gemspec
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{bsm-openx}
|
8
|
+
s.version = "1.9.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Aaron Patterson", "Andy Smith", "TouchLocal P/L", "Dimitrij Denissenko"]
|
12
|
+
s.date = %q{2010-09-09}
|
13
|
+
s.description = %q{A Ruby interface to the OpenX XML-RPC API}
|
14
|
+
s.email = %q{dimitrij@blacksquaremedia.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.txt"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"Gemfile",
|
21
|
+
"Gemfile.lock",
|
22
|
+
"README.txt",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"bsm-openx.gemspec",
|
26
|
+
"lib/openx.rb",
|
27
|
+
"lib/openx/image.rb",
|
28
|
+
"lib/openx/invocation.rb",
|
29
|
+
"lib/openx/services.rb",
|
30
|
+
"lib/openx/services/advertiser.rb",
|
31
|
+
"lib/openx/services/agency.rb",
|
32
|
+
"lib/openx/services/banner.rb",
|
33
|
+
"lib/openx/services/base.rb",
|
34
|
+
"lib/openx/services/campaign.rb",
|
35
|
+
"lib/openx/services/channel.rb",
|
36
|
+
"lib/openx/services/persistance.rb",
|
37
|
+
"lib/openx/services/publisher.rb",
|
38
|
+
"lib/openx/services/session.rb",
|
39
|
+
"lib/openx/services/targeting_rule.rb",
|
40
|
+
"lib/openx/services/targeting_rules.rb",
|
41
|
+
"lib/openx/services/zone.rb",
|
42
|
+
"lib/openx/xmlrpc_client.rb",
|
43
|
+
"test/assets/300x250.jpg",
|
44
|
+
"test/assets/cat.swf",
|
45
|
+
"test/helper.rb",
|
46
|
+
"test/test_advertiser.rb",
|
47
|
+
"test/test_agency.rb",
|
48
|
+
"test/test_banner.rb",
|
49
|
+
"test/test_base.rb",
|
50
|
+
"test/test_campaign.rb",
|
51
|
+
"test/test_channel.rb",
|
52
|
+
"test/test_openx.rb",
|
53
|
+
"test/test_publisher.rb",
|
54
|
+
"test/test_services.rb",
|
55
|
+
"test/test_session.rb",
|
56
|
+
"test/test_targeting_rule.rb",
|
57
|
+
"test/test_targeting_rules.rb",
|
58
|
+
"test/test_zone.rb"
|
59
|
+
]
|
60
|
+
s.homepage = %q{http://github.com/dim/openx}
|
61
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
62
|
+
s.require_paths = ["lib"]
|
63
|
+
s.rubygems_version = %q{1.3.7}
|
64
|
+
s.summary = %q{A Ruby interface to the OpenX XML-RPC API}
|
65
|
+
s.test_files = [
|
66
|
+
"test/test_openx.rb",
|
67
|
+
"test/test_channel.rb",
|
68
|
+
"test/test_targeting_rule.rb",
|
69
|
+
"test/test_zone.rb",
|
70
|
+
"test/test_session.rb",
|
71
|
+
"test/helper.rb",
|
72
|
+
"test/test_campaign.rb",
|
73
|
+
"test/test_base.rb",
|
74
|
+
"test/test_agency.rb",
|
75
|
+
"test/test_advertiser.rb",
|
76
|
+
"test/test_services.rb",
|
77
|
+
"test/test_banner.rb",
|
78
|
+
"test/test_targeting_rules.rb",
|
79
|
+
"test/test_publisher.rb"
|
80
|
+
]
|
81
|
+
|
82
|
+
if s.respond_to? :specification_version then
|
83
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
84
|
+
s.specification_version = 3
|
85
|
+
|
86
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
87
|
+
else
|
88
|
+
end
|
89
|
+
else
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
data/lib/openx.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module OpenX
|
2
|
+
autoload :Image, 'openx/image'
|
3
|
+
autoload :Invocation, 'openx/invocation'
|
4
|
+
autoload :Services, 'openx/services'
|
5
|
+
autoload :XmlrpcClient, 'openx/xmlrpc_client'
|
6
|
+
autoload :XmlrpcSessionClient, 'openx/xmlrpc_client'
|
7
|
+
|
8
|
+
@@env = ENV['OPENX_ENV'] || 'production'
|
9
|
+
@@config_file = File.join(ENV['HOME'], '.openx', 'credentials.yml')
|
10
|
+
@@configuration = nil
|
11
|
+
|
12
|
+
DEFAULT_OPTIONS = { 'retry' => true, 'timeout' => 10 }
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
def env
|
17
|
+
@@env
|
18
|
+
end
|
19
|
+
|
20
|
+
def env=(value)
|
21
|
+
@@env = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def configuration
|
25
|
+
@@configuration ||= DEFAULT_OPTIONS.merge(YAML.load_file(config_file)[env])
|
26
|
+
end
|
27
|
+
|
28
|
+
def configuration=(value)
|
29
|
+
@@configuration = value
|
30
|
+
end
|
31
|
+
|
32
|
+
def config_file
|
33
|
+
@@config_file
|
34
|
+
end
|
35
|
+
|
36
|
+
def config_file=(value)
|
37
|
+
@@config_file = value
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/openx/image.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module OpenX
|
2
|
+
class Image
|
3
|
+
include XMLRPC::Marshallable
|
4
|
+
attr_accessor :filename, :content, :editswf
|
5
|
+
|
6
|
+
def initialize(hash_or_file)
|
7
|
+
@editswf = 0
|
8
|
+
if hash_or_file.is_a?(File)
|
9
|
+
@filename = File.basename(hash_or_file.path)
|
10
|
+
@editswf = File.basename(@filename, '.swf') == @filename ? 0 : 1
|
11
|
+
@content = XMLRPC::Base64.new(hash_or_file.read)
|
12
|
+
else
|
13
|
+
raise ArgumentError unless hash_or_file.key?(:filename)
|
14
|
+
raise ArgumentError unless hash_or_file.key?(:content)
|
15
|
+
hash_or_file.each { |k,v| send(:"#{k}=", v) }
|
16
|
+
unless self.content.is_a?(XMLRPC::Base64)
|
17
|
+
self.content = XMLRPC::Base64.new(self.content)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module OpenX
|
2
|
+
class Invocation
|
3
|
+
class << self
|
4
|
+
DEFAULTS = {
|
5
|
+
:count => 1,
|
6
|
+
:campaignid => 0,
|
7
|
+
:target => '',
|
8
|
+
:source => '',
|
9
|
+
:with_text => false,
|
10
|
+
:exclusions => [],
|
11
|
+
:inclusions => [],
|
12
|
+
:exclude_by_campaignid => false,
|
13
|
+
:exclude_by_bannerid => false
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
#
|
17
|
+
# banner = OpenX::Invocation.view("Plumber")
|
18
|
+
#
|
19
|
+
# banners = OpenX::Invocation.view("Plumber", :count => 2, :exclude_by_campaignid => true) ;nil
|
20
|
+
# banners.each do |banner|
|
21
|
+
# puts "Banner #{banner['bannerid']}"
|
22
|
+
# end; nil
|
23
|
+
#
|
24
|
+
def view(what, params = {})
|
25
|
+
params = DEFAULTS.merge(params)
|
26
|
+
url = OpenX::Services.configuration['invocation_url']
|
27
|
+
settings = {:cookies => [], :remote_addr => 'localhost'}
|
28
|
+
|
29
|
+
context = [] # used by reference after initial use
|
30
|
+
params[:exclusions].each { |item| context << convert_to_context(false, item) }
|
31
|
+
params[:inclusions].each { |item| context << convert_to_context(true, item) }
|
32
|
+
count = params[:count].to_i
|
33
|
+
|
34
|
+
remote_params = [ what, params[:campaignid], params[:target], params[:source], params[:with_text], context]
|
35
|
+
server = XmlrpcClient.new(url)
|
36
|
+
|
37
|
+
out = []
|
38
|
+
if count > 0
|
39
|
+
(0...count).each do
|
40
|
+
out << banner = server.call('openads.view', settings, *remote_params)
|
41
|
+
if count > 1
|
42
|
+
if params[:exclude_by_campaignid]
|
43
|
+
campaign_id = banner['campaignid']
|
44
|
+
context << convert_to_context(false, "campaignid:#{campaign_id}")
|
45
|
+
elsif params[:exclude_by_bannerid]
|
46
|
+
banner_id = banner['bannerid']
|
47
|
+
context << convert_to_context(false, "bannerid:#{banner_id}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
count > 1 ? out : out.first
|
53
|
+
end
|
54
|
+
|
55
|
+
def convert_to_context(is_inclusion, item)
|
56
|
+
key = is_inclusion ? '==' : '!='
|
57
|
+
{ key => item }
|
58
|
+
end
|
59
|
+
protected :convert_to_context
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module OpenX
|
4
|
+
module Services
|
5
|
+
autoload :Persistance, 'openx/services/persistance'
|
6
|
+
autoload :Base, 'openx/services/base'
|
7
|
+
autoload :Session, 'openx/services/session'
|
8
|
+
autoload :Advertiser, 'openx/services/advertiser'
|
9
|
+
autoload :Agency, 'openx/services/agency'
|
10
|
+
autoload :Campaign, 'openx/services/campaign'
|
11
|
+
autoload :Banner, 'openx/services/banner'
|
12
|
+
autoload :Publisher, 'openx/services/publisher'
|
13
|
+
autoload :Zone, 'openx/services/zone'
|
14
|
+
autoload :Channel, 'openx/services/channel'
|
15
|
+
autoload :TargetingRule, 'openx/services/targeting_rule'
|
16
|
+
autoload :TargetingRules, 'openx/services/targeting_rules'
|
17
|
+
|
18
|
+
@@connection = nil
|
19
|
+
|
20
|
+
# Default connection
|
21
|
+
def self.default_connection
|
22
|
+
@@connection ||= establish_connection(OpenX.configuration)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.establish_connection(config)
|
26
|
+
connection = Session.new(config['url'])
|
27
|
+
connection.create config['username'], config['password']
|
28
|
+
connection
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module OpenX
|
2
|
+
module Services
|
3
|
+
class Advertiser < Base
|
4
|
+
openx_accessor :name => :advertiserName,
|
5
|
+
:contact_name => :contactName,
|
6
|
+
:email => :emailAddress,
|
7
|
+
:username => :username,
|
8
|
+
:password => :password,
|
9
|
+
:agency_id => :agencyId,
|
10
|
+
:id => :advertiserId
|
11
|
+
|
12
|
+
has_one :agency
|
13
|
+
|
14
|
+
self.create = 'ox.addAdvertiser'
|
15
|
+
self.update = 'ox.modifyAdvertiser'
|
16
|
+
self.delete = 'ox.deleteAdvertiser'
|
17
|
+
self.find_one = 'ox.getAdvertiser'
|
18
|
+
self.find_all = 'ox.getAdvertiserListByAgencyId'
|
19
|
+
|
20
|
+
def initialize(params = {})
|
21
|
+
raise "need agency" unless params[:agency_id] || params[:agency]
|
22
|
+
params[:agency_id] ||= params[:agency].id
|
23
|
+
super(params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def campaigns
|
27
|
+
Campaign.find(:all, self.id)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|