glimmer 0.1.5.470 → 0.1.8.470

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +2 -0
  5. data/README.markdown +7 -2
  6. data/Rakefile +7 -8
  7. data/TODO.md +1 -1
  8. data/VERSION +1 -1
  9. data/bin/girb +3 -0
  10. data/bin/girb_runner.rb +5 -0
  11. data/glimmer.gemspec +29 -19
  12. data/lib/glimmer_application.rb +1 -2
  13. data/lib/shine.rb +23 -21
  14. data/lib/xml_command_handlers/models/node.rb +11 -11
  15. data/lib/xml_command_handlers/models/xml_visitor.rb +12 -12
  16. data/samples/tictactoe/tic_tac_toe.rb +11 -11
  17. data/spec/lib/command_handlers/models/observable_model_spec.rb +22 -0
  18. data/spec/lib/command_handlers/models/r_widget_spec.rb +52 -0
  19. data/{test/glimmer_combo_data_binding_test.rb → spec/lib/glimmer__combo_data_binding__spec.rb} +48 -49
  20. data/spec/lib/glimmer__constant__spec.rb +30 -0
  21. data/{test/glimmer_data_binding_test.rb → spec/lib/glimmer__data_binding__spec.rb} +95 -94
  22. data/spec/lib/glimmer__list_data_binding__spec.rb +224 -0
  23. data/{test/glimmer_listeners_test.rb → spec/lib/glimmer__listeners__spec.rb} +18 -19
  24. data/spec/lib/glimmer__shine_data_binding__spec.rb +89 -0
  25. data/spec/lib/glimmer__tab_item__spec.rb +55 -0
  26. data/spec/lib/glimmer__table_data_binding__spec.rb +121 -0
  27. data/spec/lib/glimmer_spec.rb +251 -0
  28. data/spec/lib/xml/glimmer_xml_spec.rb +154 -0
  29. data/spec/samples/contactmanager/contact_manager_presenter_spec.rb +81 -0
  30. data/spec/samples/tictactoe/tic_tac_toe_spec.rb +263 -0
  31. data/spec/spec_helper.rb +123 -0
  32. metadata +50 -17
  33. data/test/glimmer_constant_test.rb +0 -30
  34. data/test/glimmer_list_data_binding_test.rb +0 -223
  35. data/test/glimmer_shine_data_binding_test.rb +0 -89
  36. data/test/glimmer_tab_item_test.rb +0 -61
  37. data/test/glimmer_table_data_binding_test.rb +0 -122
  38. data/test/glimmer_test.rb +0 -237
  39. data/test/helper.rb +0 -24
  40. data/test/observable_model_test.rb +0 -25
  41. data/test/r_widget_test.rb +0 -52
  42. data/test/samples/contactmanager/contact_manager_presenter_test.rb +0 -81
  43. data/test/samples/tictactoe/tic_tac_toe_test.rb +0 -262
  44. data/test/xml/glimmer_xml_test.rb +0 -163
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5614f3671026c45846b7f6bfadd538f8ce93b8bddcc8b10407fa3c046b041a1
4
- data.tar.gz: 97450f0a03ea502699b7ecd38ed7444f0f6c6ab9494a6d01d12d7a5986fb7851
3
+ metadata.gz: 33d1e6ed089bc7dd67eee706f264787cda60ebe2fc1c3fdf1697c277ff5adad4
4
+ data.tar.gz: 7c7b23d0827e273289502df018308c7ab383c6e7299e75c6da89a9034113af53
5
5
  SHA512:
6
- metadata.gz: 7168e408c5b7095a7852033a33635bec397681b3211ca64bef8ff7980b7b16ec5bf3123d2f21426b8527849019539333af2d5ecee989df0b3b8eccce8e23090b
7
- data.tar.gz: 6d194c420b0daa51f2e23ceaae47e11c495aabbcf8b6a41b264b3270c5a515a2bfd25924b1582104a1e1f9ee41396b7688b2e5613473638e94e81ea31751cb78
6
+ metadata.gz: 917f8181c1085e246bca952bd4861974081a95486b415e7e6f6c1dcc465776b79ae02ad18b1071f40823c74fdc721186ae5d008a4e1cadd4da2a0da6db40136f
7
+ data.tar.gz: 2011b3eedcb1018624bdb872aef40f5900ba2892e680e5ec23cffd495fea4574fd34a66e9720263a343f4ae30e56a91adba5a87529fe9bcf50408cd0e2548c4d
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ repo_token: dvAuyH3RuZ3lslleCHAeovxv0kQpFdrsB
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile CHANGED
@@ -4,6 +4,8 @@ gem 'facets', '3.1.0'
4
4
  gem 'os', '1.0.0'
5
5
 
6
6
  group :development do
7
+ gem "rspec", "~> 3.5.0"
8
+ gem "rspec-mocks", "~> 3.5.0"
7
9
  gem "rdoc", "~> 2.3.0"
8
10
  gem "bundler", "~> 1.0"
9
11
  gem "jeweler", "~> 2.3.0"
data/README.markdown CHANGED
@@ -1,4 +1,5 @@
1
1
  # Glimmer (The Original One And Only)
2
+ [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer?branch=master)
2
3
 
3
4
  Glimmer is a cross-platform Ruby desktop development library. Glimmer's main innovation is a JRuby DSL that enables easy and efficient authoring of desktop application user-interfaces while relying on the robust platform-independent Eclipse SWT library. Glimmer additionally innovates by having built-in desktop UI data-binding support to greatly facilitate synchronizing the UI with domain models. As a result, that achieves true decoupling of object oriented components, enabling developers to solve business problems without worrying about UI concerns, or alternatively drive development UI-first, and then write clean business components test-first afterward.
4
5
 
@@ -25,7 +26,7 @@ Please follow these instructions to make the `glimmer` command available on your
25
26
 
26
27
  Add the following to `Gemfile`:
27
28
  ```
28
- gem 'glimmer', '~> 0.1.5.470'
29
+ gem 'glimmer', '~> 0.1.8.470'
29
30
  ```
30
31
 
31
32
  And, then run:
@@ -37,7 +38,7 @@ bundle install
37
38
 
38
39
  Run this command to get directly:
39
40
  ```
40
- gem install glimmer -v 0.1.5.470
41
+ gem install glimmer -v 0.1.8.470
41
42
  ```
42
43
 
43
44
  ## Usage
@@ -55,6 +56,10 @@ It downloads and sets up the SWT jar whether missing or not.
55
56
  Example 3: `glimmer --setup`
56
57
  This downloads and sets up the SWT jar whether missing or not.
57
58
 
59
+ ## Girb (Glimmer irb)
60
+
61
+ You may run girb instead of standard irb to have SWT preloaded and the Glimmer required and included for quick Glimmer coding/testing.
62
+
58
63
  ## Samples
59
64
 
60
65
  Check the "samples" folder for examples on how to write Glimmer applications.
data/Rakefile CHANGED
@@ -21,18 +21,17 @@ Jeweler::Tasks.new do |gem|
21
21
  gem.description = %Q{JRuby DSL that enables easy and efficient authoring of user-interfaces using the robust platform-independent Eclipse SWT library}
22
22
  gem.email = "andy.am@gmail.com"
23
23
  gem.authors = ["AndyMaleh"]
24
- gem.executables = ['glimmer']
24
+ gem.executables = ['glimmer', 'girb']
25
25
  # dependencies defined in Gemfile
26
26
  end
27
27
  Jeweler::RubygemsDotOrgTasks.new
28
28
 
29
- require 'rake/testtask'
30
- Rake::TestTask.new(:test) do |test|
31
- test.libs << 'lib' << 'samples' << 'test'
32
- test.pattern = 'test/**/*_test.rb'
33
- test.verbose = true
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
34
33
  additional_options = OS.mac? ? "-J-XstartOnFirstThread" : ""
35
- test.ruby_opts = ["#{additional_options} -J-classpath \"#{GlimmerApplication::SWT_JAR_FILE}\" -Xcli.debug=true --debug"]
34
+ spec.ruby_opts = ["#{additional_options} -J-classpath \"#{GlimmerApplication::SWT_JAR_FILE}\" -Xcli.debug=true --debug"]
36
35
  end
37
36
 
38
- task :default => :test
37
+ task :default => :spec
data/TODO.md CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  Here is a list of tasks to do (please delete once done):
4
4
 
5
- * Increase test coverage to 80% (debug failure of test suite despite passing tests)
6
5
  * Support Tree databinding
6
+ * Explore rewriting shine with Ruby 2 support
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5.470
1
+ 0.1.8.470
data/bin/girb ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ system "irb -r #{File.expand_path(File.join(__FILE__, '..', 'girb_runner.rb'))}"
@@ -0,0 +1,5 @@
1
+ require_relative '../lib/glimmer_application'
2
+ include Java
3
+ $CLASSPATH << GlimmerApplication::SWT_JAR_FILE
4
+ require_relative '../lib/glimmer'
5
+ include Glimmer
data/glimmer.gemspec CHANGED
@@ -2,24 +2,26 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer 0.1.5.470 ruby lib
5
+ # stub: glimmer 0.1.8.470 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer".freeze
9
- s.version = "0.1.5.470"
9
+ s.version = "0.1.8.470"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["AndyMaleh".freeze]
14
- s.date = "2017-07-22"
14
+ s.date = "2017-07-23"
15
15
  s.description = "JRuby DSL that enables easy and efficient authoring of user-interfaces using the robust platform-independent Eclipse SWT library".freeze
16
16
  s.email = "andy.am@gmail.com".freeze
17
- s.executables = ["glimmer".freeze]
17
+ s.executables = ["glimmer".freeze, "girb".freeze]
18
18
  s.extra_rdoc_files = [
19
19
  "LICENSE.txt",
20
20
  "README.markdown"
21
21
  ]
22
22
  s.files = [
23
+ ".coveralls.yml",
24
+ ".rspec",
23
25
  ".ruby-gemset",
24
26
  ".ruby-version",
25
27
  "Gemfile",
@@ -28,6 +30,8 @@ Gem::Specification.new do |s|
28
30
  "Rakefile",
29
31
  "TODO.md",
30
32
  "VERSION",
33
+ "bin/girb",
34
+ "bin/girb_runner.rb",
31
35
  "bin/glimmer",
32
36
  "glimmer.gemspec",
33
37
  "images/Bitter-sweet.jpg",
@@ -87,21 +91,21 @@ Gem::Specification.new do |s|
87
91
  "samples/login.rb",
88
92
  "samples/tictactoe/tic_tac_toe.rb",
89
93
  "samples/tictactoe/tic_tac_toe_board.rb",
90
- "test/glimmer_combo_data_binding_test.rb",
91
- "test/glimmer_constant_test.rb",
92
- "test/glimmer_data_binding_test.rb",
93
- "test/glimmer_list_data_binding_test.rb",
94
- "test/glimmer_listeners_test.rb",
95
- "test/glimmer_shine_data_binding_test.rb",
96
- "test/glimmer_tab_item_test.rb",
97
- "test/glimmer_table_data_binding_test.rb",
98
- "test/glimmer_test.rb",
99
- "test/helper.rb",
100
- "test/observable_model_test.rb",
101
- "test/r_widget_test.rb",
102
- "test/samples/contactmanager/contact_manager_presenter_test.rb",
103
- "test/samples/tictactoe/tic_tac_toe_test.rb",
104
- "test/xml/glimmer_xml_test.rb"
94
+ "spec/lib/command_handlers/models/observable_model_spec.rb",
95
+ "spec/lib/command_handlers/models/r_widget_spec.rb",
96
+ "spec/lib/glimmer__combo_data_binding__spec.rb",
97
+ "spec/lib/glimmer__constant__spec.rb",
98
+ "spec/lib/glimmer__data_binding__spec.rb",
99
+ "spec/lib/glimmer__list_data_binding__spec.rb",
100
+ "spec/lib/glimmer__listeners__spec.rb",
101
+ "spec/lib/glimmer__shine_data_binding__spec.rb",
102
+ "spec/lib/glimmer__tab_item__spec.rb",
103
+ "spec/lib/glimmer__table_data_binding__spec.rb",
104
+ "spec/lib/glimmer_spec.rb",
105
+ "spec/lib/xml/glimmer_xml_spec.rb",
106
+ "spec/samples/contactmanager/contact_manager_presenter_spec.rb",
107
+ "spec/samples/tictactoe/tic_tac_toe_spec.rb",
108
+ "spec/spec_helper.rb"
105
109
  ]
106
110
  s.homepage = "http://github.com/AndyObtiva/glimmer".freeze
107
111
  s.licenses = ["MIT".freeze]
@@ -114,6 +118,8 @@ Gem::Specification.new do |s|
114
118
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
115
119
  s.add_runtime_dependency(%q<facets>.freeze, ["= 3.1.0"])
116
120
  s.add_runtime_dependency(%q<os>.freeze, ["= 1.0.0"])
121
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
122
+ s.add_development_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
117
123
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
118
124
  s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
119
125
  s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
@@ -123,6 +129,8 @@ Gem::Specification.new do |s|
123
129
  else
124
130
  s.add_dependency(%q<facets>.freeze, ["= 3.1.0"])
125
131
  s.add_dependency(%q<os>.freeze, ["= 1.0.0"])
132
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
133
+ s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
126
134
  s.add_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
127
135
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
128
136
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
@@ -133,6 +141,8 @@ Gem::Specification.new do |s|
133
141
  else
134
142
  s.add_dependency(%q<facets>.freeze, ["= 3.1.0"])
135
143
  s.add_dependency(%q<os>.freeze, ["= 1.0.0"])
144
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
145
+ s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
136
146
  s.add_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
137
147
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
138
148
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
@@ -37,8 +37,7 @@ class GlimmerApplication
37
37
 
38
38
  if application
39
39
  puts "Starting Glimmer Application #{application}"
40
- additional_options
41
- `ruby #{additional_options} -J-classpath "#{SWT_JAR_FILE}" #{application}`
40
+ system "ruby #{additional_options} -J-classpath \"#{SWT_JAR_FILE}\" #{application}"
42
41
  end
43
42
  end
44
43
 
data/lib/shine.rb CHANGED
@@ -1,21 +1,23 @@
1
- require File.dirname(__FILE__) + "/glimmer"
2
-
3
- class Array
4
- include Glimmer
5
-
6
- alias original_compare <=>
7
-
8
- def <=>(other)
9
- if (self[0].class.name == "RWidget")
10
- add_contents(self[0]) {
11
- if (other.size == 2)
12
- eval("#{self[1]} bind (other[0], other[1])")
13
- elsif (other.size == 3)
14
- eval("#{self[1]} bind (other[0], other[1], other[2])")
15
- end
16
- }
17
- else
18
- original_compare(other)
19
- end
20
- end
21
- end
1
+ ## NOTE: Unsupported in Ruby 2 syntax
2
+ #
3
+ # require File.dirname(__FILE__) + "/glimmer"
4
+ #
5
+ # class Array
6
+ # include Glimmer
7
+ #
8
+ # alias original_compare <=>
9
+ #
10
+ # def <=>(other)
11
+ # if (self[0].class.name == "RWidget")
12
+ # add_contents(self[0]) {
13
+ # if (other.size == 2)
14
+ # eval("#{self[1]} bind (other[0], other[1])")
15
+ # elsif (other.size == 3)
16
+ # eval("#{self[1]} bind (other[0], other[1], other[2])")
17
+ # end
18
+ # }
19
+ # else
20
+ # original_compare(other)
21
+ # end
22
+ # end
23
+ # end
@@ -3,9 +3,9 @@ require File.dirname(__FILE__) + "/xml_visitor"
3
3
 
4
4
  class Node
5
5
  include Parent, Glimmer
6
-
6
+
7
7
  attr_accessor :children, :name, :contents, :attributes, :is_name_space, :is_attribute, :name_space, :parent
8
-
8
+
9
9
  def initialize(parent, name, attributes, &contents)
10
10
  @is_name_space = false
11
11
  @children = []
@@ -21,35 +21,35 @@ class Node
21
21
  if @attributes
22
22
  @attributes.each_key do |attribute|
23
23
  if attribute.is_a?(Node)
24
- attribute.is_attribute = true
24
+ attribute.is_attribute = true
25
25
  attribute.parent.children.delete(attribute) if attribute.parent
26
26
  attribute.parent = nil #attributes do not usually have parents
27
27
  end
28
28
  end
29
- p attributes
29
+ Glimmer.logger.debug(attributes)
30
30
  end
31
31
  end
32
-
32
+
33
33
  def method_missing(symbol, *args, &block)
34
34
  @is_name_space = true
35
35
  parent.children.delete(self) if parent
36
36
  Glimmer.add_contents(self) {@tag = super}
37
37
  @tag
38
38
  end
39
-
39
+
40
40
  def to_xml
41
41
  xml_visitor = XmlVisitor.new
42
42
  DepthFirstSearchIterator.new(self, xml_visitor).iterate
43
43
  xml_visitor.document
44
44
  end
45
-
45
+
46
46
  def process_block(block)
47
47
  return_value = block.call(@widget)
48
48
  if return_value.is_a?(String) and !@children.include?(return_value)
49
49
  text = return_value
50
50
  first_match = text.match(/[#][^{]+[{][^}]+[}]/)
51
51
  match = first_match
52
- while (match)
52
+ while (match)
53
53
  Glimmer.module_eval(text_command(match.pre_match))
54
54
  tag_text = match.to_s
55
55
  Glimmer.module_eval(rubyize(tag_text))
@@ -61,11 +61,11 @@ class Node
61
61
  @children << return_value unless first_match
62
62
  end
63
63
  end
64
-
64
+
65
65
  def text_command(text)
66
66
  "text \"#{text}\""
67
67
  end
68
-
68
+
69
69
  def rubyize(text)
70
70
  text = text.gsub(/[}]/, '"}')
71
71
  text = text.gsub(/[{]/, '{"')
@@ -76,5 +76,5 @@ class Node
76
76
  def id
77
77
  method_missing(:id)
78
78
  end
79
-
79
+
80
80
  end
@@ -1,13 +1,13 @@
1
1
  require File.dirname(__FILE__) + "/node_visitor"
2
2
 
3
3
  class XmlVisitor < NodeVisitor
4
-
4
+
5
5
  attr_reader :document
6
-
6
+
7
7
  def initialize
8
8
  @document = ""
9
9
  end
10
-
10
+
11
11
  def process_before_children(node)
12
12
  if (node.is_a?(String))
13
13
  @document << node
@@ -17,27 +17,27 @@ class XmlVisitor < NodeVisitor
17
17
  append_attributes(node) if node.attributes
18
18
  end_open_tag(node)
19
19
  end
20
-
20
+
21
21
  def process_after_children(node)
22
22
  return if (node.is_a?(String))
23
23
  append_close_tag(node)
24
24
  end
25
-
25
+
26
26
  def begin_open_tag(node)
27
27
  @document << "<"
28
28
  @document << "#{node.name_space.name}:" if node.name_space
29
29
  @document << node.name
30
30
  end
31
-
31
+
32
32
  def end_open_tag(node)
33
- if (node.contents)
33
+ if (node.contents)
34
34
  @document << ">"
35
35
  else
36
36
  @document << " " if node.attributes.keys.size > 0
37
37
  @document << "/>"
38
38
  end
39
39
  end
40
-
40
+
41
41
  def append_close_tag(node)
42
42
  if (node.contents)
43
43
  @document << "</"
@@ -45,15 +45,15 @@ class XmlVisitor < NodeVisitor
45
45
  @document << "#{node.name}>"
46
46
  end
47
47
  end
48
-
48
+
49
49
  def append_attributes(node)
50
50
  Glimmer.logger.debug "Take 3"
51
- p node.attributes
51
+ Glimmer.logger.debug(node.attributes)
52
52
  node.attributes.each_key do |attribute|
53
53
  attribute_name = attribute
54
54
  attribute_name = "#{attribute.name_space.name}:#{attribute.name}" if attribute.is_a?(Node)
55
55
  @document << " #{attribute_name}=\"#{node.attributes[attribute]}\""
56
56
  end
57
57
  end
58
-
59
- end
58
+
59
+ end
@@ -3,20 +3,20 @@ require_relative "tic_tac_toe_board"
3
3
 
4
4
 
5
5
  class TicTacToe
6
-
6
+
7
7
  include_package 'org.eclipse.swt'
8
8
  include_package 'org.eclipse.swt.widgets'
9
9
  include_package 'org.eclipse.swt.layout'
10
-
10
+
11
11
  include Glimmer
12
12
 
13
13
  def initialize
14
14
  @tic_tac_toe_board = TicTacToeBoard.new
15
- @main =
15
+ @main =
16
16
  @shell = shell {
17
17
  text "Tic-Tac-Toe"
18
18
  composite {
19
- layout GridLayout.new(3,true)
19
+ layout GridLayout.new(3,true)
20
20
  (1..3).each { |row_number|
21
21
  (1..3).each { |column_number|
22
22
  button {
@@ -34,20 +34,20 @@ class TicTacToe
34
34
  @tic_tac_toe_board.extend(ObservableModel) #make board an observable model
35
35
  @tic_tac_toe_board.add_observer("game_status", self)
36
36
  end
37
-
38
- def update(game_status)
37
+
38
+ def update(game_status)
39
39
  display_win_message if game_status == TicTacToeBoard::WIN
40
40
  display_draw_message if game_status == TicTacToeBoard::DRAW
41
41
  end
42
-
42
+
43
43
  def display_win_message()
44
44
  display_game_over_message("Player #{@tic_tac_toe_board.winning_sign} has won!")
45
45
  end
46
-
46
+
47
47
  def display_draw_message()
48
48
  display_game_over_message("Draw!")
49
49
  end
50
-
50
+
51
51
  def display_game_over_message(message)
52
52
  message_box = MessageBox.new(@shell.widget)
53
53
  message_box.setText("Game Over")
@@ -55,9 +55,9 @@ class TicTacToe
55
55
  message_box.open
56
56
  @tic_tac_toe_board.reset
57
57
  end
58
-
58
+
59
59
  def open
60
- @main.open
60
+ @main.open
61
61
  end
62
62
  end
63
63