browserify_rb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,83 @@
1
+ require "open3"
2
+ require "stringio"
3
+ require "logger"
4
+
5
+ class BrowserifyRb
6
+ module Popen3
7
+ LOG = Logger.new(STDERR)
8
+
9
+ CHUNK_SIZE = 2000
10
+ DEFAULT_STDOUT_HANDLER = proc {|data| STDOUT.print data }
11
+ DEFAULT_STDERR_HANDLER = proc {|data| STDERR.print data }
12
+
13
+ def self.async_exec(
14
+ input: "",
15
+ env: {},
16
+ cmd: nil,
17
+ stdout_handler: DEFAULT_STDOUT_HANDLER,
18
+ stderr_handler: DEFAULT_STDERR_HANDLER,
19
+ spawn_opts: {},
20
+ chunk_size: CHUNK_SIZE)
21
+
22
+ raise ArgumentError, "'cmd' require" if cmd.nil?
23
+
24
+ stdin, stdout, stderr, wait_thr = Open3.popen3 env, cmd, spawn_opts
25
+
26
+ in_buf = StringIO.new input
27
+ opened_ins = [stdin]
28
+ opened_outs = [stdout, stderr]
29
+
30
+ Thread.fork do
31
+ begin
32
+ while not opened_outs.empty?
33
+ ios = IO.select opened_outs, opened_ins, nil, 1
34
+ if ios.nil? and Process.waitpid(wait_thr.pid, Process::WNOHANG)
35
+ break
36
+ end
37
+
38
+ outs, ins, = ios
39
+
40
+ unless outs.nil?
41
+ if outs.include? stdout
42
+ begin
43
+ d = stdout.readpartial CHUNK_SIZE
44
+ stdout_handler.yield d
45
+ rescue EOFError
46
+ opened_outs.delete stdout
47
+ end
48
+ end
49
+
50
+ if outs.include? stderr
51
+ begin
52
+ d = stderr.readpartial CHUNK_SIZE
53
+ stderr_handler.yield d
54
+ rescue EOFError
55
+ opened_outs.delete stderr
56
+ end
57
+ end
58
+ end
59
+
60
+ if not ins.nil? and ins.include? stdin
61
+ i = begin
62
+ in_buf.readpartial CHUNK_SIZE
63
+ rescue EOFError
64
+ nil
65
+ end
66
+ if i.nil?
67
+ stdin.close
68
+ opened_ins.delete stdin
69
+ else
70
+ bytes = stdin.write_nonblock(i)
71
+ in_buf.seek bytes - i.bytesize, IO::SEEK_CUR
72
+ end
73
+ end
74
+ end
75
+ rescue => e
76
+ LOG.error e
77
+ end
78
+ end
79
+
80
+ wait_thr
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,3 @@
1
+ class BrowserifyRb
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,79 @@
1
+ require "browserify_rb/version"
2
+ require "browserify_rb/nvm"
3
+
4
+ require "stringio"
5
+
6
+ class BrowserifyRb
7
+ DEFAULT_NVM_DIR = "#{ENV["HOME"]}/.nvm"
8
+
9
+ def initialize(
10
+ browserify_opts: "", node_ver: "stable", env: {},
11
+ nvm_dir: DEFAULT_NVM_DIR, suppress_stderr: false)
12
+ @nvm = BrowserifyRb::Nvm.new nvm_dir
13
+ @node_ver = node_ver
14
+ @env = env
15
+ @browserify_opts = browserify_opts
16
+ @suppress_stderr = suppress_stderr
17
+ @prepared = false
18
+ end
19
+
20
+ def prepare
21
+ cmd = <<-CMD
22
+ if ! npm ls -g browserify &>/dev/null; then
23
+ npm install -g browserify >&2
24
+ fi
25
+ CMD
26
+ stdout_handler = proc {|d| }
27
+ stderr_handler = @suppress_stderr ?
28
+ proc {|d| } :
29
+ proc {|d| STDERR.print d}
30
+ status = @nvm.run(
31
+ cmd,
32
+ node_ver: @node_ver,
33
+ env: @env,
34
+ stdout_handler: stdout_handler,
35
+ stderr_handler: stderr_handler
36
+ ).value
37
+ raise "non-zero exit status: #{status.to_i}" unless status.success?
38
+ @prepared = true
39
+ end
40
+
41
+ def compile source
42
+ prepare unless @prepared
43
+
44
+ out_buf = StringIO.new
45
+ cmd = <<-CMD
46
+ if ! npm ls -g browserify &>/dev/null; then
47
+ npm install -g browserify >&2
48
+ fi
49
+ browserify #{@browserify_opts} -- -
50
+ CMD
51
+ stdout_handler = proc {|d| out_buf << d }
52
+ stderr_handler = @suppress_stderr ?
53
+ proc {|d| } :
54
+ proc {|d| STDERR.print d}
55
+ status = @nvm.run(
56
+ cmd,
57
+ stdin: source,
58
+ node_ver: @node_ver,
59
+ env: @env,
60
+ stdout_handler: stdout_handler,
61
+ stderr_handler: stderr_handler
62
+ ).value
63
+ raise "non-zero exit status: #{status.to_i}" unless status.success?
64
+
65
+ return out_buf.string
66
+ end
67
+
68
+ def self.compile(
69
+ source, browserify_opts: "", node_ver: "stable", env: {},
70
+ nvm_dir: DEFAULT_NVM_DIR, suppress_stderr: false)
71
+ new(
72
+ browserify_opts: browserify_opts,
73
+ node_ver: node_ver,
74
+ env: env,
75
+ nvm_dir: nvm_dir,
76
+ suppress_stderr: suppress_stderr
77
+ ).compile(source)
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: browserify_rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Keiichiro Ui
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ description: browserify wrapper with nvm to install node automatically
56
+ email:
57
+ - keiichiro.ui@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .travis.yml
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - bin/console
69
+ - bin/setup
70
+ - browserify_rb.gemspec
71
+ - lib/browserify_rb.rb
72
+ - lib/browserify_rb/nvm.rb
73
+ - lib/browserify_rb/nvm.sh
74
+ - lib/browserify_rb/popen3.rb
75
+ - lib/browserify_rb/version.rb
76
+ homepage: https://github.com/kui/browserify_rb
77
+ licenses:
78
+ - MIT
79
+ metadata:
80
+ allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.0.14
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: browserify wrapper
101
+ test_files: []