flickrup 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ require 'atomic'
2
3
  require 'rufus/scheduler'
3
4
  require "flickrup/logging"
4
5
 
@@ -17,12 +18,17 @@ require "flickrup/logging"
17
18
  class SlowListener
18
19
  include Logging
19
20
 
20
- WAIT = 5#*60 #5 min
21
+ IDLE = -1
22
+ PROCESSING = 0
23
+ CHANGES_QUEUED = 1
21
24
 
22
25
  def initialize(config)
26
+ @wait = config[:timeout]
27
+ logger.debug("Timeout set to #@wait secs")
23
28
  @config = config
24
29
  @scheduler = Rufus::Scheduler.start_new
25
30
  @processor = Processor.new(config)
31
+ @processing = Atomic.new IDLE
26
32
  end
27
33
 
28
34
  def run
@@ -38,15 +44,28 @@ class SlowListener
38
44
  logger.debug("Checking files for upload")
39
45
  files = Dir["#{@config['watch_dir']}/*.{jpg,JPG,jpeg,JPEG}"]
40
46
 
41
- old, new = files.partition { |x| Time.now > File.mtime(x) + WAIT }
47
+ old, new = files.partition { |x| Time.now > File.mtime(x) + @wait }
48
+
49
+ reschedule = false
42
50
 
43
51
  unless old.empty?
44
52
  logger.debug("Found #{old.length} stable files")
53
+ @processing.set PROCESSING
45
54
  @processor.run(old)
55
+ changes = @processing.swap IDLE
56
+ if changes > 0
57
+ logger.debug("Changes occurred while processing")
58
+ reschedule = true
59
+ end
46
60
  end
47
61
 
48
62
  unless new.empty?
49
63
  logger.debug("Found #{new.length} new files")
64
+ reschedule = true
65
+ end
66
+
67
+ if reschedule
68
+ logger.debug("Rescheduling...")
50
69
  #todo: schedule for latest
51
70
  schedule
52
71
  end
@@ -54,15 +73,41 @@ class SlowListener
54
73
 
55
74
  def on_change
56
75
  logger.debug("Change detected")
57
- schedule
76
+
77
+ current_state = @processing.get
78
+ was_processing = @processing.compare_and_swap(PROCESSING, CHANGES_QUEUED)
79
+
80
+ if was_processing
81
+ case current_state
82
+ when IDLE
83
+ on_change #retry
84
+ when CHANGES_QUEUED
85
+ on_change #retry
86
+ when PROCESSING
87
+ logger.debug("Scheduling queued") # already queued changes
88
+ end
89
+ else #wasn't processing
90
+ case current_state
91
+ when IDLE
92
+ schedule
93
+ when CHANGES_QUEUED
94
+ logger.debug("Scheduling already queued") # already queued changes
95
+ when PROCESSING
96
+ on_change #retry
97
+ end
98
+ end
58
99
  end
59
100
 
60
101
  def schedule
61
102
  if @scheduler.jobs.empty?
62
- logger.debug("Scheduling processing for #{WAIT} sec")
63
- @scheduler.in WAIT do
64
- do_upload
103
+ logger.debug("Scheduling processing for #@wait sec")
104
+ @scheduler.in @wait do
105
+ if @processing.get == IDLE
106
+ do_upload
107
+ end
65
108
  end
109
+ else
110
+ logger.debug("Already scheduled")
66
111
  end
67
112
  end
68
113
 
data/lib/flickrup.rb CHANGED
@@ -25,11 +25,12 @@ module Flickrup
25
25
  opt :nowait, "Upload immediately on change, no delay"
26
26
  opt :loglevel, "Logging level", :type => :string, :default => "INFO"
27
27
  opt :config, "Configuration file", :type => :string, :default => './flickrup.yml'
28
+ opt :timeout, "Timeout/Wait for file modification", :default => 5*60
28
29
  end
29
30
 
30
31
  logger.level = Logger::Severity.const_get(opts.loglevel)
31
32
 
32
- config = YAML::load(File.open(opts.config, "r"))
33
+ config = YAML::load(File.open(opts.config, "r")).merge opts
33
34
 
34
35
  if opts.once
35
36
  Processor.new(config).run
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flickrup
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jonathan Gilbert
@@ -98,9 +98,25 @@ dependencies:
98
98
  type: :runtime
99
99
  version_requirements: *id005
100
100
  - !ruby/object:Gem::Dependency
101
- name: trollop
101
+ name: json
102
102
  prerelease: false
103
103
  requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ hash: 11
109
+ segments:
110
+ - 1
111
+ - 7
112
+ - 0
113
+ version: 1.7.0
114
+ type: :runtime
115
+ version_requirements: *id006
116
+ - !ruby/object:Gem::Dependency
117
+ name: trollop
118
+ prerelease: false
119
+ requirement: &id007 !ruby/object:Gem::Requirement
104
120
  none: false
105
121
  requirements:
106
122
  - - ">="
@@ -112,7 +128,7 @@ dependencies:
112
128
  - 0
113
129
  version: 2.0.0
114
130
  type: :runtime
115
- version_requirements: *id006
131
+ version_requirements: *id007
116
132
  description: Flickr auto uploading script
117
133
  email: bb..jgilbert@xoxy.net
118
134
  executables: