ryespy 0.7.0 → 1.0.0

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.
@@ -0,0 +1,44 @@
1
+ require_relative '../../helper'
2
+
3
+ require_relative '../../../lib/ryespy/notifier/sidekiq'
4
+
5
+
6
+ describe Ryespy::Notifier::Sidekiq do
7
+
8
+ describe "#notify" do
9
+ before do
10
+ @sidekiq = Ryespy::Notifier::Sidekiq.new(
11
+ :namespace => Ryespy::Test::Redis::namespace
12
+ )
13
+
14
+ @redis = @sidekiq.instance_variable_get(:@redis)
15
+ end
16
+
17
+ after do
18
+ @sidekiq.close
19
+
20
+ Ryespy::Test::Redis::flush_namespace(@redis)
21
+ end
22
+
23
+ it "writes to queues set" do
24
+ @sidekiq.notify(nil, nil)
25
+
26
+ @redis.smembers('queues').must_equal ['ryespy']
27
+ end
28
+
29
+ it "writes to queue list" do
30
+ SecureRandom.stubs(:hex).returns('9c964160d25fdf24c6549e6d')
31
+
32
+ @sidekiq.notify('PlanetClass', { :brain => 'marvin' })
33
+
34
+ @redis.lrange('queue:ryespy', 0, -1).must_equal([{
35
+ 'class' => 'PlanetClass',
36
+ 'args' => { 'brain' => 'marvin' },
37
+ 'queue' => 'ryespy',
38
+ 'retry' => true,
39
+ 'jid' => '9c964160d25fdf24c6549e6d',
40
+ }.to_json])
41
+ end
42
+ end
43
+
44
+ end
@@ -1,4 +1,4 @@
1
- require 'minitest/autorun'
1
+ require_relative '../helper'
2
2
 
3
3
  require_relative '../../lib/ryespy/version'
4
4
 
metadata CHANGED
@@ -1,62 +1,121 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryespy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tiredpixel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-29 00:00:00.000000000 Z
11
+ date: 2014-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.4
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.4
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: redis-namespace
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ~>
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
47
  version: '1.3'
48
+ - - "!="
49
+ - !ruby/object:Gem::Version
50
+ version: 1.5.0
34
51
  type: :development
35
52
  prerelease: false
36
53
  version_requirements: !ruby/object:Gem::Requirement
37
54
  requirements:
38
- - - ~>
55
+ - - "~>"
39
56
  - !ruby/object:Gem::Version
40
57
  version: '1.3'
58
+ - - "!="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.5.0
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: rake
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
- - - '>='
65
+ - - ">="
46
66
  - !ruby/object:Gem::Version
47
67
  version: '0'
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
- - - '>='
72
+ - - ">="
53
73
  - !ruby/object:Gem::Version
54
74
  version: '0'
55
- description: |-
56
- Ryespy provides a simple executable for listening to
57
- IMAP mailboxes or FTP folders, keeps track of what it's seen using Redis,
58
- and notifies Redis in a way in which Resque and Sidekiq can process using
59
- workers.
75
+ - !ruby/object:Gem::Dependency
76
+ name: fog
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.19'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.19'
89
+ - !ruby/object:Gem::Dependency
90
+ name: mocha
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.14'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.14'
103
+ - !ruby/object:Gem::Dependency
104
+ name: sidekiq-spy
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.3'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.3'
117
+ description: Redis Sidekiq/Resque IMAP, FTP, Amazon S3, Google Cloud Storage, Rackspace
118
+ Cloud Files listener.
60
119
  email:
61
120
  - tp@tiredpixel.com
62
121
  executables:
@@ -64,26 +123,37 @@ executables:
64
123
  extensions: []
65
124
  extra_rdoc_files: []
66
125
  files:
67
- - .gitignore
68
- - .ruby-gemset
69
- - .ruby-version
70
- - .travis.yml
126
+ - ".gitignore"
127
+ - ".ruby-gemset"
128
+ - ".ruby-version"
129
+ - ".travis.yml"
130
+ - CHANGELOG.md
71
131
  - Gemfile
72
132
  - LICENSE.txt
73
133
  - README.md
74
134
  - Rakefile
75
135
  - bin/ryespy
76
136
  - lib/ryespy.rb
77
- - lib/ryespy/config.rb
78
- - lib/ryespy/listeners/ftp.rb
79
- - lib/ryespy/listeners/imap.rb
80
- - lib/ryespy/notifiers/sidekiq.rb
81
- - lib/ryespy/redis_conn.rb
137
+ - lib/ryespy/app.rb
138
+ - lib/ryespy/listener/amzn_s3.rb
139
+ - lib/ryespy/listener/base.rb
140
+ - lib/ryespy/listener/fogable.rb
141
+ - lib/ryespy/listener/ftp.rb
142
+ - lib/ryespy/listener/goog_cs.rb
143
+ - lib/ryespy/listener/imap.rb
144
+ - lib/ryespy/listener/rax_cf.rb
145
+ - lib/ryespy/notifier/sidekiq.rb
82
146
  - lib/ryespy/version.rb
83
147
  - ryespy.gemspec
84
- - test/ryespy/config_test.rb
148
+ - test/helper.rb
149
+ - test/ryespy/app_test.rb
150
+ - test/ryespy/listener/amzn_s3_test.rb
151
+ - test/ryespy/listener/ftp_test.rb
152
+ - test/ryespy/listener/goog_cs_test.rb
153
+ - test/ryespy/listener/imap_test.rb
154
+ - test/ryespy/listener/rax_cf_test.rb
155
+ - test/ryespy/notifier/sidekiq_test.rb
85
156
  - test/ryespy/version_test.rb
86
- - test/ryespy_test.rb
87
157
  homepage: https://github.com/tiredpixel/ryespy
88
158
  licenses:
89
159
  - MIT
@@ -94,21 +164,28 @@ require_paths:
94
164
  - lib
95
165
  required_ruby_version: !ruby/object:Gem::Requirement
96
166
  requirements:
97
- - - '>='
167
+ - - ">="
98
168
  - !ruby/object:Gem::Version
99
169
  version: '0'
100
170
  required_rubygems_version: !ruby/object:Gem::Requirement
101
171
  requirements:
102
- - - '>='
172
+ - - ">="
103
173
  - !ruby/object:Gem::Version
104
174
  version: '0'
105
175
  requirements: []
106
176
  rubyforge_project:
107
- rubygems_version: 2.0.3
177
+ rubygems_version: 2.2.1
108
178
  signing_key:
109
179
  specification_version: 4
110
- summary: Ryespy listens to IMAP and FTP and queues in Redis (Sidekiq/Resque).
180
+ summary: Redis Sidekiq/Resque IMAP, FTP, Amazon S3, Google Cloud Storage, Rackspace
181
+ Cloud Files listener.
111
182
  test_files:
112
- - test/ryespy/config_test.rb
183
+ - test/helper.rb
184
+ - test/ryespy/app_test.rb
185
+ - test/ryespy/listener/amzn_s3_test.rb
186
+ - test/ryespy/listener/ftp_test.rb
187
+ - test/ryespy/listener/goog_cs_test.rb
188
+ - test/ryespy/listener/imap_test.rb
189
+ - test/ryespy/listener/rax_cf_test.rb
190
+ - test/ryespy/notifier/sidekiq_test.rb
113
191
  - test/ryespy/version_test.rb
114
- - test/ryespy_test.rb
@@ -1,83 +0,0 @@
1
- module Ryespy
2
- class Config
3
-
4
- attr_accessor :log_level
5
- attr_accessor :listener
6
- attr_accessor :polling_interval
7
- attr_accessor :redis_url
8
- attr_accessor :redis_ns_ryespy
9
- attr_accessor :redis_ns_notifiers
10
- attr_accessor :notifiers
11
-
12
- attr_accessor :imap_host
13
- attr_accessor :imap_port
14
- attr_accessor :imap_ssl
15
- attr_accessor :imap_username
16
- attr_accessor :imap_password
17
- attr_accessor :imap_mailboxes
18
-
19
- attr_accessor :ftp_host
20
- attr_accessor :ftp_passive
21
- attr_accessor :ftp_username
22
- attr_accessor :ftp_password
23
- attr_accessor :ftp_dirs
24
-
25
- def initialize
26
- @log_level = 'INFO'
27
- @polling_interval = 60
28
- @redis_ns_ryespy = 'ryespy:'
29
- @redis_ns_notifiers = 'resque:'
30
- @notifiers = {
31
- :sidekiq => [],
32
- }
33
-
34
- @imap_port = 993
35
- @imap_ssl = true
36
- @imap_mailboxes = ['INBOX']
37
-
38
- @ftp_passive = false
39
- @ftp_dirs = ['/']
40
- end
41
-
42
- def to_s
43
- params = [
44
- :log_level,
45
- :listener,
46
- :polling_interval,
47
- :redis_url,
48
- :redis_ns_ryespy,
49
- :redis_ns_notifiers,
50
- :notifiers,
51
- ]
52
-
53
- params.concat case @listener.to_s
54
- when 'imap'
55
- [
56
- :imap_host,
57
- :imap_port,
58
- :imap_ssl,
59
- :imap_username,
60
- :imap_password,
61
- ]
62
- when 'ftp'
63
- [
64
- :ftp_host,
65
- :ftp_passive,
66
- :ftp_username,
67
- :ftp_dirs,
68
- ]
69
- else
70
- []
71
- end
72
-
73
- params.collect! { |s| [s, instance_variable_get("@#{s}")] }
74
-
75
- Hash[params].to_s
76
- end
77
-
78
- def redis_prefix_ryespy
79
- "#{Ryespy.config.redis_ns_ryespy}#{Ryespy.config.listener}:"
80
- end
81
-
82
- end
83
- end
@@ -1,86 +0,0 @@
1
- require 'net/ftp'
2
-
3
-
4
- module Ryespy
5
- module Listener
6
- class FTP
7
-
8
- def initialize
9
- begin
10
- @ftp = Net::FTP.new(Ryespy.config.ftp_host)
11
-
12
- @ftp.passive = Ryespy.config.ftp_passive
13
-
14
- @ftp.login(Ryespy.config.ftp_username, Ryespy.config.ftp_password)
15
- rescue Errno::ECONNREFUSED, Net::FTPError => e
16
- Ryespy.logger.error { e.to_s }
17
-
18
- return
19
- end
20
-
21
- if block_given?
22
- yield self
23
-
24
- close
25
- end
26
- end
27
-
28
- def close
29
- @ftp.close
30
- end
31
-
32
- def check(params)
33
- begin
34
- @ftp.chdir(params[:dir])
35
-
36
- objects = {}
37
-
38
- @ftp.nlst.each do |fd|
39
- mtime = @ftp.mtime(fd).to_i
40
- size = @ftp.size(fd) rescue nil # ignore non-file error
41
-
42
- if size # exclude directories
43
- checksum = "#{mtime},#{size}"
44
-
45
- if params[:seen_files][fd] != checksum
46
- objects[fd] = checksum
47
- end
48
- end
49
- end
50
-
51
- objects
52
- rescue Net::FTPError => e
53
- Ryespy.logger.error { e.to_s }
54
-
55
- return
56
- end
57
- end
58
-
59
- def check_all
60
- Ryespy.config.ftp_dirs.each do |dir|
61
- Ryespy.logger.debug { "dir:#{dir}" }
62
-
63
- redis_key = "#{Ryespy.config.redis_prefix_ryespy}#{Ryespy.config.ftp_host}:#{Ryespy.config.ftp_username}:#{dir}"
64
-
65
- Ryespy.logger.debug { "redis_key:#{redis_key}" }
66
-
67
- new_items = check({
68
- :dir => dir,
69
- :seen_files => Ryespy.redis.hgetall(redis_key),
70
- })
71
-
72
- Ryespy.logger.debug { "new_items:#{new_items}" }
73
-
74
- new_items.each do |filename, checksum|
75
- Ryespy.redis.hset(redis_key, filename, checksum)
76
-
77
- Ryespy.notifiers.each { |n| n.notify('RyespyFTPJob', [dir, filename]) }
78
- end
79
-
80
- Ryespy.logger.info { "#{dir} has #{new_items.count} new files" }
81
- end
82
- end
83
-
84
- end
85
- end
86
- end
@@ -1,74 +0,0 @@
1
- require 'net/imap'
2
-
3
-
4
- module Ryespy
5
- module Listener
6
- class IMAP
7
-
8
- def initialize
9
- begin
10
- @imap = Net::IMAP.new(Ryespy.config.imap_host, {
11
- :port => Ryespy.config.imap_port,
12
- :ssl => Ryespy.config.imap_ssl,
13
- })
14
-
15
- @imap.login(Ryespy.config.imap_username, Ryespy.config.imap_password)
16
- rescue Errno::ECONNREFUSED, Net::IMAP::Error => e
17
- Ryespy.logger.error { e.to_s }
18
-
19
- return
20
- end
21
-
22
- if block_given?
23
- yield self
24
-
25
- close
26
- end
27
- end
28
-
29
- def close
30
- @imap.disconnect
31
- end
32
-
33
- def check(params)
34
- begin
35
- @imap.select(params[:mailbox])
36
-
37
- uids = @imap.uid_search("#{params[:last_seen_uid] + 1}:*")
38
-
39
- uids.find_all { |uid| uid > params[:last_seen_uid] } # IMAP search gets fun with edge cases
40
- rescue Net::IMAP::Error => e
41
- Ryespy.logger.error { e.to_s }
42
-
43
- return
44
- end
45
- end
46
-
47
- def check_all
48
- Ryespy.config.imap_mailboxes.each do |mailbox|
49
- Ryespy.logger.debug { "mailbox:#{mailbox}" }
50
-
51
- redis_key = "#{Ryespy.config.redis_prefix_ryespy}#{Ryespy.config.imap_host},#{Ryespy.config.imap_port}:#{Ryespy.config.imap_username}:#{mailbox}"
52
-
53
- Ryespy.logger.debug { "redis_key:#{redis_key}" }
54
-
55
- new_items = check({
56
- :mailbox => mailbox,
57
- :last_seen_uid => Ryespy.redis.get(redis_key).to_i,
58
- })
59
-
60
- Ryespy.logger.debug { "new_items:#{new_items}" }
61
-
62
- new_items.each do |uid|
63
- Ryespy.redis.set(redis_key, uid)
64
-
65
- Ryespy.notifiers.each { |n| n.notify('RyespyIMAPJob', [mailbox, uid]) }
66
- end
67
-
68
- Ryespy.logger.info { "#{mailbox} has #{new_items.count} new emails" }
69
- end
70
- end
71
-
72
- end
73
- end
74
- end