pixo 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a2ed5c3cd2e91b160038f832a3b282710879b21
4
- data.tar.gz: 533ea89508d8054cda89981d09dc7a012ba428d4
3
+ metadata.gz: 8aa1f77b18b26d4780cb42129a19d2d287001a9a
4
+ data.tar.gz: 7029163344d64ce5696b5f6aca011662c2f1b665
5
5
  SHA512:
6
- metadata.gz: 6b3bce155d3ac4418236f4cfc8ee774371bab059cf21f8b8c5a253587b3b2d9eef0a50cb7211ba2a1752cc7fbf892e42bbf94700b65ddc41221bcf19609513c7
7
- data.tar.gz: 43e9f3a7dd771a5c7b47b94382adfd30f3acaaf6f143f8730e1b3c31508dc200e47e9bf487d6d5034c67d62fe7289c4abed9534a14bbd22e99e8878d2fdea1cd
6
+ metadata.gz: '0925db69c959cf66caac3972316390f9539f54d81db691dd3079d27a354cfc79223726be2715c0e90f4b737cd2284581c2530a5aa5e7912511cd021977eb4360'
7
+ data.tar.gz: 5e109416c55cf554aa8c9125402a6bef21fd86f51d8ca22e679b3620bd892e0aaf2f385ab3cab2528ba8431a2a1495941b5146fe4d53c4c72654eebddd2cf57c
data/Gemfile.lock CHANGED
@@ -1,14 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pixo (0.2.0)
4
+ pixo (0.2.1)
5
+ concurrent-ruby
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
10
+ concurrent-ruby (1.0.5)
11
+ diff-lcs (1.3)
9
12
  rake (10.5.0)
10
13
  rake-compiler (1.0.4)
11
14
  rake
15
+ rspec (3.6.0)
16
+ rspec-core (~> 3.6.0)
17
+ rspec-expectations (~> 3.6.0)
18
+ rspec-mocks (~> 3.6.0)
19
+ rspec-core (3.6.0)
20
+ rspec-support (~> 3.6.0)
21
+ rspec-expectations (3.6.0)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.6.0)
24
+ rspec-mocks (3.6.0)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.6.0)
27
+ rspec-support (3.6.0)
12
28
 
13
29
  PLATFORMS
14
30
  ruby
@@ -18,6 +34,7 @@ DEPENDENCIES
18
34
  pixo!
19
35
  rake (~> 10.0)
20
36
  rake-compiler (~> 1.0)
37
+ rspec (>= 3.0)
21
38
 
22
39
  BUNDLED WITH
23
40
  1.15.4
data/exe/pixo CHANGED
@@ -1,5 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'pixo'
4
+ require 'pixo/application'
4
5
 
5
- Pixo::Application.new.run
6
+
7
+ service_thread = Thread.new do
8
+ sleep 0.1
9
+ Pixo::Ipc::Service.new(STDIN, STDOUT).run
10
+ Pixo::Application.instance.shutdown
11
+ end
12
+
13
+ Pixo::Application.instance.run
@@ -0,0 +1,61 @@
1
+ require 'benchmark'
2
+ require 'base64'
3
+
4
+ require File.expand_path('../../libpixgem', __FILE__)
5
+
6
+ module Pixo
7
+ class Application < Pixo::Native::Application
8
+ attr_accessor :running
9
+
10
+ def self.instance
11
+ @instance ||= Pixo::Application.new
12
+ end
13
+
14
+ def run
15
+ while(running)
16
+ self.running = tick(active_pattern) && running
17
+ end
18
+ close
19
+ end
20
+
21
+ def shutdown
22
+ self.running = false
23
+ end
24
+
25
+
26
+ def patterns
27
+ unless @patterns
28
+ @patterns = Hash.new
29
+ patterns_dir = File.join(File.dirname(__FILE__), "..", "..", 'ext', 'pixo', 'patterns')
30
+ Dir.entries(patterns_dir).each do | pattern_file|
31
+ next unless pattern_file.end_with?('.glsl')
32
+ @patterns[pattern_file] = Pixo::Native::Pattern.new(File.read(File.join(patterns_dir, pattern_file)))
33
+ end
34
+ end
35
+ @patterns
36
+ end
37
+
38
+ def active_pattern
39
+ @active_pattern ||= random_pattern
40
+ end
41
+
42
+ def random_pattern
43
+ patterns[patterns.keys.sample]
44
+ end
45
+
46
+ def active_pattern=(pattern)
47
+ pattern.reset_start
48
+ @active_pattern = pattern
49
+ end
50
+
51
+ private
52
+
53
+ def initialize()
54
+ super
55
+ self.running = true
56
+
57
+ add_fadecandy(Pixo::Native::FadeCandy.new('localhost', 8))
58
+ end
59
+ end
60
+ end
61
+
@@ -0,0 +1,108 @@
1
+ require 'concurrent'
2
+ require 'securerandom'
3
+ require 'base64'
4
+ require 'thread'
5
+
6
+ module Pixo::Ipc
7
+ class Service
8
+
9
+ def initialize(reader_pipe, writer_pipe)
10
+ @reader_pipe = reader_pipe
11
+ @writer_pipe = writer_pipe
12
+ @running = true
13
+ @live_requests = Concurrent::Hash.new
14
+
15
+ @pipe_mutex = Mutex.new
16
+ end
17
+
18
+ def run
19
+ while @running && (line = @reader_pipe.readline)
20
+ message = Marshal.load(Base64.strict_decode64(line.strip))
21
+ if message.is_a?(Pixo::Ipc::RequestMessage)
22
+ resp = Pixo::Ipc::ResponseMessage.new(message.data.call, message.rid)
23
+
24
+ bytes_to_write = Base64.strict_encode64(Marshal.dump(resp))
25
+ @pipe_mutex.synchronize do
26
+ @writer_pipe.write(bytes_to_write)
27
+ @writer_pipe.write($/)
28
+ @writer_pipe.flush
29
+ end
30
+ elsif message.is_a?(Pixo::Ipc::ResponseMessage)
31
+ @live_requests[message.rid]
32
+ request = @live_requests[message.rid]
33
+ request.send_result(message.data) if request
34
+ end
35
+ end
36
+ rescue EOFError
37
+ rescue IOError
38
+ end
39
+
40
+ def shutdown
41
+ @running = false
42
+ @reader_pipe.close
43
+ @writer_pipe.close
44
+ end
45
+
46
+ def request(message, timeout: nil)
47
+ request = Pixo::Ipc::Request.new(message)
48
+ @live_requests[request.message.rid] = request
49
+
50
+ @writer_pipe.write(Base64.strict_encode64(Marshal.dump(request.message)))
51
+ @writer_pipe.write($/)
52
+ @writer_pipe.flush
53
+
54
+ unless request.latch.wait(timeout)
55
+ raise Timeout::Error.new("%s: request timed out after %.3f seconds." % [request.rid, timeout] )
56
+ end
57
+
58
+ return request.response
59
+ ensure
60
+ @live_requests.delete request.message.rid
61
+ end
62
+
63
+ def live_request_count
64
+ @live_requests.count
65
+ end
66
+ end
67
+
68
+ class Request
69
+ attr_accessor :message
70
+
71
+ attr_reader :response
72
+ attr_reader :latch
73
+
74
+ def initialize(data)
75
+ @message = Pixo::Ipc::RequestMessage.new(data)
76
+
77
+ @latch = Concurrent::CountDownLatch.new(1)
78
+ end
79
+
80
+ def send_result(result)
81
+ @response = result
82
+ @latch.count_down
83
+ end
84
+ end
85
+
86
+ class Message
87
+ attr_accessor :data
88
+ attr_reader :rid
89
+
90
+ def initialize(data)
91
+ @data = data
92
+ end
93
+ end
94
+
95
+ class RequestMessage < Message
96
+ def initialize(data)
97
+ super(data)
98
+ @rid = "rid_#{SecureRandom.hex(10)}"
99
+ end
100
+ end
101
+
102
+ class ResponseMessage < Message
103
+ def initialize(data, rid)
104
+ @data = data
105
+ @rid = rid
106
+ end
107
+ end
108
+ end
data/lib/pixo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Pixo
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/pixo.rb CHANGED
@@ -1,82 +1,51 @@
1
1
  require "pixo/version"
2
+ require "pixo/ipc/service"
2
3
  require "open3"
3
- require 'benchmark'
4
- require 'base64'
5
-
6
- require File.expand_path('../libpixgem', __FILE__)
7
4
 
8
5
  module Pixo
9
- class FrameStatus
10
- attr_accessor :render_ms
11
- def initialize(render_ms)
12
- self.render_ms = render_ms
6
+ class GetPatternName
7
+ def call
8
+ Pixo::Application.instance.patterns.key(Pixo::Application.instance.active_pattern)
13
9
  end
14
10
  end
15
-
16
- class Renderer
17
-
18
- def run(&block)
19
- Open3.popen3('bundle exec pixo') do |i, o, e, t|
20
- while line = o.readline
21
-
22
- block.call(Marshal.load(Base64.strict_decode64(line.strip)))
23
- end
24
- end
11
+
12
+ class GetPatternNames
13
+ def call
14
+ Pixo::Application.instance.patterns.keys
25
15
  end
26
16
  end
27
17
 
28
- class Application < Pixo::Native::Application
29
- attr_accessor :running
30
-
31
- def initialize()
32
- super
33
- self.running = true
34
-
35
- add_fadecandy(Pixo::Native::FadeCandy.new('localhost', 8))
18
+ class SetPattern
19
+ def initialize(pattern_name)
20
+ @pattern_name = pattern_name
36
21
  end
37
-
38
- def run
39
- while(running)
40
- render_ms = Benchmark.realtime do
41
- running = tick(active_pattern) && running
42
- end
43
-
44
- stats = Pixo::FrameStatus.new(render_ms)
45
- STDOUT.write(Base64.strict_encode64(Marshal.dump(stats)))
46
- STDOUT.write($/)
47
- STDOUT.flush
48
22
 
49
- if (active_pattern.elapsed > 1)
50
- self.active_pattern = random_pattern
51
- end
52
- end
53
- close
23
+ def call
24
+ pattern = Pixo::Application.instance.patterns[@pattern_name]
25
+ Pixo::Application.instance.active_pattern = pattern if pattern
26
+ @pattern_name
54
27
  end
28
+ end
55
29
 
30
+ class Renderer
31
+ attr_reader :service, :service_thread
56
32
 
57
- def patterns
58
- unless @patterns
59
- @patterns = Hash.new
60
- patterns_dir = File.join(File.dirname(__FILE__), "..", 'ext', 'pixo', 'patterns')
61
- Dir.entries(patterns_dir).each do | pattern_file|
62
- next unless pattern_file.end_with?('.glsl')
63
- @patterns[pattern_file] = Pixo::Native::Pattern.new(File.read(File.join(patterns_dir, pattern_file)))
64
- end
65
- end
66
- @patterns
33
+ def initialize()
34
+ i, o, t = Open3.popen2('bundle exec pixo')
35
+ @service = Pixo::Ipc::Service.new(o, i)
36
+ @service_thread = Thread.new { self.service.run }
67
37
  end
68
38
 
69
- def active_pattern
70
- @active_pattern ||= random_pattern
39
+ def pattern_names
40
+ service.request(Pixo::GetPatternNames.new)
71
41
  end
72
42
 
73
- def random_pattern
74
- patterns[patterns.keys.sample]
43
+ def active_pattern
44
+ service.request(Pixo::GetPatternName.new)
75
45
  end
76
46
 
77
- def active_pattern=(pattern)
78
- pattern.reset_start
79
- @active_pattern = pattern
47
+ def set_pattern(name)
48
+ service.request(Pixo::SetPattern.new(name))
80
49
  end
81
50
  end
82
51
  end
data/pixo.gemspec CHANGED
@@ -25,8 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ["lib"]
27
27
 
28
+ spec.add_dependency "concurrent-ruby"
29
+
28
30
  spec.add_development_dependency "bundler", "~> 1.15"
29
31
  spec.add_development_dependency "rake", "~> 10.0"
30
32
  spec.add_development_dependency "rake-compiler", "~> 1.0"
33
+ spec.add_development_dependency "rspec", ">= 3.0"
31
34
 
32
35
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Constantine
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-23 00:00:00.000000000 Z
11
+ date: 2017-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
55
83
  description: Write a longer description or delete this line.
56
84
  email:
57
85
  - cconstan@gmail.com
@@ -1511,6 +1539,8 @@ files:
1511
1539
  - ext/pixo/src/main.cpp
1512
1540
  - ext/pixo/src/opengl.h
1513
1541
  - lib/pixo.rb
1542
+ - lib/pixo/application.rb
1543
+ - lib/pixo/ipc/service.rb
1514
1544
  - lib/pixo/version.rb
1515
1545
  - pixo.gemspec
1516
1546
  homepage: https://github.com/cconstantine