Skip to content

Commit

Permalink
Merge pull request #32 from shanecav84/register_spinner_instance
Browse files Browse the repository at this point in the history
Multi spinner can register a spinner instance
  • Loading branch information
piotrmurach committed Oct 9, 2018
2 parents 572be01 + 4e1922d commit 3e7c714
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 5 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ Use **TTY::Spinner::Multi** to synchornize multiple spinners:
spinners = TTY::Spinner::Multi.new("[:spinner] top")

sp1 = spinners.register "[:spinner] one"
# or sp1 = ::TTY::Spinner.new("[:spinner] one")
sp2 = spinners.register "[:spinner] two"

sp1.auto_spin
Expand Down Expand Up @@ -417,6 +418,9 @@ Create and register a `TTY::Spinner` under the multispinner

```ruby
new_spinner = multi_spinner.register("[:spinner] Task 1 name", options)
# or
# spinner = ::TTY::Spinner.new("[:spinner] one")
# sp1 = multi_spinner.register(spinner)
```

If no options are given it will use the options given to the multi_spinner when it was initialized to create the new spinner.
Expand Down
19 changes: 15 additions & 4 deletions lib/tty/spinner/multi.rb
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,24 @@ def initialize(*args)

# Register a new spinner
#
# @param [String] pattern
# the pattern used for creating spinner
# @param [String, TTY::Spinner] pattern_or_spinner
# the pattern used for creating spinner, or a spinner instance
#
# @api public
def register(pattern, options = {}, &job)
def register(pattern_or_spinner, options = {}, &job)
observable = options.delete(:observable) { true }
spinner = TTY::Spinner.new(pattern, @options.merge(options))

spinner = if pattern_or_spinner.is_a?(::String)
TTY::Spinner.new(
pattern_or_spinner,
@options.merge(options)
)
elsif pattern_or_spinner.is_a?(::TTY::Spinner)
pattern_or_spinner
else
raise ArgumentError, "Expected a pattern or spinner, " \
"got: #{pattern_or_spinner.class}"
end

synchronize do
spinner.attach_to(self)
Expand Down
22 changes: 21 additions & 1 deletion spec/unit/multi/register_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
RSpec.describe TTY::Spinner::Multi, '#register' do
let(:output) { StringIO.new('', 'w+') }

it "registers a TTY::Spinner instance" do
it "registers a TTY::Spinner instance from a pattern" do
spinners = TTY::Spinner::Multi.new(output: output, interval: 100)
allow_any_instance_of(TTY::Spinner).to receive(:attach_to)
expect_any_instance_of(TTY::Spinner).to receive(:attach_to)
Expand All @@ -14,6 +14,26 @@
expect(spinners.length).to eq(1)
end

it "registers a TTY::Spinner instance from a spinner instance" do
spinners = TTY::Spinner::Multi.new(output: output, interval: 100)
spinner_to_register = ::TTY::Spinner.new

spinner = spinners.register spinner_to_register

expect(spinner).to eq(spinner_to_register)
expect(spinners.length).to eq(1)
end

it "raises an erro when given neither a string or spinner instance" do
spinners = TTY::Spinner::Multi.new(output: output, interval: 100)

expect { spinners.register [] }.
to raise_error(
ArgumentError,
"Expected a pattern or spinner, got: Array"
)
end

it "uses global options to register instance" do
spinners = TTY::Spinner::Multi.new(output: output, interval: 100)
spinner = double(:spinner, attach_to: nil)
Expand Down

0 comments on commit 3e7c714

Please sign in to comment.