weskit 0.0.2 → 0.1.0

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.
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