pixo 0.2.0 → 0.2.1

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.
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