all_seeing_pi 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/all_seeing_pi.gemspec +3 -3
- data/capture.sh +1 -1
- data/lib/all_seeing_pi.rb +6 -2
- data/lib/all_seeing_pi/camera.rb +8 -1
- data/lib/all_seeing_pi/configuration.rb +1 -1
- data/lib/all_seeing_pi/gollum.rb +52 -0
- data/lib/all_seeing_pi/uploader.rb +19 -15
- data/lib/all_seeing_pi/version.rb +1 -1
- data/test/test_gollum.rb +81 -0
- data/test/test_helper.rb +0 -12
- data/test/test_uploader.rb +14 -10
- metadata +10 -10
- data/lib/all_seeing_pi/golem.rb +0 -31
- data/test/test_palantir.rb +0 -32
data/all_seeing_pi.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "mocha"
|
24
24
|
spec.add_development_dependency "pry"
|
25
|
-
spec.
|
26
|
-
spec.
|
27
|
-
spec.add_runtime_dependency "
|
25
|
+
spec.add_runtime_dependency "fog"
|
26
|
+
spec.add_runtime_dependency "phashion"
|
27
|
+
spec.add_runtime_dependency "httparty"
|
28
28
|
end
|
data/capture.sh
CHANGED
data/lib/all_seeing_pi.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "all_seeing_pi/version"
|
2
|
-
require "all_seeing_pi/
|
2
|
+
require "all_seeing_pi/gollum"
|
3
3
|
require "all_seeing_pi/camera"
|
4
4
|
require "all_seeing_pi/uploader"
|
5
5
|
require "all_seeing_pi/configuration"
|
@@ -19,10 +19,14 @@ module AllSeeingPi
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.watch
|
22
|
-
golem = AllSeeingPi::
|
22
|
+
golem = AllSeeingPi::Gollum.new
|
23
23
|
|
24
24
|
loop do
|
25
25
|
golem.spy
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
def self.report(msg)
|
30
|
+
puts msg unless ENV['ALL_SEEING_PI_ENV'] == 'test'
|
31
|
+
end
|
28
32
|
end
|
data/lib/all_seeing_pi/camera.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
module AllSeeingPi
|
2
2
|
class Camera
|
3
|
+
attr_reader :script
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
path = '../../../capture.sh'
|
7
|
+
@script = AllSeeingPi.config[:capture_script] || File.expand_path(path, __FILE__)
|
8
|
+
end
|
9
|
+
|
3
10
|
def capture
|
4
|
-
|
11
|
+
`#{script}`.strip
|
5
12
|
end
|
6
13
|
end
|
7
14
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'all_seeing_pi/camera'
|
2
|
+
require 'all_seeing_pi/uploader'
|
3
|
+
require 'phashion'
|
4
|
+
require 'httparty'
|
5
|
+
|
6
|
+
module AllSeeingPi
|
7
|
+
class Gollum
|
8
|
+
attr_reader :camera, :uploader
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@camera = AllSeeingPi::Camera.new
|
12
|
+
@uploader = AllSeeingPi::Uploader.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def spy
|
16
|
+
image_path = @camera.capture
|
17
|
+
return unless File.exists?(image_path)
|
18
|
+
|
19
|
+
AllSeeingPi.report "Captured #{image_path}"
|
20
|
+
|
21
|
+
url = store_image(image_path)
|
22
|
+
phash = get_phash(image_path)
|
23
|
+
send_to_palantir(image_path, phash, url)
|
24
|
+
|
25
|
+
FileUtils.rm(image_path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_phash(image_path)
|
29
|
+
Phashion::Image.new(image_path).fingerprint
|
30
|
+
end
|
31
|
+
|
32
|
+
def store_image(image_path)
|
33
|
+
@uploader.upload(image_path)
|
34
|
+
end
|
35
|
+
|
36
|
+
def send_to_palantir(image_path, phash, url)
|
37
|
+
data = {
|
38
|
+
:name => File.basename(image_path),
|
39
|
+
:phash => phash,
|
40
|
+
:url => url,
|
41
|
+
:directory_name => AllSeeingPi.config[:directory_name]
|
42
|
+
}
|
43
|
+
|
44
|
+
HTTParty.post(
|
45
|
+
"#{AllSeeingPi.config[:palantir_url]}/api/images",
|
46
|
+
:query => { :image => data, :access_token => AllSeeingPi.config[:palantir_access_token]}
|
47
|
+
)
|
48
|
+
|
49
|
+
AllSeeingPi.report "Sent to Palantir - name: #{data[:name]}, phash: #{data[:phash]}, directory: #{data[:directory_name]}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -1,36 +1,40 @@
|
|
1
|
-
require '
|
1
|
+
require 'fog'
|
2
2
|
|
3
3
|
module AllSeeingPi
|
4
4
|
class Uploader
|
5
|
-
|
5
|
+
DIRECTORY_PREFIX = 'all-seeing-pi'
|
6
6
|
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :client
|
8
8
|
|
9
9
|
def initialize
|
10
|
-
@
|
11
|
-
|
10
|
+
@client = Fog::Storage.new(
|
11
|
+
provider: 'AWS',
|
12
|
+
aws_access_key_id: AllSeeingPi.config[:aws_key],
|
13
|
+
aws_secret_access_key: AllSeeingPi.config[:aws_secret]
|
14
|
+
)
|
12
15
|
end
|
13
16
|
|
14
17
|
def upload(image_path)
|
15
|
-
|
18
|
+
directories = client.directories
|
16
19
|
|
17
|
-
|
18
|
-
|
20
|
+
directory_name = fetch_or_create_directory_name(directories)
|
21
|
+
directory = directories.get(directory_name) || directories.create(key: directory_name)
|
19
22
|
|
20
23
|
filename = File.basename(image_path)
|
21
|
-
|
24
|
+
image = directory.files.create(key: filename, body: File.open(image_path), public: true)
|
25
|
+
image.public_url
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
def fetch_or_create_directory_name(directories)
|
29
|
+
directory_name = directories.map do |directory|
|
30
|
+
key = directory.key
|
31
|
+
key if key.match /#{DIRECTORY_PREFIX}/
|
28
32
|
end.compact.first
|
29
33
|
|
30
|
-
|
34
|
+
AllSeeingPi.config[:directory_name] ||= "#{DIRECTORY_PREFIX}-#{directory_id}"
|
31
35
|
end
|
32
36
|
|
33
|
-
def
|
37
|
+
def directory_id
|
34
38
|
Time.now.to_f.to_s.split('.').join.to_i
|
35
39
|
end
|
36
40
|
end
|
data/test/test_gollum.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class GollumTest < MiniTest::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
Fog.mock!
|
7
|
+
AllSeeingPi.config.load_config_from_file('test/all_seeing_pi.yml')
|
8
|
+
|
9
|
+
@fixture = 'test/fixtures/eye_of_sauron.jpg'
|
10
|
+
@filename = File.basename(@fixture)
|
11
|
+
@golem = AllSeeingPi::Gollum.new
|
12
|
+
@phash = @golem.get_phash(@fixture)
|
13
|
+
@palantir_url = 'http://all-seeing-pi.com/api/images'
|
14
|
+
@public_url = 'http://public-url.com'
|
15
|
+
|
16
|
+
@image_data = {
|
17
|
+
:name => @filename,
|
18
|
+
:phash => @phash,
|
19
|
+
:url => @public_url,
|
20
|
+
:directory_name => AllSeeingPi.config[:directory_name]
|
21
|
+
}
|
22
|
+
@token = AllSeeingPi.config[:palantir_access_token]
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_spy_sends_capture_to_the_camera
|
26
|
+
@golem.stubs(:store_image)
|
27
|
+
FileUtils.stubs(:rm)
|
28
|
+
HTTParty.stubs(:post)
|
29
|
+
|
30
|
+
@golem.camera.expects(:capture).returns(@fixture)
|
31
|
+
@golem.spy
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_store_image
|
35
|
+
@golem.camera.stubs(:capture).returns(@fixture)
|
36
|
+
FileUtils.stubs(:rm)
|
37
|
+
HTTParty.stubs(:post)
|
38
|
+
|
39
|
+
@golem.uploader.expects(:upload).with(@fixture)
|
40
|
+
@golem.spy
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_spy_deletes_the_image
|
44
|
+
@golem.camera.stubs(:capture).returns(@fixture)
|
45
|
+
@golem.stubs(:store_image)
|
46
|
+
HTTParty.stubs(:post)
|
47
|
+
|
48
|
+
FileUtils.expects(:rm).with(@fixture)
|
49
|
+
@golem.spy
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_spy_calculates_the_phash
|
53
|
+
@golem.camera.stubs(:capture).returns(@fixture)
|
54
|
+
FileUtils.stubs(:rm)
|
55
|
+
HTTParty.stubs(:post)
|
56
|
+
|
57
|
+
image = mock(:fingerprint)
|
58
|
+
Phashion::Image.expects(:new).with(@fixture).returns(image)
|
59
|
+
@golem.spy
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_spy_sends_palantir_the_image_details
|
63
|
+
@golem.camera.stubs(:capture).returns(@fixture)
|
64
|
+
@golem.stubs(:store_image).returns(@public_url)
|
65
|
+
FileUtils.stubs(:rm)
|
66
|
+
HTTParty.stubs(:post)
|
67
|
+
|
68
|
+
@golem.expects(:send_to_palantir).with(@fixture, @phash, @public_url)
|
69
|
+
@golem.spy
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_send_to_palantir_uses_uri_from_config
|
73
|
+
HTTParty.expects(:post).with( @palantir_url, { :query => { :image => @image_data, :access_token => @token } } )
|
74
|
+
@golem.send_to_palantir(@fixture, @phash, @public_url)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_send_to_palantir_posts_the_image_data
|
78
|
+
HTTParty.expects(:post).with( @palantir_url, { :query => { :image => @image_data, :access_token => @token } } )
|
79
|
+
@golem.send_to_palantir(@fixture, @phash, @public_url)
|
80
|
+
end
|
81
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -2,18 +2,6 @@ require 'minitest/autorun'
|
|
2
2
|
|
3
3
|
Bundler.require
|
4
4
|
|
5
|
-
require 'vcr'
|
6
5
|
require 'mocha'
|
7
6
|
|
8
|
-
VCR.configure do |c|
|
9
|
-
c.cassette_library_dir = 'test/fixtures/vcr_cassettes'
|
10
|
-
c.hook_into :webmock
|
11
|
-
end
|
12
|
-
|
13
|
-
AllSeeingPi.config.load_config_from_file('test/all_seeing_pi.yml')
|
14
|
-
|
15
|
-
AWS.config(
|
16
|
-
access_key_id: AllSeeingPi.config[:aws_key],
|
17
|
-
secret_access_key: AllSeeingPi.config[:aws_secret]
|
18
|
-
)
|
19
7
|
ENV['ALL_SEEING_PI_ENV'] = 'test'
|
data/test/test_uploader.rb
CHANGED
@@ -2,24 +2,28 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class UploaderTest < MiniTest::Unit::TestCase
|
4
4
|
def setup
|
5
|
+
Fog.mock!
|
6
|
+
AllSeeingPi.config.load_config_from_file('test/all_seeing_pi.yml')
|
7
|
+
|
5
8
|
@fixture = 'test/fixtures/eye_of_sauron.jpg'
|
6
9
|
@filename = File.basename(@fixture)
|
7
10
|
@uploader = AllSeeingPi::Uploader.new
|
8
|
-
@bucket_name = AllSeeingPi::Uploader::BUCKET_PREFIX
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_upload
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
@uploader.upload(@fixture)
|
15
|
+
assert @uploader.client.directories.get(AllSeeingPi.config[:directory_name]).files.head(@filename)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_upload_returns_public_url
|
19
|
+
regex = /#{AllSeeingPi::Uploader::DIRECTORY_PREFIX}.*\/#{@filename}/
|
20
|
+
public_url = @uploader.upload(@fixture)
|
21
|
+
assert public_url.match(regex), "Expected #{regex.inspect} to match #{public_url}"
|
16
22
|
end
|
17
23
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
assert_match /#{@bucket_name}/, name
|
22
|
-
end
|
24
|
+
def test_fetch_or_create_directory_name
|
25
|
+
name = @uploader.fetch_or_create_directory_name(@uploader.client.directories)
|
26
|
+
assert_match /#{AllSeeingPi::Uploader::DIRECTORY_PREFIX}/, name
|
23
27
|
end
|
24
28
|
|
25
29
|
def test_uploader_uses_credentials_from_config
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: all_seeing_pi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -76,14 +76,14 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
79
|
+
name: fog
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
83
|
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: '0'
|
86
|
-
type: :
|
86
|
+
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
@@ -92,14 +92,14 @@ dependencies:
|
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
95
|
+
name: phashion
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
99
99
|
- - ! '>='
|
100
100
|
- !ruby/object:Gem::Version
|
101
101
|
version: '0'
|
102
|
-
type: :
|
102
|
+
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
@@ -108,7 +108,7 @@ dependencies:
|
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
111
|
+
name: httparty
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
113
113
|
none: false
|
114
114
|
requirements:
|
@@ -142,15 +142,15 @@ files:
|
|
142
142
|
- lib/all_seeing_pi.rb
|
143
143
|
- lib/all_seeing_pi/camera.rb
|
144
144
|
- lib/all_seeing_pi/configuration.rb
|
145
|
-
- lib/all_seeing_pi/
|
145
|
+
- lib/all_seeing_pi/gollum.rb
|
146
146
|
- lib/all_seeing_pi/uploader.rb
|
147
147
|
- lib/all_seeing_pi/version.rb
|
148
148
|
- test/fixtures/eye_of_sauron.jpg
|
149
149
|
- test/test_all_seeing_pi.rb
|
150
150
|
- test/test_camera.rb
|
151
151
|
- test/test_configuration.rb
|
152
|
+
- test/test_gollum.rb
|
152
153
|
- test/test_helper.rb
|
153
|
-
- test/test_palantir.rb
|
154
154
|
- test/test_uploader.rb
|
155
155
|
homepage: http://github.com/1337807/all_seeing_pi
|
156
156
|
licenses:
|
@@ -182,7 +182,7 @@ test_files:
|
|
182
182
|
- test/test_all_seeing_pi.rb
|
183
183
|
- test/test_camera.rb
|
184
184
|
- test/test_configuration.rb
|
185
|
+
- test/test_gollum.rb
|
185
186
|
- test/test_helper.rb
|
186
|
-
- test/test_palantir.rb
|
187
187
|
- test/test_uploader.rb
|
188
188
|
has_rdoc:
|
data/lib/all_seeing_pi/golem.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'all_seeing_pi/camera'
|
2
|
-
require 'all_seeing_pi/uploader'
|
3
|
-
|
4
|
-
module AllSeeingPi
|
5
|
-
class Golem
|
6
|
-
attr_reader :camera, :uploader
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@camera = AllSeeingPi::Camera.new
|
10
|
-
@uploader = AllSeeingPi::Uploader.new
|
11
|
-
end
|
12
|
-
|
13
|
-
def spy
|
14
|
-
image_path = @camera.capture
|
15
|
-
return unless File.exists?(image_path)
|
16
|
-
|
17
|
-
report "Captured #{image_path}"
|
18
|
-
|
19
|
-
store_image(image_path)
|
20
|
-
FileUtils.rm(image_path)
|
21
|
-
end
|
22
|
-
|
23
|
-
def report(msg)
|
24
|
-
puts msg unless ENV['ALL_SEEING_PI_ENV'] == 'test'
|
25
|
-
end
|
26
|
-
|
27
|
-
def store_image(image_path)
|
28
|
-
@uploader.upload(image_path)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/test/test_palantir.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class GolemTest < MiniTest::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@fixture = 'test/fixtures/eye_of_sauron.jpg'
|
6
|
-
@golem = AllSeeingPi::Golem.new
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_spy_sends_capture_to_the_camera
|
10
|
-
@golem.stubs(:store_image)
|
11
|
-
FileUtils.stubs(:rm)
|
12
|
-
|
13
|
-
@golem.camera.expects(:capture).returns(@fixture)
|
14
|
-
@golem.spy
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_store_image
|
18
|
-
@golem.camera.stubs(:capture).returns(@fixture)
|
19
|
-
FileUtils.stubs(:rm)
|
20
|
-
|
21
|
-
@golem.uploader.expects(:upload).with(@fixture)
|
22
|
-
@golem.spy
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_spy_deletes_the_image
|
26
|
-
@golem.camera.stubs(:capture).returns(@fixture)
|
27
|
-
@golem.stubs(:store_image)
|
28
|
-
|
29
|
-
FileUtils.expects(:rm).with(@fixture)
|
30
|
-
@golem.spy
|
31
|
-
end
|
32
|
-
end
|