flickrup 0.0.2 → 0.0.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.
@@ -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: