bash-session 0.0.2 → 0.0.3

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: 94112c5160f83b5173687f7233a8891ad4bea404
4
- data.tar.gz: c02ca274af118e6ae761a581c22fea56e31082df
3
+ metadata.gz: fa2364a00285d79e09083b0f1dac3ff31bb2d195
4
+ data.tar.gz: fa13408e14f1c502792884de0a6b2b8711f0fc27
5
5
  SHA512:
6
- metadata.gz: 2c5203f8578c42c5eef1afdeec16244213ef85fa4033faaf648a85181211c7fe03ba96e48353bf412f10f5ec1f4e8bb9b6e1676c134809bbf4f3a5991169a15a
7
- data.tar.gz: bf36bb9de2287b23a4cc8bec4a40e6a5e6298efbe14f3b4356cd02b0b0858beb96914f8c59267f03f4c46041511a826deb71d6c8bab5ff47608f227a563b7fac
6
+ metadata.gz: 0d9639235772066fb33d0ea237f56df7a174a177d448cff9393b2f5a215b38f03e4c64cb02920df9b05a27c5f33d373f58dcf061bd04ca512d47d9f2784047fa
7
+ data.tar.gz: 6030eb8fce3b6e47785866ad0be353aefc9cbd83b172a20cb965f8b3d454e7920bde43cd19ea4ab1eef61e4e9610487d4427ef97554f91eaf6c7230fbc767b3f
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
@@ -0,0 +1 @@
1
+ bash-session
@@ -0,0 +1 @@
1
+ 2.2.4
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bash-session (0.0.3)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.10.1)
10
+ rake (10.5.0)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ bash-session!
17
+ bundler
18
+ minitest
19
+ rake (~> 10.0)
20
+
21
+ BUNDLED WITH
22
+ 1.13.7
data/README.md CHANGED
@@ -31,3 +31,5 @@ TODO: Write usage instructions here
31
31
  3. Commit your changes (`git commit -am 'Add some feature'`)
32
32
  4. Push to the branch (`git push origin my-new-feature`)
33
33
  5. Create a new Pull Request
34
+
35
+ To report an issue, [please contact the Snap.ci support team.](https://snap-ci.com/contact-us)
data/Rakefile CHANGED
@@ -1,2 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
2
3
 
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/*_test.rb"
6
+ end
7
+
8
+ task :default => [:test]
@@ -6,8 +6,8 @@ require 'bash/session/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "bash-session"
8
8
  spec.version = Bash::Session::VERSION
9
- spec.authors = ["Akshay Karle"]
10
- spec.email = ["akshay.a.karle@gmail.com"]
9
+ spec.authors = ["Snap CI"]
10
+ spec.email = ["support@snap-ci.com"]
11
11
  spec.summary = %q{A minimalistic gem for a persistent bash session.}
12
12
  spec.description = ""
13
13
  spec.homepage = ""
@@ -18,8 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.required_ruby_version = '~> 2.2'
22
+
21
23
  spec.add_development_dependency "bundler"
22
24
  spec.add_development_dependency "rake", "~> 10.0"
23
25
 
24
- spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "minitest"
25
27
  end
@@ -6,6 +6,8 @@ module Bash
6
6
  class Session
7
7
  class TimeoutError < StandardError; end
8
8
 
9
+ attr_reader :default_timeout
10
+
9
11
  def initialize(default_timeout=nil)
10
12
  start_session
11
13
  @default_timeout = default_timeout
@@ -1,5 +1,5 @@
1
1
  module Bash
2
2
  class Session
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -0,0 +1,125 @@
1
+ require_relative 'test_helper'
2
+
3
+ class BashSessionTest < Minitest::Test
4
+ parallelize_me! unless ENV["SNAP_CI"]
5
+
6
+ def setup
7
+ @session = Bash::Session.new
8
+ end
9
+
10
+ def teardown
11
+ @session.close
12
+ end
13
+
14
+ def test_run_commands_and_show_out_put_when_it_does_not_end_in_a_new_line
15
+ @session.execute("echo -n hello") { |output| assert_equal "hello", output }
16
+ end
17
+
18
+ def test_return_the_exit_status_of_the_command
19
+ exit_status = @session.execute("true")
20
+ assert_equal 0, exit_status
21
+
22
+ exit_status = @session.execute("false")
23
+ assert_equal 1, exit_status
24
+ end
25
+
26
+ def test_run_commands_ending_with_comments
27
+ exit_status = @session.execute("true # this is a comment") { |output| assert_equal "", output }
28
+ assert_equal 0, exit_status
29
+ end
30
+
31
+ def test_uses_same_session_and_preserves_state_through_sequential_commands
32
+ assert_success_with_output("cd #{Dir.pwd}/test")
33
+ assert_success_with_output("pwd") { |output| assert_match("#{Dir.pwd}/test", output) }
34
+ assert_success_with_output("cd ~")
35
+ assert_success_with_output("pwd") { |output| assert_match(Dir.home, output) }
36
+ assert_success_with_output("echo $FOO") { |output| refute_match("bar", output) }
37
+ assert_success_with_output("export FOO=bar")
38
+ assert_success_with_output("echo $FOO") { |output| assert_match("bar", output) }
39
+ end
40
+
41
+ def test_run_multiple_commands_separated_by_a_newline
42
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
43
+ @session.execute("echo hi\necho bye", out: writer)
44
+ writer.close
45
+ assert_equal "hi\nbye\n", reader.read
46
+ end
47
+
48
+ def test_wait_for_long_running_commands_to_complete_and_then_exit
49
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
50
+ exit_status = @session.execute("for i in {1..5}; do echo -n 'hello world '; sleep 1; done", out: writer)
51
+ assert_equal 0, exit_status
52
+ writer.close
53
+ assert_equal "hello world "*5, reader.read
54
+ end
55
+
56
+ def test_raise_error_when_command_does_not_generate_any_output_within_a_default_timeout_period
57
+ @session = Bash::Session.new(3)
58
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
59
+
60
+ begin_time = Time.now
61
+ e = assert_raises(Bash::Session::TimeoutError) do
62
+ @session.execute("echo hi; sleep 300; echo bye", out: writer)
63
+ end
64
+ end_time = Time.now
65
+
66
+ writer.close
67
+
68
+ assert_in_delta(3, end_time - begin_time, 2.0)
69
+ assert_equal 'No output received for the last 3 seconds. Timing out...', e.message
70
+ assert_equal "hi\n", reader.read
71
+ end
72
+
73
+ def test_raise_error_when_command_does_not_generate_any_output_command_specific_timeout_period
74
+ @session = Bash::Session.new(1)
75
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
76
+
77
+ begin_time = Time.now
78
+ e = assert_raises(Bash::Session::TimeoutError) do
79
+ @session.execute("echo hi; sleep 300; echo bye", out: writer, timeout: 3)
80
+ end
81
+ end_time = Time.now
82
+
83
+ writer.close
84
+
85
+ assert_in_delta(3, end_time - begin_time, 2.0)
86
+ assert_equal 'No output received for the last 3 seconds. Timing out...', e.message
87
+ assert_equal "hi\n", reader.read
88
+ end
89
+
90
+ def test_not_raise_error_when_long_running_command_is_constantly_generating_output_with_default_timeout
91
+ @session = Bash::Session.new(3)
92
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
93
+
94
+ exit_status = @session.execute("echo -n hi; for i in {1..6}; do sleep 1; echo -n .; done; echo bye", out: writer)
95
+ writer.close
96
+
97
+ assert_equal 0, exit_status
98
+ assert_equal "hi......bye\n", reader.read
99
+ end
100
+
101
+ def test_not_raise_error_when_long_running_command_is_constantly_generating_output_with_a_command_specific_timeout
102
+ @session = Bash::Session.new(3)
103
+ reader, writer = IO.pipe(Encoding::ASCII_8BIT)
104
+
105
+ exit_status = @session.execute("echo -n hi; for i in {1..6}; do sleep 4; echo -n .; done; echo bye", out: writer, timeout: 5)
106
+ writer.close
107
+
108
+ assert_equal "hi......bye\n", reader.read
109
+ end
110
+
111
+ def test_start_a_non_interactive_login_shell_session
112
+ exit_status = @session.execute("[[ $- != *i* ]]")
113
+ assert_equal 0, exit_status
114
+
115
+ exit_status = @session.execute("shopt -q login_shell")
116
+ assert_equal 0, exit_status
117
+ end
118
+
119
+ def assert_success_with_output(command, &block)
120
+ output = ""
121
+ status = @session.execute(command) { |out| output = out }
122
+ assert_equal 0, status, "command #{command} failed with status #{status}"
123
+ yield output if block_given?
124
+ end
125
+ end
@@ -0,0 +1,5 @@
1
+ $: << "lib"
2
+
3
+ require "minitest/autorun"
4
+ require "minitest/hell"
5
+ require "bash/session"
metadata CHANGED
@@ -1,74 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bash-session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
- - Akshay Karle
7
+ - Snap CI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-10 00:00:00.000000000 Z
11
+ date: 2017-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: ''
56
56
  email:
57
- - akshay.a.karle@gmail.com
57
+ - support@snap-ci.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
62
+ - ".gitignore"
63
+ - ".ruby-gemset"
64
+ - ".ruby-version"
63
65
  - Gemfile
66
+ - Gemfile.lock
64
67
  - LICENSE.txt
65
68
  - README.md
66
69
  - Rakefile
67
70
  - bash-session.gemspec
68
71
  - lib/bash/session.rb
69
72
  - lib/bash/session/version.rb
70
- - spec/session_spec.rb
71
- - spec/spec_helper.rb
73
+ - test/session_test.rb
74
+ - test/test_helper.rb
72
75
  homepage: ''
73
76
  licenses:
74
77
  - MIT
@@ -79,20 +82,20 @@ require_paths:
79
82
  - lib
80
83
  required_ruby_version: !ruby/object:Gem::Requirement
81
84
  requirements:
82
- - - '>='
85
+ - - "~>"
83
86
  - !ruby/object:Gem::Version
84
- version: '0'
87
+ version: '2.2'
85
88
  required_rubygems_version: !ruby/object:Gem::Requirement
86
89
  requirements:
87
- - - '>='
90
+ - - ">="
88
91
  - !ruby/object:Gem::Version
89
92
  version: '0'
90
93
  requirements: []
91
94
  rubyforge_project:
92
- rubygems_version: 2.0.14
95
+ rubygems_version: 2.4.5.1
93
96
  signing_key:
94
97
  specification_version: 4
95
98
  summary: A minimalistic gem for a persistent bash session.
96
99
  test_files:
97
- - spec/session_spec.rb
98
- - spec/spec_helper.rb
100
+ - test/session_test.rb
101
+ - test/test_helper.rb
@@ -1,113 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Bash::Session do
4
- before(:each) do
5
- @session = Bash::Session.new
6
- end
7
-
8
- after(:each) do
9
- @session.close
10
- end
11
-
12
- it 'should run commands and show out put when it does not end in a new line' do
13
- @session.execute("echo -n hello") { |output| expect(output).to eq("hello") }
14
- end
15
-
16
- it 'should return the exit status of the command' do
17
- exit_status = @session.execute("true")
18
- expect(exit_status).to eq(0)
19
-
20
- exit_status = @session.execute("false")
21
- expect(exit_status).to eq(1)
22
- end
23
-
24
- it 'should run commands ending with comments' do
25
- exit_status = @session.execute("true # this is a comment") { |output| expect(output).to eq("") }
26
- expect(exit_status).to eq(0)
27
- end
28
-
29
- it 'should preserve the state of bash internal commands' do
30
- @session.execute("cd #{Dir.pwd}/spec")
31
- @session.execute("pwd") { |output| expect(output).to include("#{Dir.pwd}/spec") }
32
- @session.execute("cd ~")
33
- @session.execute("pwd") { |output| expect(output).to include(Dir.home) }
34
- @session.execute("echo $FOO") { |output| expect(output).to_not include("bar") }
35
- @session.execute("export FOO=bar")
36
- @session.execute("echo $FOO") { |output| expect(output).to include("bar") }
37
- end
38
-
39
- it 'should run multiple commands separated by a newline' do
40
- reader, writer = IO.pipe
41
- @session.execute("echo hi\necho bye", out: writer)
42
- writer.close
43
- expect(reader.read).to eq("hi\nbye\n")
44
- end
45
-
46
- it 'should wait for long running commands to complete and then exit' do
47
- reader, writer = IO.pipe
48
- exit_status = @session.execute("for i in {1..5}; do echo -n 'hello world '; sleep 1; done", out: writer)
49
- expect(exit_status).to eq(0)
50
- writer.close
51
- expect(reader.read).to eq("hello world "*5)
52
- end
53
-
54
- it 'should raise error when command does not generate any output within a default timeout period' do
55
- @session = Bash::Session.new(3)
56
- reader, writer = IO.pipe
57
-
58
- begin_time = Time.now
59
- expect do
60
- exit_status = @session.execute("echo hi; sleep 300; echo bye", out: writer)
61
- end.to raise_error(Bash::Session::TimeoutError, 'No output received for the last 3 seconds. Timing out...')
62
- writer.close
63
- end_time = Time.now
64
-
65
- expect(end_time - begin_time).to be_within(0.1).of(3)
66
- expect(reader.read_nonblock(1000)).to eq("hi\n")
67
- end
68
-
69
- it 'should raise error when command does not generate any output command specific timeout period' do
70
- @session = Bash::Session.new(1)
71
- reader, writer = IO.pipe
72
-
73
- begin_time = Time.now
74
-
75
- expect do
76
- exit_status = @session.execute("echo hi; sleep 300; echo bye", out: writer, timeout: 3)
77
- end.to raise_error(Bash::Session::TimeoutError, 'No output received for the last 3 seconds. Timing out...')
78
- end_time = Time.now
79
-
80
- writer.close
81
-
82
- expect(end_time - begin_time).to be_within(0.1).of(3)
83
- expect(reader.read_nonblock(1000)).to eq("hi\n")
84
- end
85
-
86
- it 'should not raise error when long running command is constantly generating output with default timeout' do
87
- @session = Bash::Session.new(3)
88
- reader, writer = IO.pipe
89
-
90
- exit_status = @session.execute("echo -n hi; for i in {1..6}; do sleep 1; echo -n .; done; echo bye", out: writer)
91
- writer.close
92
-
93
- expect(reader.read_nonblock(1000)).to eq("hi......bye\n")
94
- end
95
-
96
- it 'should not raise error when long running command is constantly generating output with a command specific timeout' do
97
- @session = Bash::Session.new(3)
98
- reader, writer = IO.pipe
99
-
100
- exit_status = @session.execute("echo -n hi; for i in {1..6}; do sleep 4; echo -n .; done; echo bye", out: writer, timeout: 5)
101
- writer.close
102
-
103
- expect(reader.read_nonblock(1000)).to eq("hi......bye\n")
104
- end
105
-
106
- it 'should start a non-interactive login shell session' do
107
- exit_status = @session.execute("[[ $- != *i* ]]")
108
- expect(exit_status).to eq(0)
109
-
110
- exit_status = @session.execute("shopt -q login_shell")
111
- expect(exit_status).to eq(0)
112
- end
113
- end
@@ -1,90 +0,0 @@
1
- require 'bash/session'
2
- # This file was generated by the `rspec --init` command. Conventionally, all
3
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
- # The generated `.rspec` file contains `--require spec_helper` which will cause this
5
- # file to always be loaded, without a need to explicitly require it in any files.
6
- #
7
- # Given that it is always loaded, you are encouraged to keep this file as
8
- # light-weight as possible. Requiring heavyweight dependencies from this file
9
- # will add to the boot time of your test suite on EVERY test run, even for an
10
- # individual file that may not need all of that loaded. Instead, consider making
11
- # a separate helper file that requires the additional dependencies and performs
12
- # the additional setup, and require it from the spec files that actually need it.
13
- #
14
- # The `.rspec` file also contains a few flags that are not defaults but that
15
- # users commonly want.
16
- #
17
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
18
- RSpec.configure do |config|
19
- # rspec-expectations config goes here. You can use an alternate
20
- # assertion/expectation library such as wrong or the stdlib/minitest
21
- # assertions if you prefer.
22
- config.expect_with :rspec do |expectations|
23
- # This option will default to `true` in RSpec 4. It makes the `description`
24
- # and `failure_message` of custom matchers include text for helper methods
25
- # defined using `chain`, e.g.:
26
- # be_bigger_than(2).and_smaller_than(4).description
27
- # # => "be bigger than 2 and smaller than 4"
28
- # ...rather than:
29
- # # => "be bigger than 2"
30
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
31
- end
32
-
33
- # rspec-mocks config goes here. You can use an alternate test double
34
- # library (such as bogus or mocha) by changing the `mock_with` option here.
35
- config.mock_with :rspec do |mocks|
36
- # Prevents you from mocking or stubbing a method that does not exist on
37
- # a real object. This is generally recommended, and will default to
38
- # `true` in RSpec 4.
39
- mocks.verify_partial_doubles = true
40
- end
41
-
42
- # The settings below are suggested to provide a good initial experience
43
- # with RSpec, but feel free to customize to your heart's content.
44
- =begin
45
- # These two settings work together to allow you to limit a spec run
46
- # to individual examples or groups you care about by tagging them with
47
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
48
- # get run.
49
- config.filter_run :focus
50
- config.run_all_when_everything_filtered = true
51
-
52
- # Limits the available syntax to the non-monkey patched syntax that is recommended.
53
- # For more details, see:
54
- # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
55
- # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
56
- # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
57
- config.disable_monkey_patching!
58
-
59
- # This setting enables warnings. It's recommended, but in some cases may
60
- # be too noisy due to issues in dependencies.
61
- config.warnings = true
62
-
63
- # Many RSpec users commonly either run the entire suite or an individual
64
- # file, and it's useful to allow more verbose output when running an
65
- # individual spec file.
66
- if config.files_to_run.one?
67
- # Use the documentation formatter for detailed output,
68
- # unless a formatter has already been configured
69
- # (e.g. via a command-line flag).
70
- config.default_formatter = 'doc'
71
- end
72
-
73
- # Print the 10 slowest examples and example groups at the
74
- # end of the spec run, to help surface which specs are running
75
- # particularly slow.
76
- config.profile_examples = 10
77
-
78
- # Run specs in random order to surface order dependencies. If you find an
79
- # order dependency and want to debug it, you can fix the order by providing
80
- # the seed, which is printed after each run.
81
- # --seed 1234
82
- config.order = :random
83
-
84
- # Seed global randomization in this process using the `--seed` CLI option.
85
- # Setting this allows you to use `--seed` to deterministically reproduce
86
- # test failures related to randomization by passing the same `--seed` value
87
- # as the one that triggered the failure.
88
- Kernel.srand config.seed
89
- =end
90
- end