brandmaker 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +83 -0
- data/Rakefile +1 -0
- data/brandmaker.gemspec +27 -0
- data/lib/brandmaker.rb +17 -0
- data/lib/brandmaker/configuration.rb +46 -0
- data/lib/brandmaker/custom_structure.rb +54 -0
- data/lib/brandmaker/external_media_variable.rb +37 -0
- data/lib/brandmaker/grid_variable.rb +55 -0
- data/lib/brandmaker/job.rb +57 -0
- data/lib/brandmaker/job_config.rb +18 -0
- data/lib/brandmaker/media_variable.rb +7 -0
- data/lib/brandmaker/variable.rb +37 -0
- data/lib/brandmaker/variable_collection.rb +26 -0
- data/lib/brandmaker/variable_config.rb +39 -0
- data/lib/brandmaker/variable_purpose.rb +7 -0
- data/lib/brandmaker/version.rb +3 -0
- data/spec/brandmaker/configuration_spec.rb +47 -0
- data/spec/brandmaker/custom_structure_spec.rb +73 -0
- data/spec/brandmaker/external_media_variable_spec.rb +72 -0
- data/spec/brandmaker/grid_variable_spec.rb +153 -0
- data/spec/brandmaker/job_spec.rb +89 -0
- data/spec/brandmaker/seed_data.rb +206 -0
- data/spec/brandmaker/variable_collection_spec.rb +56 -0
- data/spec/brandmaker/variable_spec.rb +64 -0
- data/spec/spec_helper.rb +18 -0
- metadata +167 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module Brandmaker
|
2
|
+
class JobConfig
|
3
|
+
attr_accessor :technical_name
|
4
|
+
attr_accessor :variables
|
5
|
+
|
6
|
+
def initialize technical_name, variables = []
|
7
|
+
@technical_name = technical_name
|
8
|
+
@variables = variables
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_variables *vars
|
12
|
+
vars.each_with_index do |var, index|
|
13
|
+
hash = var.is_a?(Hash) ? var : { :name => var }
|
14
|
+
variables << VariableConfig.new(hash)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
module Brandmaker
|
4
|
+
class Variable
|
5
|
+
attr_accessor :config
|
6
|
+
|
7
|
+
def initialize data, config = VariableConfig.new
|
8
|
+
@data = data
|
9
|
+
@config = config
|
10
|
+
end
|
11
|
+
|
12
|
+
def data
|
13
|
+
@data
|
14
|
+
end
|
15
|
+
|
16
|
+
def technical_name
|
17
|
+
@data[:technical_name]
|
18
|
+
end
|
19
|
+
|
20
|
+
def value
|
21
|
+
@data[:value]
|
22
|
+
end
|
23
|
+
|
24
|
+
def purpose
|
25
|
+
# purpose is actually not provided by the api
|
26
|
+
@data[:purpose] || config.purpose
|
27
|
+
end
|
28
|
+
|
29
|
+
def label
|
30
|
+
config.label || technical_name.humanize
|
31
|
+
end
|
32
|
+
|
33
|
+
def type_id
|
34
|
+
@data[:variable_type_id]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Brandmaker
|
2
|
+
class VariableCollection < Array
|
3
|
+
|
4
|
+
def initialize variables, create = true
|
5
|
+
if create
|
6
|
+
super variables.map { |var| Brandmaker::Variable.new(var) }
|
7
|
+
else
|
8
|
+
super variables
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_by_technical_name(technical_name)
|
13
|
+
find { |variable| variable.technical_name == technical_name }
|
14
|
+
end
|
15
|
+
|
16
|
+
def find_by_purpose(purpose)
|
17
|
+
find do |variable|
|
18
|
+
variable.purpose == purpose
|
19
|
+
end || raise("#{purpose} is not configured for this job")
|
20
|
+
end
|
21
|
+
|
22
|
+
def unpurposed
|
23
|
+
VariableCollection.new self.select { |var| var.purpose.blank? }, false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'brandmaker/variable'
|
2
|
+
require 'brandmaker/media_variable'
|
3
|
+
require 'brandmaker/grid_variable'
|
4
|
+
|
5
|
+
module Brandmaker
|
6
|
+
class VariableConfig
|
7
|
+
attr_accessor :name
|
8
|
+
|
9
|
+
attr_accessor :label
|
10
|
+
attr_accessor :content_type
|
11
|
+
attr_accessor :purpose
|
12
|
+
|
13
|
+
VARIABLE_TYPES = {
|
14
|
+
:"" => Variable,
|
15
|
+
:media => MediaVariable,
|
16
|
+
:external_media => ExternalMediaVariable,
|
17
|
+
:grid => GridVariable
|
18
|
+
}
|
19
|
+
|
20
|
+
def initialize(*h)
|
21
|
+
if h.length == 1 && h.first.kind_of?(Hash)
|
22
|
+
h.first.each { |k,v| send("#{k}=",v) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_typed_instance(data)
|
27
|
+
type = content_type
|
28
|
+
klass = VARIABLE_TYPES[content_type.to_s.downcase.to_sym]
|
29
|
+
unless klass.nil?
|
30
|
+
instance = klass.new(data)
|
31
|
+
instance.config = self
|
32
|
+
instance
|
33
|
+
else
|
34
|
+
raise "Unknown variable type #{type}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Brandmaker
|
4
|
+
describe Configuration do
|
5
|
+
|
6
|
+
describe 'default configuration' do
|
7
|
+
it 'initializes a default configuration' do
|
8
|
+
Brandmaker.configuration.should be_a(Configuration)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'initializes an empty job_configs hash' do
|
12
|
+
Brandmaker.configuration.job_configs.should == {}
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'initializes a default dse_client' do
|
16
|
+
Brandmaker.configuration.dse_client.should be_a(Savon::Client)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'initializes a default media_pool_client' do
|
20
|
+
Brandmaker.configuration.media_pool_client.should be_a(Savon::Client)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#configure' do
|
25
|
+
context 'when calling configure' do
|
26
|
+
before :each do
|
27
|
+
Brandmaker.configure do |c|
|
28
|
+
c.user = 'user'
|
29
|
+
c.password = 'user'
|
30
|
+
c.dse_service = 'dse_service_url'
|
31
|
+
c.media_pool_service = 'media_pool_url'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'creates a dse_client with the given configuration' do
|
36
|
+
Brandmaker.configuration.dse_client.wsdl.document.should == 'dse_service_url'
|
37
|
+
Brandmaker.configuration.dse_client.wsdl.endpoint.should == 'dse_service_url'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'creates a media_pool_client with the given configuration' do
|
41
|
+
Brandmaker.configuration.media_pool_client.wsdl.document.should == 'media_pool_url'
|
42
|
+
Brandmaker.configuration.media_pool_client.wsdl.endpoint.should == 'media_pool_url'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Brandmaker::CustomStructure do
|
4
|
+
|
5
|
+
describe 'class methods' do
|
6
|
+
before do
|
7
|
+
Brandmaker::CustomStructure.stub!(:find_all_custom_structures)
|
8
|
+
.and_return(mock(Object, :body => custom_structure_all_data))
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.all' do
|
12
|
+
it 'returns an array of Brandmaker::CustomStructure instances' do
|
13
|
+
Brandmaker::CustomStructure.all.should be_all { |cs| cs.should be_a(Brandmaker::CustomStructure) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.find_by_technical_name' do
|
18
|
+
context 'when the technical name successfully matches a mapping' do
|
19
|
+
it 'returns an instance of Brandmaker::CustomStructure' do
|
20
|
+
Brandmaker::CustomStructure.find_by_technical_name('anbieter_hinzufgen').should be_a(Brandmaker::CustomStructure)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'accesses the custom structure collection' do
|
24
|
+
Brandmaker::CustomStructure.should_receive(:all).and_return []
|
25
|
+
Brandmaker::CustomStructure.find_by_technical_name('anbieter_hinzufgen')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when the technical name does not match a mapping' do
|
30
|
+
it 'returns nil' do
|
31
|
+
Brandmaker::CustomStructure.find_by_technical_name('anything').should be_nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'does not access the collection' do
|
35
|
+
Brandmaker::CustomStructure.should_not_receive(:all)
|
36
|
+
Brandmaker::CustomStructure.find_by_technical_name('anything')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '.custom_structure_name_for_mapped_technical_name' do
|
42
|
+
it 'maps a technical name of variable to a custom structure name' do
|
43
|
+
mapped_value = 'PM_ExterneSuppliers_Druckereien'
|
44
|
+
Brandmaker::CustomStructure.custom_structure_name_for_mapped_technical_name('anbieter_hinzufgen').should == mapped_value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'instance methods' do
|
50
|
+
let :custom_structure do
|
51
|
+
Brandmaker::CustomStructure.new custom_structure_external_suppliers_data
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#name' do
|
55
|
+
it 'returns the name' do
|
56
|
+
custom_structure.name.should == 'PM_ExterneSuppliers_Druckereien'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#label' do
|
61
|
+
it 'returns the label' do
|
62
|
+
custom_structure.label.should == 'PM_ExterneSuppliers_Druckereien'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#objects' do
|
67
|
+
it 'returns an array of hashes' do
|
68
|
+
custom_structure.objects.should be_all { |h| h.should be_a(Hash) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Brandmaker
|
5
|
+
describe ExternalMediaVariable do
|
6
|
+
|
7
|
+
describe '#value' do
|
8
|
+
context 'when no value is available' do
|
9
|
+
it 'returns nil' do
|
10
|
+
var = ExternalMediaVariable.new({ :value => nil })
|
11
|
+
var.value.should be_nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when a single value is available' do
|
16
|
+
it 'returns that value' do
|
17
|
+
var = ExternalMediaVariable.new({ :value => "one" })
|
18
|
+
var.value.should == 'one'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when multiple values are available' do
|
23
|
+
it 'returns the last value' do
|
24
|
+
var = ExternalMediaVariable.new({ :value => "one,two" })
|
25
|
+
var.value.should == 'two'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#reload' do
|
31
|
+
before :each do
|
32
|
+
Brandmaker.configuration.external_media_service = 'URL'
|
33
|
+
Brandmaker.configuration.external_media_service_secret = 'SECRET'
|
34
|
+
end
|
35
|
+
|
36
|
+
let :var do
|
37
|
+
ExternalMediaVariable.new({ :value => "130" })
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with valid mediaID' do
|
41
|
+
before :each do
|
42
|
+
RestClient.should_receive(:get).with(
|
43
|
+
'URL', {:params => {:mediaID => "130", :secret => 'SECRET'}}
|
44
|
+
).and_return({
|
45
|
+
:downloadUrl => "download url",
|
46
|
+
:fileOriginalName => "original name"
|
47
|
+
}.to_json)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'fetches media variable attributes from the API' do
|
51
|
+
var.reload
|
52
|
+
var.fileOriginalName.should == 'original name'
|
53
|
+
var.downloadUrl.should == 'download url'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns self' do
|
57
|
+
var.reload.should be(var)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with invalid mediaID' do
|
62
|
+
it 'fetches media variable attributes from the API' do
|
63
|
+
RestClient.should_receive(:get).and_return({
|
64
|
+
:ERROR => "Requested media not found!"
|
65
|
+
}.to_json)
|
66
|
+
expect { var.reload }.to raise_error(/Requested media not found/)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Brandmaker
|
4
|
+
describe GridVariable do
|
5
|
+
describe '#value' do
|
6
|
+
|
7
|
+
context 'without a matching custom structure' do
|
8
|
+
context 'when the purpose is not present' do
|
9
|
+
let :grid_var do
|
10
|
+
g = Brandmaker::GridVariable.new grid_variable_data
|
11
|
+
g.stub!(:custom_structure).and_return(nil)
|
12
|
+
g
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns an array of values' do
|
16
|
+
grid_var.value.should == grid_var.actual_values
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns the actual values' do
|
20
|
+
grid_var.should_receive(:actual_values).once
|
21
|
+
grid_var.should_not_receive(:custom_structure_values)
|
22
|
+
grid_var.value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when the purpose is the email recipient' do
|
27
|
+
let :grid_var do
|
28
|
+
g = Brandmaker::GridVariable.new grid_variable_email_data
|
29
|
+
g.stub!(:custom_structure).and_return(nil)
|
30
|
+
g.stub(:purpose).and_return(VariablePurpose::EMAIL_RECIPIENT)
|
31
|
+
g
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns an array of email addresses' do
|
35
|
+
grid_var.value.should == %w(immanuel.haeussermann@screenconcept.ch michael.friedli@gateb.com)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'parses the values' do
|
39
|
+
grid_var.should_receive(:extract_email).twice
|
40
|
+
grid_var.value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with a matching custom structure' do
|
46
|
+
it 'returns the custom structure values' do
|
47
|
+
grid_var = Brandmaker::GridVariable.new grid_variable_data
|
48
|
+
grid_var.stub(:custom_structure).and_return Brandmaker::CustomStructure.new({})
|
49
|
+
grid_var.should_receive(:custom_structure_values).once.and_return %w(A B)
|
50
|
+
grid_var.value.should == %w(A B)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#actual_values' do
|
56
|
+
let :grid_var do
|
57
|
+
Brandmaker::GridVariable.new grid_variable_data
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'does not fail' do
|
61
|
+
grid_var.stub(:rows).and_return [{:worthless => nil}]
|
62
|
+
expect { grid_var.actual_values }.to_not raise_error
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns an array of values' do
|
66
|
+
grid_var.value.should == %w(Immanuel Michi)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#custom_structure_values' do
|
71
|
+
let :custom_structure do
|
72
|
+
Brandmaker::CustomStructure.new :objects => [
|
73
|
+
{:name => 'Immanuel', :label => 'Immanuel X'},
|
74
|
+
{:name => 'Michi', :label => 'Michi X'}
|
75
|
+
]
|
76
|
+
end
|
77
|
+
|
78
|
+
let :grid_var do
|
79
|
+
g = Brandmaker::GridVariable.new(grid_variable_data)
|
80
|
+
g.stub(:custom_structure).and_return custom_structure
|
81
|
+
g
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'returns the mapped custom structure values' do
|
85
|
+
grid_var.custom_structure_values.should == ['Immanuel X', 'Michi X']
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#extract_email' do
|
90
|
+
it 'parses the email address from the value' do
|
91
|
+
grid_var = Brandmaker::GridVariable.new({})
|
92
|
+
grid_var.stub!(:custom_structure).and_return(nil)
|
93
|
+
address = grid_var.extract_email('Immanuel (immanuel.haeussermann@screenconcept.ch)')
|
94
|
+
address.should == 'immanuel.haeussermann@screenconcept.ch'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe '#rows' do
|
99
|
+
context 'when there is only a single row returned as hash from the API' do
|
100
|
+
let :grid_var do
|
101
|
+
Brandmaker::GridVariable.new grid_variable_single_row_data
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'returns an array' do
|
105
|
+
grid_var.rows.should be_a(Array)
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'does not fail' do
|
109
|
+
expect { grid_var.rows }.to_not raise_error
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context 'when there are multiple rows returns as array from the API' do
|
114
|
+
let :grid_var do
|
115
|
+
Brandmaker::GridVariable.new grid_variable_data
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'returns an array' do
|
119
|
+
grid_var.rows.should be_a(Array)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'does not fail' do
|
123
|
+
expect { grid_var.rows }.to_not raise_error
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#custom_structure' do
|
129
|
+
context 'when the technical name is mapped' do
|
130
|
+
before do
|
131
|
+
Brandmaker::CustomStructure.should_receive(:find_all_custom_structures)
|
132
|
+
.and_return(mock(Object, :body => custom_structure_all_data))
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'returns a custom structure' do
|
136
|
+
grid_var = Brandmaker::GridVariable.new({:technical_name => 'anbieter_hinzufgen'})
|
137
|
+
grid_var.custom_structure.should be_a(Brandmaker::CustomStructure)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'when the technical name is not mapped' do
|
142
|
+
before do
|
143
|
+
Brandmaker::CustomStructure.should_not_receive(:find_all_custom_structures)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'returns nil' do
|
147
|
+
grid_var = Brandmaker::GridVariable.new({:technical_name => 'anything'})
|
148
|
+
grid_var.custom_structure.should be_nil
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|