daengine 0.1.2 → 0.1.3

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