daengine 0.1.2 → 0.1.3
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.
- data/Gemfile +17 -17
- data/MIT-LICENSE +20 -20
- data/Rakefile +29 -29
- data/app/assets/javascripts/digital_assets.js +2 -2
- data/app/assets/stylesheets/digital_assets.css +4 -4
- data/app/controllers/digital_assets_controller.rb +76 -76
- data/app/helpers/digital_assets_helper.rb +2 -2
- data/app/views/digital_assets/_form.html.erb +17 -17
- data/app/views/digital_assets/edit.html.erb +6 -6
- data/app/views/digital_assets/index.html.erb +34 -34
- data/app/views/digital_assets/new.html.erb +5 -5
- data/app/views/digital_assets/search.html.erb +46 -46
- data/app/views/digital_assets/show.html.erb +58 -58
- data/config/routes.rb +8 -8
- data/lib/daengine.rb +72 -44
- data/lib/daengine/digital_asset_processor.rb +89 -56
- data/lib/daengine/engine.rb +6 -6
- data/lib/daengine/teamsite_metadata_parser.rb +10 -1
- data/lib/daengine/version.rb +3 -3
- data/lib/tasks/daengine_tasks.rake +4 -4
- data/spec/controllers/digital_assets_controller_spec.rb +202 -202
- data/spec/dummy/README.rdoc +261 -261
- data/spec/dummy/Rakefile +7 -7
- data/spec/dummy/app/assets/javascripts/application.js +15 -15
- data/spec/dummy/app/assets/stylesheets/application.css +13 -13
- data/spec/dummy/app/controllers/application_controller.rb +3 -3
- data/spec/dummy/app/helpers/application_helper.rb +2 -2
- data/spec/dummy/app/views/layouts/application.html.erb +14 -14
- data/spec/dummy/config.ru +4 -4
- data/spec/dummy/config/application.rb +70 -70
- data/spec/dummy/config/boot.rb +9 -9
- data/spec/dummy/config/environment.rb +5 -5
- data/spec/dummy/config/environments/development.rb +37 -37
- data/spec/dummy/config/environments/production.rb +67 -67
- data/spec/dummy/config/environments/test.rb +37 -37
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -7
- data/spec/dummy/config/initializers/inflections.rb +15 -15
- data/spec/dummy/config/initializers/mime_types.rb +5 -5
- data/spec/dummy/config/initializers/secret_token.rb +7 -7
- data/spec/dummy/config/initializers/session_store.rb +8 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -14
- data/spec/dummy/config/locales/en.yml +5 -5
- data/spec/dummy/config/mongoid.yml +20 -20
- data/spec/dummy/config/routes.rb +58 -58
- data/spec/dummy/log/development.log +4 -0
- data/spec/dummy/log/test.log +435 -0
- data/spec/dummy/public/404.html +26 -26
- data/spec/dummy/public/422.html +26 -26
- data/spec/dummy/public/500.html +25 -25
- data/spec/dummy/script/rails +6 -6
- data/spec/lib/teamsite_metadata_parser_spec.rb +59 -59
- data/spec/spec_helper.rb +40 -40
- metadata +17 -12
@@ -1,58 +1,58 @@
|
|
1
|
-
<p id="notice"><%= notice %></p>
|
2
|
-
|
3
|
-
<p>
|
4
|
-
<b>Title:</b>
|
5
|
-
<%= @digital_asset.title %>
|
6
|
-
</p>
|
7
|
-
|
8
|
-
<p>
|
9
|
-
<b>Updated at:</b>
|
10
|
-
<%= @digital_asset.updated_at %>
|
11
|
-
</p>
|
12
|
-
|
13
|
-
<p>
|
14
|
-
<b>Audience:</b>
|
15
|
-
<%= @digital_asset.audiences %>
|
16
|
-
</p>
|
17
|
-
|
18
|
-
<p>
|
19
|
-
<b>Sami code:</b>
|
20
|
-
<%= @digital_asset.sami_code %>
|
21
|
-
</p>
|
22
|
-
|
23
|
-
<p>
|
24
|
-
<b>Program:</b>
|
25
|
-
<%= @digital_asset.product_ids %>
|
26
|
-
</p>
|
27
|
-
|
28
|
-
<p>
|
29
|
-
<b>Published at:</b>
|
30
|
-
<%= @digital_asset.published_at %>
|
31
|
-
</p>
|
32
|
-
|
33
|
-
<p>
|
34
|
-
<b>Expires at:</b>
|
35
|
-
<%= @digital_asset.expires_at %>
|
36
|
-
</p>
|
37
|
-
|
38
|
-
<p>
|
39
|
-
<b>Guid:</b>
|
40
|
-
<%= @digital_asset.guid %>
|
41
|
-
</p>
|
42
|
-
|
43
|
-
<% if @digital_asset.documents.size > 0 %>
|
44
|
-
<h2>Current Documents</h2>
|
45
|
-
<table>
|
46
|
-
<tr>
|
47
|
-
<th>Content Type</th>
|
48
|
-
<th>Path</th>
|
49
|
-
</tr>
|
50
|
-
<% for document in @digital_asset.documents %>
|
51
|
-
<tr>
|
52
|
-
<td><%= document.content_type %></td>
|
53
|
-
<td><%= document.path %></td>
|
54
|
-
</tr>
|
55
|
-
<% end %>
|
56
|
-
</table>
|
57
|
-
<% end %>
|
58
|
-
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
<b>Title:</b>
|
5
|
+
<%= @digital_asset.title %>
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<b>Updated at:</b>
|
10
|
+
<%= @digital_asset.updated_at %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<p>
|
14
|
+
<b>Audience:</b>
|
15
|
+
<%= @digital_asset.audiences %>
|
16
|
+
</p>
|
17
|
+
|
18
|
+
<p>
|
19
|
+
<b>Sami code:</b>
|
20
|
+
<%= @digital_asset.sami_code %>
|
21
|
+
</p>
|
22
|
+
|
23
|
+
<p>
|
24
|
+
<b>Program:</b>
|
25
|
+
<%= @digital_asset.product_ids %>
|
26
|
+
</p>
|
27
|
+
|
28
|
+
<p>
|
29
|
+
<b>Published at:</b>
|
30
|
+
<%= @digital_asset.published_at %>
|
31
|
+
</p>
|
32
|
+
|
33
|
+
<p>
|
34
|
+
<b>Expires at:</b>
|
35
|
+
<%= @digital_asset.expires_at %>
|
36
|
+
</p>
|
37
|
+
|
38
|
+
<p>
|
39
|
+
<b>Guid:</b>
|
40
|
+
<%= @digital_asset.guid %>
|
41
|
+
</p>
|
42
|
+
|
43
|
+
<% if @digital_asset.documents.size > 0 %>
|
44
|
+
<h2>Current Documents</h2>
|
45
|
+
<table>
|
46
|
+
<tr>
|
47
|
+
<th>Content Type</th>
|
48
|
+
<th>Path</th>
|
49
|
+
</tr>
|
50
|
+
<% for document in @digital_asset.documents %>
|
51
|
+
<tr>
|
52
|
+
<td><%= document.content_type %></td>
|
53
|
+
<td><%= document.path %></td>
|
54
|
+
</tr>
|
55
|
+
<% end %>
|
56
|
+
</table>
|
57
|
+
<% end %>
|
58
|
+
|
data/config/routes.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
Rails.application.routes.draw do
|
2
|
-
match 'digital_assets/search' => 'digital_assets#search'
|
3
|
-
post "digital_assets/sync" => 'digital_assets#sync_assets'
|
4
|
-
# match 'digital_assets/:id' => 'digital_assets#sami' #, :id => /\w{4,8}.\d*/
|
5
|
-
resources :digital_assets, :only => [:index, :show]
|
6
|
-
#resources :digital_assets
|
7
|
-
#get 'digital_assets' => 'digital_asset#index'
|
8
|
-
end
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
match 'digital_assets/search' => 'digital_assets#search'
|
3
|
+
# post "digital_assets/sync" => 'digital_assets#sync_assets'
|
4
|
+
# match 'digital_assets/:id' => 'digital_assets#sami' #, :id => /\w{4,8}.\d*/
|
5
|
+
resources :digital_assets, :only => [:index, :show]
|
6
|
+
#resources :digital_assets
|
7
|
+
#get 'digital_assets' => 'digital_asset#index'
|
8
|
+
end
|
data/lib/daengine.rb
CHANGED
@@ -1,44 +1,72 @@
|
|
1
|
-
require "daengine/version"
|
2
|
-
require 'daengine/engine'
|
3
|
-
require File.expand_path('../../app/models/digital_asset',__FILE__)
|
4
|
-
require 'daengine/teamsite_metadata_parser'
|
5
|
-
require 'daengine/digital_asset_processor'
|
6
|
-
require 'mongoid'
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
'
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
1
|
+
require "daengine/version"
|
2
|
+
require 'daengine/engine'
|
3
|
+
require File.expand_path('../../app/models/digital_asset',__FILE__)
|
4
|
+
require 'daengine/teamsite_metadata_parser'
|
5
|
+
require 'daengine/digital_asset_processor'
|
6
|
+
require 'mongoid'
|
7
|
+
require 'logger'
|
8
|
+
|
9
|
+
module Daengine
|
10
|
+
@logger = "/logs/daengine.log"
|
11
|
+
|
12
|
+
@config = {
|
13
|
+
:assets_path => '/digital-assets'
|
14
|
+
}
|
15
|
+
|
16
|
+
@mongoid_config = {
|
17
|
+
'database' => 'ssc_assets', # mongoid database name
|
18
|
+
'host' => nil, # mongoid server
|
19
|
+
'port' => nil, # mongodb server port
|
20
|
+
'hosts' => nil
|
21
|
+
}
|
22
|
+
|
23
|
+
@valid_mongoid_keys = @mongoid_config.keys
|
24
|
+
|
25
|
+
def self.log(message, level)
|
26
|
+
message = "[#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}] #{message}"
|
27
|
+
|
28
|
+
puts "#{message}"
|
29
|
+
case level
|
30
|
+
when "warn"
|
31
|
+
@logger.warn "#{message}"
|
32
|
+
when "error"
|
33
|
+
@logger.error "#{message}"
|
34
|
+
else
|
35
|
+
@logger.info "#{message}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# yaml file config
|
40
|
+
def self.configure(config_options)
|
41
|
+
config_options.each {|k,v| @config[k.to_sym] = v}
|
42
|
+
config_options.each {|k,v|
|
43
|
+
@mongoid_config[k] = v if @valid_mongoid_keys.include? k
|
44
|
+
}
|
45
|
+
@mongoid_config.delete_if { |k,v| ! v }
|
46
|
+
Mongoid.configure do |config|
|
47
|
+
config.from_hash(@mongoid_config)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.config
|
52
|
+
@config
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.execute(config_options)
|
56
|
+
self.configure(config_options)
|
57
|
+
self.set_logger()
|
58
|
+
self.log("Daengine: ### Loading application config ###", "info")
|
59
|
+
config_options.each { |key, value| self.log("CONFIG #{key}\t#{value}", "info")}
|
60
|
+
return DigitalAssetProcessor.process_tuple_directory # start the thread daemon
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.set_logger
|
64
|
+
logfile = self.config[:logfile_location]
|
65
|
+
@logger = Logger.new(logfile, 'daily')
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.logger
|
69
|
+
@logger
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -1,70 +1,103 @@
|
|
1
1
|
module Daengine
|
2
|
-
class DigitalAssetProcessor
|
3
|
-
|
4
|
-
@@last_read_time = 2.days.ago
|
2
|
+
class DigitalAssetProcessor
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
@@last_read_time = 2.days.ago
|
5
|
+
|
6
|
+
def self.trap_signals
|
7
|
+
sigtrap = proc {
|
8
|
+
puts "DigitalAssetProcessor: caught trapped signal, shutting down"
|
9
|
+
@@run = false
|
10
|
+
}
|
11
|
+
signals = ["SIGTERM", "SIGINT"]
|
12
|
+
signals.push("SIGHUP") unless is_windows?
|
13
|
+
signals.each do |signal|
|
14
|
+
trap signal, sigtrap
|
15
|
+
end
|
15
16
|
end
|
16
|
-
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
def self.is_windows?
|
19
|
+
processor, platform, *rest = RUBY_PLATFORM.split("-")
|
20
|
+
platform =~ /mswin/ || platform =~ /mingw/
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
23
|
+
def self.execute
|
24
|
+
@@run = true
|
25
|
+
trap_signals
|
26
|
+
@@wthread = Thread.new { worker() }
|
27
|
+
return @@wthread
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.worker
|
31
|
+
puts "DigitalAssetProcessor: start processing digital assets!"
|
32
|
+
while @@run
|
33
|
+
begin
|
34
|
+
self.process_tuple_directory
|
35
|
+
process_tuple_directory
|
36
|
+
rescue => e
|
37
|
+
puts e.message
|
38
|
+
puts e.backtrace
|
39
|
+
end
|
40
|
+
sleep(5)
|
39
41
|
end
|
40
|
-
|
42
|
+
@@wthread.exit
|
41
43
|
end
|
42
|
-
@@wthread.exit
|
43
|
-
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
def self.process_tuple_directory
|
46
|
+
path = Daengine.config[:assets_path]
|
47
|
+
raise "ERROR: DigitalAssetProcessor: Invalid assets_path provided. Unable to read from #{path}" unless File::directory?(path)
|
48
|
+
# read the given directory, process each file in date order starting 2 days ago if last_read_time is nil
|
49
|
+
time = self.read_last_process_time
|
50
|
+
if not time.blank?
|
51
|
+
@@last_read_time = time
|
52
|
+
end
|
53
|
+
Daengine.log("DigitalAssetProcessor: Last process time was #{@@last_read_time}", "info")
|
54
|
+
deploy_files= []
|
55
|
+
|
56
|
+
deploy_files = Dir.entries(path).select {
|
57
|
+
|f| File.file?("#{path}/#{f}") and File.mtime("#{path}/#{f}") > @@last_read_time
|
58
|
+
}.sort_by { |f| File.mtime("#{path}/#{f}") }
|
59
|
+
|
60
|
+
if deploy_files.empty?
|
61
|
+
Daengine.log("DigitalAssetProcessor: No digital asset deployment files found to process under #{path}", "warn")
|
62
|
+
else
|
63
|
+
Daengine.log("DigitalAssetProcessor: Reading digital asset deployment files from #{path}", "info")
|
64
|
+
deploy_files.each do |filename|
|
65
|
+
#parse the file and add metadata content to database.
|
66
|
+
file = File.expand_path(filename, path)
|
67
|
+
Daengine.log("DigitalAssetProcessor: Processing file #{filename} --- #{File.mtime(file)}", "info")
|
68
|
+
open_file = File.open(file, 'rb')
|
69
|
+
Daengine::TeamsiteMetadataParser.parse_tuple_file(open_file)
|
70
|
+
Daengine.log("DigitalAssetProcessor: Finished processing #{filename}", "info")
|
71
|
+
@@last_read_time = File.mtime(file)
|
72
|
+
self.save_last_read_time
|
73
|
+
Daengine.log("DigitalAssetProcessor: Last process time set to #{@@last_read_time}", "info")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
50
77
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
78
|
+
def self.save_last_read_time
|
79
|
+
begin
|
80
|
+
target = Daengine.config[:daengine_yml_file]
|
81
|
+
content = "last_read_time: #{@@last_read_time}"
|
82
|
+
File.open(target, "w+") do |f|
|
83
|
+
f.write(content)
|
84
|
+
end
|
85
|
+
rescue Exception => e
|
86
|
+
Daengine.log("DigitalAssetProcessor: Failed to write to #{target}.", "warn")
|
87
|
+
end
|
88
|
+
end
|
55
89
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
90
|
+
def self.read_last_process_time
|
91
|
+
time = ""
|
92
|
+
begin
|
93
|
+
target = Daengine.config[:daengine_yml_file]
|
94
|
+
property = YAML.load_file(target)
|
95
|
+
time = property['last_read_time']
|
96
|
+
rescue Exception => e
|
97
|
+
Daengine.log("DigitalAssetProcessor: Failed to read from #{target}", "warn")
|
98
|
+
end
|
99
|
+
time
|
65
100
|
end
|
66
101
|
|
67
102
|
end
|
68
|
-
|
69
|
-
end
|
70
103
|
end
|
data/lib/daengine/engine.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'rails'
|
2
|
-
|
3
|
-
module Daengine
|
4
|
-
class Engine < ::Rails::Engine
|
5
|
-
end
|
6
|
-
end
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
module Daengine
|
4
|
+
class Engine < ::Rails::Engine
|
5
|
+
end
|
6
|
+
end
|
@@ -40,6 +40,8 @@ module Daengine::TeamsiteMetadataParser
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.parse_tuple_file(file)
|
43
|
+
error_files = []
|
44
|
+
file_count = 0
|
43
45
|
time do
|
44
46
|
asset = nil
|
45
47
|
assets = {}
|
@@ -83,12 +85,19 @@ module Daengine::TeamsiteMetadataParser
|
|
83
85
|
da = DigitalAsset.find_or_initialize_by(guid: key)
|
84
86
|
da.documents = []
|
85
87
|
da.update_attributes!(assets[key])
|
88
|
+
file_count = file_count + 1
|
86
89
|
end
|
87
90
|
rescue Exception => e
|
88
|
-
|
91
|
+
error_files << "#{da.try(:guid)}, #{da.try(:errors).try(:full_messages)}"
|
89
92
|
end
|
90
93
|
end
|
94
|
+
log_txt = "TeamsiteMetadataParser: Failed to save/update following DigitalAssets in database:\n"
|
95
|
+
error_files.each do |asset_file|
|
96
|
+
log_txt = log_txt + "> #{asset_file}\n"
|
97
|
+
end
|
98
|
+
Daengine.log(log_txt, "warn")
|
91
99
|
DigitalAsset.purge! # if the purge criteria is met, purge anything not updated
|
100
|
+
Daengine.log("TeamsiteMetadataParser: #{file_count} records successfully added/updated", "info")
|
92
101
|
end
|
93
102
|
end
|
94
103
|
|