all_seeing_pi 0.0.3 → 0.0.5
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.
- 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
|