daengine 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|