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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 465a9280f15999620616b433538f1160675be864
4
+ data.tar.gz: ac65d3c9d3eecec276af7c1e12306b7e07bb922f
5
+ SHA512:
6
+ metadata.gz: 6a7607738ef57fbb3bf703eb026a1fc670f7b5e9e8904b224da915a61396a9704c51d4bd2f311d40d92812a384f801e6595694f52027d1f5cf2bf3f2054f4b26
7
+ data.tar.gz: 88868a715738c2399386f86dbe14c5c72cf26004807d67bcbad060014718748900c4042cc756d346e985309b35d4b877c1fc4ec5875ebc6d96df60dd0ff224ac
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1,14 @@
1
+ # CHANGELOG
2
+
3
+ ## 2013-05-06 - v0.1.0
4
+
5
+ * Additional `fileType` in ExternalMediaVariable
6
+ * Disable Savon stdout logging
7
+ * Support comma separated values (last element is picked)
8
+
9
+ ## 2013-04-08 - v0.0.1
10
+
11
+ * Extract common BrandMaker code
12
+ * Update and fix specs
13
+ * Remove Rails code
14
+ * Make configuration Rails independent
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in brandmaker.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Sebastian de Castelberg
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,83 @@
1
+ # Brandmaker
2
+
3
+ BrandMaker Client written in ruby. Implements Access to the
4
+ following BrandMaker APIs:
5
+
6
+ * JobManager (DSE)
7
+
8
+ Access to the Media Pool API is planned.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'brandmaker',
15
+ :git => "git@github.com:screenconcept/brandmaker.git",
16
+ :tag => 'v0.x.y'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ ## Usage
23
+
24
+ ### Configuration
25
+
26
+ Enter the BrandMaker SOAP API information in a new initializer file
27
+
28
+ # file: config/initializers/brandmaker.rb
29
+ Brandmaker.configure do |conf|
30
+ conf.user = 'username'
31
+ conf.password = 'password'
32
+ conf.dse_service = 'https://<url>/webservices/dse/?wsdl'
33
+ conf.media_pool_service = 'https://<url>/webservices/MediaPool/?wsdl'
34
+
35
+ config = Brandmaker::JobConfig.new('job_type_technical_name').tap do |c|
36
+ c.add_variables(
37
+ { :name => :JobName, :label => 'Job name' },
38
+ # ...
39
+ )
40
+ end
41
+
42
+ conf.job_configs = {
43
+ :job_type_technical_name => job_type_technical_name
44
+ }
45
+ end
46
+
47
+ Make sure to add a valid JobConfiguration for the corresponding job type.
48
+ See [here](https://github.com/screenconcept/job_manager/blob/config/initializers/brandmaker.rb) for a sample initializer file.
49
+
50
+ #### Variable Configuration
51
+
52
+ Simple variable
53
+
54
+ c.add_variables 'Variable A', 'Variable B'
55
+
56
+ Custom variable
57
+
58
+ c.add_variables { :name => :JobName, :label => 'Job name' },
59
+
60
+ Available Variable configuration options
61
+
62
+ {
63
+ name: 'Variable Name',
64
+ label: 'Human readable label',
65
+ purpose: Brandmaker::VariablePurpose.EMAIL_RECIPIENT,
66
+ content_type: :media | :grid
67
+ }
68
+
69
+ ### Job fetching
70
+
71
+ Fetch a specific Job calling the find method on the `Job` class
72
+
73
+ job = Job.find 1000
74
+ # Access the variables
75
+ job.variables
76
+
77
+ ## Contributing
78
+
79
+ 1. Fork it
80
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
81
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
82
+ 4. Push to the branch (`git push origin my-new-feature`)
83
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'brandmaker/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "brandmaker"
8
+ gem.version = Brandmaker::VERSION
9
+ gem.authors = ["Immanuel Häussermann", "Sebastian de Castelberg"]
10
+ gem.email = ["developers@screenconcept.ch"]
11
+ gem.description = %q{Allows access to BrandMaker JobManager (DSE) and MediaPool APIs}
12
+ gem.summary = %q{Ruby based BrandMaker API}
13
+ gem.homepage = "https://github.com/screenconcept/brandmaker"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'savon', '~> 1.2.0'
21
+ gem.add_dependency 'activesupport'
22
+ gem.add_dependency 'rest-client'
23
+ gem.add_dependency 'json'
24
+
25
+ gem.add_development_dependency 'rspec'
26
+ gem.add_development_dependency 'pry'
27
+ end
@@ -0,0 +1,17 @@
1
+ require "brandmaker/version"
2
+ require "brandmaker/configuration"
3
+ require "brandmaker/job_config"
4
+ require "brandmaker/variable_purpose"
5
+ require "brandmaker/custom_structure"
6
+ require "brandmaker/grid_variable"
7
+ require "brandmaker/job"
8
+ require "brandmaker/media_variable"
9
+ require "brandmaker/external_media_variable"
10
+ require "brandmaker/variable_config"
11
+ require "brandmaker/variable"
12
+ require "brandmaker/variable_collection"
13
+
14
+ Savon.configure do |config|
15
+ config.log = false
16
+ config.log_level = :info
17
+ end
@@ -0,0 +1,46 @@
1
+ module Brandmaker
2
+
3
+ class << self
4
+ attr_accessor :configuration
5
+ end
6
+
7
+ def self.configure
8
+ yield(configuration)
9
+
10
+ configuration.dse_client = Savon.client do |wsdl, http, wsse|
11
+ wsdl.document = configuration.dse_service
12
+ wsdl.endpoint = configuration.dse_service
13
+ http.auth.basic(configuration.user, configuration.password)
14
+ end
15
+
16
+ configuration.media_pool_client = Savon.client do |wsdl, http, wsse|
17
+ wsdl.document = configuration.media_pool_service
18
+ wsdl.endpoint = configuration.media_pool_service
19
+ http.auth.basic(configuration.user, configuration.password)
20
+ end
21
+ end
22
+
23
+ def self.configuration
24
+ @configuration ||= Configuration.new
25
+ end
26
+
27
+ class Configuration
28
+ attr_accessor :user
29
+ attr_accessor :password
30
+ attr_accessor :dse_service
31
+ attr_accessor :media_pool_service
32
+ attr_accessor :external_media_service
33
+ attr_accessor :external_media_service_secret
34
+ attr_accessor :job_configs
35
+
36
+ attr_accessor :dse_client
37
+ attr_accessor :media_pool_client
38
+
39
+ def initialize
40
+ @job_configs = {}
41
+ @media_pool_client = Savon.client
42
+ @dse_client = Savon.client
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,54 @@
1
+ require 'brandmaker/configuration'
2
+
3
+ require 'savon'
4
+
5
+ module Brandmaker
6
+ class CustomStructure
7
+ extend Savon::Model
8
+
9
+ actions :find_all_custom_structures
10
+
11
+ def self.client
12
+ Brandmaker.configuration.dse_client
13
+ end
14
+
15
+ class << self
16
+ def find_by_technical_name technical_name
17
+ name = custom_structure_name_for_mapped_technical_name(technical_name)
18
+ unless name.nil?
19
+ all.find { |cs| cs.name == name }
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def all
26
+ find_all_custom_structures.body[:find_all_custom_structures_response][:return][:custom_structures].collect do |data|
27
+ CustomStructure.new data
28
+ end
29
+ end
30
+
31
+ def custom_structure_name_for_mapped_technical_name technical_name
32
+ {
33
+ 'anbieter_hinzufgen' => 'PM_ExterneSuppliers_Druckereien'
34
+ }[technical_name]
35
+ end
36
+ end
37
+
38
+ def initialize data
39
+ @data = data
40
+ end
41
+
42
+ def name
43
+ @data[:name]
44
+ end
45
+
46
+ def label
47
+ @data[:name]
48
+ end
49
+
50
+ def objects
51
+ @data[:objects]
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,37 @@
1
+ require 'rest_client'
2
+ require 'json'
3
+
4
+ module Brandmaker
5
+ class ExternalMediaVariable < Variable
6
+ attr_accessor :downloadUrl
7
+ attr_accessor :fileOriginalName
8
+ attr_accessor :fileType
9
+
10
+ def value
11
+ super.split(",").last rescue nil
12
+ end
13
+
14
+ def reload
15
+ if value.present?
16
+ res = RestClient.get(
17
+ Brandmaker.configuration.external_media_service,
18
+ {
19
+ :params => {
20
+ :mediaID => value,
21
+ :secret => Brandmaker.configuration.external_media_service_secret
22
+ }
23
+ }
24
+ )
25
+ hash = JSON.parse(res)
26
+ error = hash['ERROR'].presence
27
+ if error
28
+ raise error
29
+ end
30
+ self.fileOriginalName = hash['fileOriginalName']
31
+ self.downloadUrl = hash['downloadUrl']
32
+ self.fileType = hash['fileType']
33
+ self
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,55 @@
1
+ require 'active_support/core_ext'
2
+
3
+ require 'brandmaker/variable'
4
+
5
+ module Brandmaker
6
+ class GridVariable < Variable
7
+ def value
8
+ begin
9
+ if custom_structure.present?
10
+ values = custom_structure_values
11
+ else
12
+ values = actual_values
13
+ end
14
+
15
+ if purpose == VariablePurpose::EMAIL_RECIPIENT
16
+ values.map { |val| extract_email val }.compact
17
+ else
18
+ values
19
+ end
20
+ rescue
21
+ super
22
+ end
23
+ end
24
+
25
+ def actual_values
26
+ rows.map do |row|
27
+ row.try(:[], :variable).try(:[], :value).presence
28
+ end.compact
29
+ end
30
+
31
+ def custom_structure_values
32
+ actual_values.collect do |val|
33
+ obj = custom_structure.objects.find do |object|
34
+ object[:name] == val
35
+ end
36
+ obj[:label]
37
+ end
38
+ end
39
+
40
+ def rows
41
+ values = @data[:grid][:row]
42
+ values = [values] if values.is_a? Hash
43
+ values
44
+ end
45
+
46
+ def extract_email val
47
+ val.match(/\(([^)]+)\)/).try(:[], 1)
48
+ end
49
+
50
+ def custom_structure
51
+ @custom_structure ||= Brandmaker::CustomStructure.find_by_technical_name(self.technical_name)
52
+ @custom_structure
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,57 @@
1
+ require 'brandmaker/configuration'
2
+
3
+ require 'savon'
4
+
5
+ module Brandmaker
6
+ class Job
7
+ extend Savon::Model
8
+
9
+ actions :find_by_id
10
+
11
+ def self.client
12
+ Brandmaker.configuration.dse_client
13
+ end
14
+
15
+ # ”desriptions" is a brandmaker typo in API
16
+
17
+ def self.find id
18
+ Job.new find_by_id({:id => id}).body[:find_by_id_response][:return]
19
+ end
20
+
21
+ def initialize data
22
+ @data = data
23
+ @plain_variables ||= Brandmaker::VariableCollection.new @data[:desriptions][:variable]
24
+ end
25
+
26
+ def id
27
+ @data[:desriptions][:id]
28
+ end
29
+
30
+ def technical_name
31
+ @data[:desriptions][:type_name]
32
+ end
33
+
34
+ def config
35
+ Brandmaker.configuration.job_configs[self.technical_name.to_sym] or raise "Job #{self.id} is not configured, no config for #{self.technical_name}"
36
+ end
37
+
38
+ def variables
39
+ available_variable_names = @plain_variables.map(&:technical_name)
40
+ @variables ||= Brandmaker::VariableCollection.new(
41
+ config.variables.select do |variable_config|
42
+ available_variable_names.include? variable_config.name.to_s
43
+ end.collect do |variable_config|
44
+ variable = @plain_variables.find_by_technical_name(variable_config.name.to_s)
45
+ configured_variable = variable_config.to_typed_instance(variable.data)
46
+ configured_variable.config = variable_config
47
+ configured_variable
48
+ end, false)
49
+ end
50
+
51
+ def recipients
52
+ val = variables.find_by_purpose(VariablePurpose::EMAIL_RECIPIENT).value
53
+ val = [val] unless val.is_a? Array
54
+ val
55
+ end
56
+ end
57
+ end