amida 0.0.1 → 0.0.2

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.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,8 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ruby-head
6
+ - jruby
7
+ - rbx-18mode
8
+ - rbx-19mode
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
+ gem 'slop'
2
3
 
3
- # Specify your gem's dependencies in amida.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -1,29 +1,28 @@
1
1
  # Amida
2
2
 
3
- TODO: Write a gem description
3
+ A Generator Amidakuji
4
4
 
5
5
  ## Installation
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'amida'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
7
+ Install it yourself as:
16
8
 
17
9
  $ gem install amida
18
10
 
19
11
  ## Usage
20
12
 
21
- TODO: Write usage instructions here
13
+ $ amida --width 8 --height 15
14
+
15
+ Result:
22
16
 
23
- ## Contributing
17
+ A B C D
18
+ | |---| |
19
+ |---| |---|
20
+ | |---| |
21
+ | | | |
22
+ | |---| |
23
+ |---| |---|
24
+ |---| | |
25
+ | | |---|
26
+ !!!
24
27
 
25
- 1. Fork it
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Added some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
28
+ Default width is 5 and height is 10.
data/Rakefile CHANGED
@@ -1,2 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ task :default => :spec
@@ -1,12 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
2
3
  require File.expand_path('../lib/amida/version', __FILE__)
3
4
 
4
5
  Gem::Specification.new do |gem|
5
- gem.authors = ["mururu"]
6
+ gem.authors = ["Yuki Ito"]
6
7
  gem.email = ["yuki@gnnk.net"]
7
- gem.description = %q{amida}
8
- gem.summary = %q{amida}
9
- gem.homepage = ""
8
+ gem.description = %q{Amida drawing}
9
+ gem.summary = %q{Amida drawing}
10
+ gem.homepage = "https://github.com/mururu/amida"
10
11
 
11
12
  gem.files = `git ls-files`.split($\)
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -14,4 +15,7 @@ Gem::Specification.new do |gem|
14
15
  gem.name = "amida"
15
16
  gem.require_paths = ["lib"]
16
17
  gem.version = Amida::VERSION
18
+
19
+ gem.add_development_dependency 'rspec', '~> 2.9'
20
+ gem.add_development_dependency 'rake', '~> 0.9.2'
17
21
  end
data/bin/amida CHANGED
@@ -1,7 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'slop'
3
+ require File.expand_path('../../lib/amida', __FILE__)
2
4
 
3
- require 'amida'
4
- args = ARGV.dup
5
- ARGV.clear
6
- Amida::Amida.new(args[0].to_i).render
7
- exit
5
+ opts = Slop.parse(:help => true) do
6
+ banner "amida [options]\n"
7
+ on :w, :width, 'Width of Amida. Default is 5', :argument => true
8
+ on :h, :height, 'Height of Amida Default is 10', :argument => true
9
+ end
10
+
11
+ unless opts.help?
12
+ Amida::Amida.new(:width => opts[:width] && opts[:width].to_i, :height => opts[:height] && opts[:height].to_i).render
13
+ end
@@ -1,45 +1,27 @@
1
- require "amida/version"
1
+ %w{
2
+ version
3
+ label
4
+ route
5
+ prize
6
+ }.each{|lib|require File.expand_path("../amida/#{lib}", __FILE__)}
2
7
 
3
8
  module Amida
4
9
  class Amida
5
- def initialize(width = 5, height = 10)
6
- @width, @height = width, height
7
- end
10
+ def initialize(args={})
11
+ @width = args[:width] || 5
12
+ @height = args[:height] || 10
13
+ raise ArgumentError, 'Width of Amida has to be 2 and over' if @width < 2
14
+ raise ArgumentError, 'Height of Amida has to be 1 nad over' if @height < 1
8
15
 
9
- def generate
10
- array = []
11
- array << ('A'..'Z').to_a[0..@width-1].map{|a|a+ ' '}
12
- @height.times do |i|
13
- j=(0..@width-2).to_a
14
- a = ['| ']*(@width)
15
- ar = a.thin_out
16
- array << ar
17
- end
18
- goal = [' ']*@width
19
- goal[(0..@width-2).to_a.sample] = '! '
20
- array << goal
21
- array
22
- end
16
+ @label = Label.new(@width)
17
+ @route = Route.new(@width, @height)
18
+ @prize = Prize.new(@width)
19
+ end
23
20
 
24
21
  def render
25
- @map ||= generate
26
- @map.each{|line| puts line.join}
22
+ @label.render
23
+ @route.render
24
+ @prize.render
27
25
  end
28
26
  end
29
27
  end
30
-
31
- class Array
32
- def thin_out
33
- now = -2
34
- array = []
35
- (0..length).to_a.each do |i|
36
- if now != i-1 && [true,false].sample && i < length-1
37
- array << '|---'
38
- now = i
39
- else
40
- array << self[i]
41
- end
42
- end
43
- array
44
- end
45
- end
@@ -0,0 +1,17 @@
1
+ module Amida
2
+ class Label
3
+ def initialize(width)
4
+ raise ArgumentError, "Width of Amida has to be 27 and under" if width > 26
5
+ @content = ('A'..'Z').to_a[0..width-1]
6
+ end
7
+
8
+ def render
9
+ puts to_s
10
+ end
11
+
12
+ private
13
+ def to_s
14
+ ' ' + (@content.join(' ')) + ' '
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module Amida
2
+ class Prize
3
+ def initialize(width)
4
+ ArgumentError if width.nil?
5
+ @width = width
6
+ content = [' ']*width
7
+ content[random_index] = '!!!'
8
+ @content = content
9
+ end
10
+
11
+ def render
12
+ puts to_s
13
+ end
14
+
15
+ private
16
+ def random_index
17
+ (0..@width-1).to_a.sample
18
+ end
19
+
20
+ def to_s
21
+ @content.join(' ')
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ module Amida
2
+ class Route
3
+ def initialize(width, height)
4
+ @width, @height = width, height
5
+ @crossbars = generate_crossbars
6
+ end
7
+
8
+ def render
9
+ puts to_s
10
+ end
11
+
12
+ private
13
+ def to_s
14
+ @crossbars.map{|line| ' |' + (line.map{|x| x ? '---' : ' '}.join('|')) + '| '}.join("\n")
15
+ end
16
+
17
+ def generate_crossbars
18
+ crossbars = Array.new(@height).map{ Array.new(@width-1) }
19
+ crossbars.map! do |line|
20
+ before_flg = false
21
+ line.map do |x|
22
+ unless before_flg
23
+ before_flg = [true,false].sample
24
+ else
25
+ before_flg = false
26
+ end
27
+ end
28
+ end
29
+ unless crossbars.any?{|line| line.any?{|x| x}}
30
+ crossbars[(0..@height-1).to_a.sample][(0..@width-2).to_a.sample] = true
31
+ end
32
+ crossbars
33
+ end
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  module Amida
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amida::Label do
4
+ context 'too big width' do
5
+ it { expect{ Amida::Label.new(27) }.to raise_error(ArgumentError) }
6
+ end
7
+
8
+ context 'width is 5' do
9
+ let(:label) { Amida::Label.new(5) }
10
+
11
+ describe '#to_s' do
12
+ it { label.send(:to_s).should == ' A B C D E ' }
13
+ end
14
+
15
+ describe '#render' do
16
+ it { capture(:stdout){ label.render }.should == " A B C D E \n" }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amida::Prize do
4
+ context 'width == 5' do
5
+ let(:prize) { Amida::Prize.new(5) }
6
+ let(:correct_result) { ' !!! ' }
7
+
8
+ describe '#to_s' do
9
+ context 'when prize index == 1' do
10
+ before do
11
+ Amida::Prize.any_instance.stub(:random_index).and_return(1)
12
+ end
13
+
14
+ it { prize.send(:to_s).should == correct_result }
15
+ end
16
+ end
17
+
18
+ describe '#render' do
19
+ context 'when prize index == 1' do
20
+ before do
21
+ prize.stub(:to_s).and_return(correct_result)
22
+ end
23
+
24
+ it { capture(:stdout){ prize.render }.should == correct_result + "\n" }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amida::Route do
4
+ context 'width.height == 5,10' do
5
+ let(:route) { Amida::Route.new(5, 10) }
6
+ let(:correct_route) do
7
+ [
8
+ ' | | |---| | ',
9
+ ' |---| | |---| ',
10
+ ' | |---| | | ',
11
+ ' |---| |---| | ',
12
+ ' | |---| |---| ',
13
+ ' | |---| | | ',
14
+ ' |---| | |---| ',
15
+ ' | | |---| | ',
16
+ ' |---| | |---| ',
17
+ ' | |---| | | '
18
+ ].join("\n")
19
+ end
20
+
21
+ context '#generate_crossbars' do
22
+ it 'have at least 1 crossbar' do
23
+ 100.times do
24
+ route.send(:generate_crossbars).any?{|line| line.any?{|x| x}}.should be_true
25
+ end
26
+ end
27
+
28
+ it 'have no adjacent crossbars' do
29
+ 100.times do
30
+ route.send(:generate_crossbars).any? {|line|
31
+ line.enum_for(:any?).with_index do |x, i|
32
+ i < line.length-1 && line[i] && line[i+1]
33
+ end
34
+ }.should be_false
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#to_s' do
40
+ before do
41
+ Amida::Route.any_instance.stub(:generate_crossbars).and_return(
42
+ [
43
+ [false, false, true, false],
44
+ [true, false, false, true],
45
+ [false, true, false, false],
46
+ [true, false, true, false],
47
+ [false, true, false, true],
48
+ [false, true, false, false],
49
+ [true, false, false, true],
50
+ [false, false, true, false],
51
+ [true, false, false, true],
52
+ [false, true, false, false]
53
+ ]
54
+ )
55
+ end
56
+
57
+ it { route.send(:to_s).should == correct_route }
58
+ end
59
+
60
+ describe '#render' do
61
+ before do
62
+ route.stub(:to_s).and_return(correct_route)
63
+ end
64
+
65
+ it { capture(:stdout){ route.render }.should == correct_route + "\n" }
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Amida::Amida do
4
+ context 'raise ArgumentError' do
5
+ context 'too small width' do
6
+ it { expect{ Amida::Amida.new(:width => 1, :height => 10) }.to raise_error ArgumentError }
7
+ end
8
+
9
+ context 'too small height' do
10
+ it { expect{ Amida::Amida.new(:width => 5, :height => 0) }.to raise_error ArgumentError }
11
+ end
12
+ end
13
+
14
+ context 'width, height == 5, 10' do
15
+ describe '#render' do
16
+ let(:amida) { Amida::Amida.new }
17
+
18
+ after do
19
+ to_dev_null{ amida.render }
20
+ end
21
+
22
+ it 'call @label.render' do
23
+ Amida::Label.any_instance.should_receive(:render)
24
+ end
25
+ it 'call @route.render' do
26
+ Amida::Route.any_instance.should_receive(:render)
27
+ end
28
+ it 'call @prize.render' do
29
+ Amida::Prize.any_instance.should_receive(:render)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ $:.unshift File.expand_path('..', __FILE__)
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+
4
+ require 'rspec'
5
+ require 'amida'
6
+
7
+ require 'stringio'
8
+ def capture(stream)
9
+ begin
10
+ stream = stream.to_s
11
+ result = StringIO.new
12
+ eval "$#{stream} = result"
13
+ yield
14
+ ensure
15
+ eval("$#{stream} = #{stream.upcase}")
16
+ end
17
+ result.string
18
+ end
19
+
20
+ def to_dev_null
21
+ begin
22
+ orig_stderr = $stderr.clone
23
+ orig_stdout = $stdout.clone
24
+ $stderr.reopen File.new('/dev/null', 'w')
25
+ $stdout.reopen File.new('/dev/null', 'w')
26
+ yield if block_given?
27
+ ensure
28
+ $stdout.reopen orig_stdout
29
+ $stderr.reopen orig_stderr
30
+ end
31
+ end
32
+
33
+ RSpec.configure do |config|
34
+ end
metadata CHANGED
@@ -1,17 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amida
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - mururu
8
+ - Yuki Ito
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-02 00:00:00.000000000 Z
13
- dependencies: []
14
- description: amida
12
+ date: 2012-06-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70280502416160 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.9'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70280502416160
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70280502415660 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.9.2
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70280502415660
36
+ description: Amida drawing
15
37
  email:
16
38
  - yuki@gnnk.net
17
39
  executables:
@@ -20,6 +42,8 @@ extensions: []
20
42
  extra_rdoc_files: []
21
43
  files:
22
44
  - .gitignore
45
+ - .rspec
46
+ - .travis.yml
23
47
  - Gemfile
24
48
  - LICENSE
25
49
  - README.md
@@ -27,8 +51,16 @@ files:
27
51
  - amida.gemspec
28
52
  - bin/amida
29
53
  - lib/amida.rb
54
+ - lib/amida/label.rb
55
+ - lib/amida/prize.rb
56
+ - lib/amida/route.rb
30
57
  - lib/amida/version.rb
31
- homepage: ''
58
+ - spec/amida/label_spec.rb
59
+ - spec/amida/prize_spec.rb
60
+ - spec/amida/route_spec.rb
61
+ - spec/amida_spec.rb
62
+ - spec/spec_helper.rb
63
+ homepage: https://github.com/mururu/amida
32
64
  licenses: []
33
65
  post_install_message:
34
66
  rdoc_options: []
@@ -51,6 +83,11 @@ rubyforge_project:
51
83
  rubygems_version: 1.8.11
52
84
  signing_key:
53
85
  specification_version: 3
54
- summary: amida
55
- test_files: []
86
+ summary: Amida drawing
87
+ test_files:
88
+ - spec/amida/label_spec.rb
89
+ - spec/amida/prize_spec.rb
90
+ - spec/amida/route_spec.rb
91
+ - spec/amida_spec.rb
92
+ - spec/spec_helper.rb
56
93
  has_rdoc: