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.
Files changed (53) hide show
  1. data/Gemfile +17 -17
  2. data/MIT-LICENSE +20 -20
  3. data/Rakefile +29 -29
  4. data/app/assets/javascripts/digital_assets.js +2 -2
  5. data/app/assets/stylesheets/digital_assets.css +4 -4
  6. data/app/controllers/digital_assets_controller.rb +76 -76
  7. data/app/helpers/digital_assets_helper.rb +2 -2
  8. data/app/views/digital_assets/_form.html.erb +17 -17
  9. data/app/views/digital_assets/edit.html.erb +6 -6
  10. data/app/views/digital_assets/index.html.erb +34 -34
  11. data/app/views/digital_assets/new.html.erb +5 -5
  12. data/app/views/digital_assets/search.html.erb +46 -46
  13. data/app/views/digital_assets/show.html.erb +58 -58
  14. data/config/routes.rb +8 -8
  15. data/lib/daengine.rb +72 -44
  16. data/lib/daengine/digital_asset_processor.rb +89 -56
  17. data/lib/daengine/engine.rb +6 -6
  18. data/lib/daengine/teamsite_metadata_parser.rb +10 -1
  19. data/lib/daengine/version.rb +3 -3
  20. data/lib/tasks/daengine_tasks.rake +4 -4
  21. data/spec/controllers/digital_assets_controller_spec.rb +202 -202
  22. data/spec/dummy/README.rdoc +261 -261
  23. data/spec/dummy/Rakefile +7 -7
  24. data/spec/dummy/app/assets/javascripts/application.js +15 -15
  25. data/spec/dummy/app/assets/stylesheets/application.css +13 -13
  26. data/spec/dummy/app/controllers/application_controller.rb +3 -3
  27. data/spec/dummy/app/helpers/application_helper.rb +2 -2
  28. data/spec/dummy/app/views/layouts/application.html.erb +14 -14
  29. data/spec/dummy/config.ru +4 -4
  30. data/spec/dummy/config/application.rb +70 -70
  31. data/spec/dummy/config/boot.rb +9 -9
  32. data/spec/dummy/config/environment.rb +5 -5
  33. data/spec/dummy/config/environments/development.rb +37 -37
  34. data/spec/dummy/config/environments/production.rb +67 -67
  35. data/spec/dummy/config/environments/test.rb +37 -37
  36. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -7
  37. data/spec/dummy/config/initializers/inflections.rb +15 -15
  38. data/spec/dummy/config/initializers/mime_types.rb +5 -5
  39. data/spec/dummy/config/initializers/secret_token.rb +7 -7
  40. data/spec/dummy/config/initializers/session_store.rb +8 -8
  41. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -14
  42. data/spec/dummy/config/locales/en.yml +5 -5
  43. data/spec/dummy/config/mongoid.yml +20 -20
  44. data/spec/dummy/config/routes.rb +58 -58
  45. data/spec/dummy/log/development.log +4 -0
  46. data/spec/dummy/log/test.log +435 -0
  47. data/spec/dummy/public/404.html +26 -26
  48. data/spec/dummy/public/422.html +26 -26
  49. data/spec/dummy/public/500.html +25 -25
  50. data/spec/dummy/script/rails +6 -6
  51. data/spec/lib/teamsite_metadata_parser_spec.rb +59 -59
  52. data/spec/spec_helper.rb +40 -40
  53. 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
+
@@ -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
@@ -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
- module Daengine
9
- @config = {
10
- :assets_path => '/digital-assets'
11
- }
12
-
13
- @mongoid_config = {
14
- 'database' => 'ssc_assets', # mongoid database name
15
- 'host' => nil, # mongoid server
16
- 'port' => nil, # mongodb server port
17
- 'hosts' => nil
18
- }
19
-
20
- @valid_mongoid_keys = @mongoid_config.keys
21
-
22
- # yaml file config
23
- def self.configure(config_options)
24
- config_options.each {|k,v| @config[k.to_sym] = v}
25
- config_options.each {|k,v|
26
- @mongoid_config[k] = v if @valid_mongoid_keys.include? k
27
- }
28
- @mongoid_config.delete_if { |k,v| ! v }
29
- Mongoid.configure do |config|
30
- config.from_hash(@mongoid_config)
31
- end
32
- p "configured with keys #{@config.keys}"
33
- end
34
-
35
- def self.config
36
- @config
37
- end
38
-
39
- def self.execute(config_options)
40
- self.configure(config_options)
41
- return DigitalAssetProcessor.process_tuple_directory # start the thread daemon
42
- end
43
-
44
- end
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
- 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
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
- def self.is_windows?
19
- processor, platform, *rest = RUBY_PLATFORM.split("-")
20
- platform =~ /mswin/ || platform =~ /mingw/
21
- end
18
+ def self.is_windows?
19
+ processor, platform, *rest = RUBY_PLATFORM.split("-")
20
+ platform =~ /mswin/ || platform =~ /mingw/
21
+ end
22
22
 
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
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
- sleep(5)
42
+ @@wthread.exit
41
43
  end
42
- @@wthread.exit
43
- end
44
44
 
45
- def self.process_tuple_directory
46
- path = Daengine.config[:assets_path]
47
- raise "DigitalAssetProcessor: unable to read from asset path #{path}" unless File::directory?(path)
48
- # read the given directory, process each file in date order starting 2 days ago
49
- deploy_files= []
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
- puts "DigitalAssetProcessor: reading digital asset deployment files from #{path}"
52
- deploy_files = Dir.entries(path).select {
53
- |f| File.file?("#{path}/#{f}") and File.mtime("#{path}/#{f}") > @@last_read_time
54
- }.sort_by{ |f| File.mtime("#{path}/#{f}") }
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
- deploy_files.each do |filename|
57
- #parse the file and add content to database.
58
- file = File.expand_path(filename, path)
59
- p "DigitalAssetProcessor: processing file #{file}"
60
- open_file = File.open(file, 'rb')
61
- Daengine::TeamsiteMetadataParser.parse_tuple_file(open_file)
62
- p "DigitalAssetProcessor: finished parsing #{filename}."
63
- @@last_read_time = File.mtime(file)
64
- p "DigitalAssetProcessor: set last read time to #{@@last_read_time}."
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
@@ -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
- p "Unable to save/update DigitalAsset guid=#{da.try(:guid)}, #{da.try(:errors).try(:full_messages)}"
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