weskit 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +4 -3
  2. data/.rspec +1 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +2 -2
  5. data/LICENSE +339 -0
  6. data/README.md +135 -0
  7. data/Rakefile +4 -0
  8. data/lib/weskit/mp/adapter.rb +81 -0
  9. data/lib/weskit/mp/connection.rb +74 -0
  10. data/lib/weskit/mp/errors/error.rb +3 -0
  11. data/lib/weskit/mp/errors/response_error.rb +3 -0
  12. data/lib/weskit/mp/worker.rb +35 -0
  13. data/lib/weskit/mp.rb +13 -0
  14. data/lib/weskit/version.rb +1 -1
  15. data/lib/weskit/wml/attribute.rb +65 -0
  16. data/lib/weskit/wml/attributes.rb +16 -0
  17. data/lib/weskit/wml/builder.rb +66 -0
  18. data/lib/weskit/wml/element.rb +34 -0
  19. data/lib/weskit/wml/elements.rb +27 -0
  20. data/lib/weskit/wml/errors/error.rb +3 -0
  21. data/lib/weskit/wml/errors/invalid_identifier.rb +3 -0
  22. data/lib/weskit/wml/errors/invalid_item.rb +3 -0
  23. data/lib/weskit/wml/errors/invalid_option.rb +3 -0
  24. data/lib/weskit/wml/errors/invalid_parameters.rb +3 -0
  25. data/lib/weskit/wml/errors/parse_error.rb +3 -0
  26. data/lib/weskit/wml/errors/read_error.rb +3 -0
  27. data/lib/weskit/wml/extensions/object.rb +19 -0
  28. data/lib/weskit/wml/formatter.rb +82 -0
  29. data/lib/weskit/wml/formatters/ansi_color.rb +49 -0
  30. data/lib/weskit/wml/formatters/ansi_color_attribute.rb +31 -0
  31. data/lib/weskit/wml/formatters/ansi_color_element.rb +22 -0
  32. data/lib/weskit/wml/formatters/attribute.rb +62 -0
  33. data/lib/weskit/wml/formatters/element.rb +44 -0
  34. data/lib/weskit/wml/formatters/item_formatter.rb +17 -0
  35. data/lib/weskit/wml/grammars/wml.treetop +195 -0
  36. data/lib/weskit/wml/item.rb +89 -0
  37. data/lib/weskit/wml/items.rb +29 -0
  38. data/lib/weskit/wml/mixins/container.rb +96 -0
  39. data/lib/weskit/wml/mixins/grammar.rb +17 -0
  40. data/lib/weskit/wml/mixins/searchable.rb +43 -0
  41. data/lib/weskit/wml/mixins/validator.rb +29 -0
  42. data/lib/weskit/wml/parser.rb +47 -0
  43. data/lib/weskit/wml/root.rb +17 -0
  44. data/lib/weskit/wml/wml.rb +1580 -0
  45. data/lib/weskit/wml.rb +12 -6
  46. data/lib/weskit.rb +2 -2
  47. data/spec/spec_helper.rb +1 -0
  48. data/spec/wml/attribute_spec.rb +51 -0
  49. data/spec/wml/attributes_spec.rb +19 -0
  50. data/spec/wml/builder_spec.rb +52 -0
  51. data/spec/wml/element_spec.rb +20 -0
  52. data/spec/wml/elements_spec.rb +25 -0
  53. data/spec/wml/formatter_spec.rb +42 -0
  54. data/spec/wml/item_spec.rb +25 -0
  55. data/spec/wml/items_spec.rb +15 -0
  56. data/spec/wml/parser_spec.rb +60 -0
  57. data/spec/wml/root_spec.rb +15 -0
  58. data/spec/wml_helpers.rb +40 -0
  59. data/spec/wml_matchers.rb +17 -0
  60. data/spec/wml_shared_examples.rb +68 -0
  61. data/spec/wml_spec_helper.rb +5 -0
  62. data/weskit.gemspec +8 -5
  63. metadata +192 -50
  64. data/README +0 -2
  65. data/lib/weskit/lobby/bot.rb +0 -85
  66. data/lib/weskit/lobby/bot_error.rb +0 -3
  67. data/lib/weskit/lobby.rb +0 -11
  68. data/lib/weskit/wml/node.rb +0 -76
  69. data/lib/weskit/wml/node_array.rb +0 -25
  70. data/lib/weskit/wml/node_error.rb +0 -3
  71. data/lib/weskit/wml/reader.rb +0 -67
  72. data/lib/weskit/wml/reader_error.rb +0 -3
  73. data/lib/weskit/wml/string_extensions.rb +0 -59
data/lib/weskit/wml.rb CHANGED
@@ -1,11 +1,17 @@
1
+ require 'weskit/version'
2
+
1
3
  module Weskit
2
4
  module WML
5
+ def self.require_all files, folder = nil
6
+ folder = (folder.to_s || '') + '/'
7
+ files.collect {|file| require "weskit/wml/#{folder}#{file}"}
8
+ end
3
9
  end
4
10
  end
5
11
 
6
- directory = File.dirname __FILE__
7
- files = File.join directory, 'wml', '*.rb'
8
-
9
- Dir[files].each do |file|
10
- require file
11
- end
12
+ w = Weskit::WML
13
+ w.require_all %w{validator grammar searchable container}, :mixins
14
+ w.require_all %w{object}, :extensions
15
+ w.require_all %w{error invalid_identifier invalid_item invalid_option invalid_parameters parse_error read_error}, :errors
16
+ w.require_all %w{item_formatter attribute element ansi_color ansi_color_attribute ansi_color_element}, :formatters
17
+ w.require_all %w{item items attribute attributes builder element elements formatter wml parser root}
data/lib/weskit.rb CHANGED
@@ -1,3 +1,3 @@
1
- require 'weskit/lobby'
1
+ require 'weskit/mp'
2
2
  require 'weskit/version'
3
- require 'weskit/wml'
3
+ require 'weskit/wml'
@@ -0,0 +1 @@
1
+ require 'weskit'
@@ -0,0 +1,51 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Attribute do
4
+ include WMLHelpers
5
+
6
+ let(:attribute) { Weskit::WML::Attribute.new :foo, :bar }
7
+
8
+ it 'should change code to false when setting translatable to true' do
9
+ attribute.should_not be_code
10
+ attribute.should_not be_translatable
11
+
12
+ attribute.code = true
13
+
14
+ attribute.should be_code
15
+ attribute.should_not be_translatable
16
+
17
+ attribute.translatable = true
18
+
19
+ attribute.should_not be_code
20
+ attribute.should be_translatable
21
+ end
22
+
23
+ it 'should change translatable to false when setting code to true' do
24
+ attribute.should_not be_code
25
+ attribute.should_not be_translatable
26
+
27
+ attribute.translatable = true
28
+
29
+ attribute.should_not be_code
30
+ attribute.should be_translatable
31
+
32
+ attribute.code = true
33
+
34
+ attribute.should be_code
35
+ attribute.should_not be_translatable
36
+ end
37
+
38
+ it 'should respond to predicates' do
39
+ attr1 = attribute.dup.merge :code => true
40
+ attr2 = attribute.dup.merge :translatable => true
41
+ attr3 = Weskit::WML::Attribute.new :bar, "baz \n bat"
42
+
43
+ attr1.should be_code
44
+ attr2.should be_translatable
45
+ attr3.should be_multiline
46
+
47
+ attr1.should be_text
48
+ attr2.should be_text
49
+ attr3.should be_text
50
+ end
51
+ end
@@ -0,0 +1,19 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Attributes do
4
+ include WMLHelpers
5
+
6
+ let(:attribute) { Weskit::WML::Attribute.new :foo, :bar }
7
+ let(:attributes) { Weskit::WML::Attributes.new }
8
+
9
+ it 'has hash like access' do
10
+ attributes << attribute
11
+ attributes[:foo].should match_value_of(:bar)
12
+ attributes[:foo].attribute.should have_same_representation_as(attribute)
13
+ end
14
+
15
+ it 'store attributes only' do
16
+ expect { attributes.push attribute }.to change { attributes.size }.from(0).to(1)
17
+ expect { attributes.push :boo }.to raise_error(Weskit::WML::Errors::InvalidItem)
18
+ end
19
+ end
@@ -0,0 +1,52 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Builder do
4
+ include WMLHelpers
5
+
6
+ let(:element) { Weskit::WML::Element.new :foo }
7
+
8
+ specify 'builds attributes' do
9
+ reference = Weskit::WML::Element.new(:foo) \
10
+ << Weskit::WML::Attribute.new(:bar, :foo) \
11
+ << Weskit::WML::Attribute.new(:baz, :foo, :code => true) \
12
+ << Weskit::WML::Attribute.new(:bat, :foo, :translatable => true)
13
+
14
+ element.build do
15
+ bar :foo
16
+ baz :foo, :code => true
17
+ bat :foo, :translatable => true
18
+ end
19
+
20
+ element.should have_same_representation_as(reference)
21
+ end
22
+
23
+ specify 'builds elements' do
24
+ reference = Weskit::WML::Element.new(:foo) \
25
+ << Weskit::WML::Element.new(:baz) \
26
+ << Weskit::WML::Element.new(:bar) \
27
+ << sample_amendment
28
+
29
+ element.build do
30
+ baz {}
31
+ bar {}
32
+ bar :amendment => true do
33
+ bat :baz
34
+ end
35
+ end
36
+
37
+ element.should have_same_representation_as(reference)
38
+ end
39
+
40
+ specify 'convert hashes' do
41
+ hash = {
42
+ :a => :foo,
43
+ :b => {
44
+ :c => :bar
45
+ }
46
+ }
47
+
48
+ converted = Weskit::WML::Builder.convert hash
49
+ converted[:a].should match_value_of(:foo)
50
+ converted.elements[:c].should match_value_of(:bar)
51
+ end
52
+ end
@@ -0,0 +1,20 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Element do
4
+ include WMLHelpers
5
+
6
+ let(:element) { Weskit::WML::Element.new :foo }
7
+
8
+ it_should_behave_like 'a container' do
9
+ let(:container) { element }
10
+ end
11
+
12
+ it_should_behave_like 'a searchable' do
13
+ let(:searchable) { element }
14
+ end
15
+
16
+ it 'can be amending element' do
17
+ element = Weskit::WML::Element.new :foo, :amendment => true
18
+ element.should be_amendment
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Elements do
4
+ include WMLHelpers
5
+
6
+ let(:element) { Weskit::WML::Element.new :foo }
7
+ let(:elements) { Weskit::WML::Elements.new }
8
+
9
+ it_should_behave_like 'a searchable' do
10
+ let(:searchable) { elements }
11
+ end
12
+
13
+ it 'has hash like access' do
14
+ element = Weskit::WML::Element.new(:foo).push Weskit::WML::Attribute.new(:bat, :baz)
15
+ elements.push element
16
+
17
+ elements[0].should be(element)
18
+ elements[:bat].should match_value_of(:baz)
19
+ end
20
+
21
+ it 'store elements only' do
22
+ expect { elements.push element }.to change { elements.size }.from(0).to(1)
23
+ expect { elements.push :boo }.to raise_error(Weskit::WML::Errors::InvalidItem)
24
+ end
25
+ end
@@ -0,0 +1,42 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Formatter do
4
+ include WMLHelpers
5
+
6
+ subject { Weskit::WML::Formatter.default }
7
+
8
+ let(:formatter) { subject }
9
+
10
+ specify 'can be initialized as color default or pain' do
11
+ Weskit::WML::Formatter.color.should be_kind_of(Weskit::WML::Formatter)
12
+ Weskit::WML::Formatter.default.should be_kind_of(Weskit::WML::Formatter)
13
+ Weskit::WML::Formatter.plain.should be_kind_of(Weskit::WML::Formatter)
14
+ end
15
+
16
+ specify 'default formatter can be replaced' do
17
+ default = Weskit::WML::Formatter.default
18
+ expect { Weskit::WML::Formatter.default = Weskit::WML::Formatter.color }.to change {
19
+ Weskit::WML::Formatter.default
20
+ }.from(Weskit::WML::Formatter.plain).to(Weskit::WML::Formatter.color)
21
+ Weskit::WML::Formatter.default = default
22
+ end
23
+
24
+ context 'plain' do
25
+ it 'formatts attributes' do
26
+ formatted = formatter.format Weskit::WML::Attribute.new(:foo, 'bar')
27
+ formatted.should eq('foo=bar')
28
+
29
+ formatted = formatter.format Weskit::WML::Attribute.new(:foo, 'bar', :code => true)
30
+ formatted.should eq('foo=<<bar>>')
31
+
32
+ formatted = formatter.format Weskit::WML::Attribute.new(:foo, 'bar', :translatable => true)
33
+ formatted.should eq('foo=_"bar"')
34
+ end
35
+
36
+ it 'formatts elements' do
37
+ element = Weskit::WML::Element.new :foo
38
+ formatted = formatter.format element
39
+ formatter.format(element).should have_same_representation_as(element)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Item do
4
+ include WMLHelpers
5
+
6
+ let(:item) { Weskit::WML::Item.new :foo }
7
+
8
+ it 'should compare items by name or class' do
9
+ bat = Weskit::WML::Item.new :bat
10
+
11
+ (item <=> bat).should eq(1)
12
+ (bat <=> item).should eq(-1)
13
+
14
+ bat = Weskit::WML::Element.new :bat
15
+
16
+ (item <=> bat).should eq(1)
17
+ (bat <=> item).should eq(-1)
18
+
19
+ (item <=> :bat).should be_nil
20
+ end
21
+
22
+ it 'should have name that is identifier' do
23
+ item.should have_identifier_of(:foo)
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Items do
4
+ include WMLHelpers
5
+
6
+ let(:items) { Weskit::WML::Items.new }
7
+
8
+ it_should_behave_like 'a container' do
9
+ let(:container) { items }
10
+ end
11
+
12
+ it 'has contents formatter' do
13
+ expect { items.formatter = Weskit::WML::Formatter.color }.to change { items.formatter }.from(Weskit::WML::Formatter.default).to(Weskit::WML::Formatter.color)
14
+ end
15
+ end
@@ -0,0 +1,60 @@
1
+ require 'wml_spec_helper'
2
+ require 'awesome_print'
3
+
4
+ describe Weskit::WML::Parser do
5
+ include WMLHelpers
6
+
7
+ describe 'parse' do
8
+ specify 'empty lines' do
9
+ Weskit::WML::Parser.string document_with_empty_lines
10
+ end
11
+
12
+ context 'attribute' do
13
+ specify 'raw' do
14
+ parsed = Weskit::WML::Parser.string 'a=b'
15
+ parsed[:a].should match_value_of(:b)
16
+ end
17
+
18
+ specify 'code' do
19
+ parsed = Weskit::WML::Parser.string ' a= <<b>> '
20
+ parsed[:a].attribute.should be_code
21
+ parsed[:a].should match_value_of(:b)
22
+ end
23
+
24
+ specify 'multiline' do
25
+ parsed = Weskit::WML::Parser.string %Q{a= "b \n c"}
26
+ parsed[:a].attribute.should be_multiline
27
+ parsed[:a].should match_value_of("b \n c")
28
+ end
29
+
30
+ specify 'escape sequence' do
31
+ parsed = Weskit::WML::Parser.string %Q{ a= "b "" c" }
32
+ parsed[:a].should match_value_of('b " c')
33
+ end
34
+
35
+ specify 'translatable' do
36
+ parsed = Weskit::WML::Parser.string ' a= _ "b" '
37
+ parsed[:a].attribute.should be_translatable
38
+ parsed[:a].should match_value_of(:b)
39
+ end
40
+ end
41
+
42
+ context 'element' do
43
+ specify 'tags' do
44
+ expect {
45
+ Weskit::WML::Parser.string "[foo]\n[/bar]"
46
+ }.to raise_error Weskit::WML::Errors::ParseError
47
+ end
48
+
49
+ specify 'default' do
50
+ parsed = Weskit::WML::Parser.string "[foo]\n[/foo]"
51
+ parsed[0].should have_identifier_of(:foo)
52
+ end
53
+
54
+ specify 'amending' do
55
+ parsed = Weskit::WML::Parser.string document_with_amendment
56
+ parsed[0][:bat].should match_value_of(:baz)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,15 @@
1
+ require 'wml_spec_helper'
2
+
3
+ describe Weskit::WML::Root do
4
+ include WMLHelpers
5
+
6
+ let(:root) { Weskit::WML::Root.new }
7
+
8
+ it_should_behave_like 'a container' do
9
+ let(:container) { root }
10
+ end
11
+
12
+ it_should_behave_like 'a searchable' do
13
+ let(:searchable) { root }
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module WMLHelpers
2
+ def sample_amendment
3
+ e = Weskit::WML::Element.new :bar, :amendment => true
4
+ e.push Weskit::WML::Attribute.new :bat, :baz
5
+ end
6
+
7
+ def document_with_amendment
8
+ <<-doc
9
+ [foo]
10
+ [/foo]
11
+ [+foo]
12
+ bat=baz
13
+ [/foo]
14
+ doc
15
+ end
16
+
17
+ def document_with_empty_lines
18
+ <<-doc
19
+
20
+ [a]
21
+ b=c
22
+ [/a]
23
+
24
+ [d]
25
+
26
+ e=f
27
+
28
+ [/d]
29
+
30
+ doc
31
+ end
32
+
33
+ def sample_elements
34
+ a = Weskit::WML::Element.new :a
35
+ b = Weskit::WML::Element.new :b
36
+ c = Weskit::WML::Element.new :c
37
+ d = Weskit::WML::Element.new :d
38
+ a << (b.push c, d)
39
+ end
40
+ end
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :have_identifier_of do |name|
2
+ match do |actual|
3
+ actual.name == Weskit::WML::Item.identifier(name)
4
+ end
5
+ end
6
+
7
+ RSpec::Matchers.define :have_same_representation_as do |other|
8
+ match do |actual|
9
+ actual.to_s == other.to_s
10
+ end
11
+ end
12
+
13
+ RSpec::Matchers.define :match_value_of do |value|
14
+ match do |actual|
15
+ actual.to_s == value.to_s
16
+ end
17
+ end
@@ -0,0 +1,68 @@
1
+ shared_examples_for 'a container' do
2
+ it 'can delete stored item' do
3
+ container << (element = Weskit::WML::Element.new :foo)
4
+ expect { container.delete element }.to change { container.contents.size }.by(-1)
5
+ end
6
+
7
+ it 'can determine if item exists' do
8
+ container << (element = Weskit::WML::Element.new :foo)
9
+ container.exists?(element).should be_true
10
+ end
11
+
12
+ it 'expose attrs and elems' do
13
+ container << Weskit::WML::Attribute.new(:foo, :bar)
14
+ container << Weskit::WML::Element.new(:baz)
15
+
16
+ container.should have(2).contents
17
+ container.should have(1).attrs
18
+ container.should have(1).elems
19
+ end
20
+
21
+ it 'expose contents methods' do
22
+ %w{each empty? first last size to_a}.each do |method|
23
+ container.should respond_to(method)
24
+ end
25
+ end
26
+
27
+ it 'has associated builder' do
28
+ container.build do
29
+ key :foo
30
+ name {}
31
+ end
32
+
33
+ container[:key].should match_value_of(:foo)
34
+ container[0].should have_same_identifier_as(:name)
35
+ end
36
+
37
+ it 'has hash like access' do
38
+ container << (attribute = Weskit::WML::Attribute.new :foo, :bar)
39
+ container << (element = Weskit::WML::Element.new :baz)
40
+
41
+ container[:foo].should match_value_of(:bar)
42
+ container[0].should have_same_representation_as(element)
43
+ end
44
+ end
45
+
46
+ shared_examples_for 'a searchable' do
47
+ specify 'append amending elements' do
48
+ searchable << Weskit::WML::Element.new(:bar)
49
+ searchable << sample_amendment
50
+
51
+ searchable.should have(1).elems
52
+ searchable.find(:bar, false)[:bat].should match_value_of(:baz)
53
+ end
54
+
55
+ specify 'finds nested elements' do
56
+ searchable << sample_elements
57
+ searchable.find(:a, false).find(:b).find(:c).size.should eq(1)
58
+ end
59
+
60
+ specify 'finds elements recursively' do
61
+ searchable << sample_elements
62
+ searchable << Weskit::WML::Element.new(:b)
63
+
64
+ searchable.find_recursively do |item|
65
+ item.name == :b
66
+ end.size.should eq(2)
67
+ end
68
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ require 'wml_helpers'
4
+ require 'wml_matchers'
5
+ require 'wml_shared_examples'
data/weskit.gemspec CHANGED
@@ -9,16 +9,19 @@ Gem::Specification.new do |s|
9
9
  s.email = ['filip.pyda@gmail.com']
10
10
  s.homepage = 'https://github.com/f6p/weskit'
11
11
  s.summary = 'Ruby utilies for BfW'
12
- s.description = 'Pls do me a favor and do not look at sources if you dont have to. Thx!'
12
+ s.description = 'Tools for interacting with Wesnoth Markup Language, MP Server and such.'
13
13
 
14
14
  # s.rubyforge_project = 'weskit'
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename f }
19
19
  s.require_paths = ['lib']
20
20
 
21
- # specify any dependencies here; for example:
22
- # s.add_development_dependency 'rspec'
23
- # s.add_runtime_dependency 'rest-client'
21
+ s.add_development_dependency 'awesome_print'
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'rspec'
24
+ s.add_runtime_dependency 'polyglot'
25
+ s.add_runtime_dependency 'term-ansicolor'
26
+ s.add_runtime_dependency 'treetop'
24
27
  end