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
@@ -0,0 +1,35 @@
1
+ require 'forwardable'
2
+
3
+ module Weskit::MP
4
+ class Worker
5
+ extend Forwardable
6
+
7
+ attr_reader :debug, :nickname
8
+ def_delegators :@connection, :message, :read, :write
9
+
10
+ def connect_and &operate
11
+ @connection.open do
12
+ instance_eval &operate
13
+ end
14
+ end
15
+
16
+ def initialize nickname
17
+ @connection = Connection.new self
18
+ @nickname = nickname
19
+ end
20
+
21
+ def login
22
+ message 'login', {:selective_ping => 1, :username => @nickname}
23
+ read ; verify_response :mustlogin
24
+ read ; verify_response :join_lobby
25
+ end
26
+
27
+ def verify_response element
28
+ element = @connection.buffer.find(element).first
29
+
30
+ unless element
31
+ raise Errors::ResponseError, "Server send node other than '#{element}'"
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/weskit/mp.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'weskit/version'
2
+ require 'weskit/wml'
3
+
4
+ module Weskit
5
+ module MP
6
+ end
7
+ end
8
+
9
+ require 'weskit/mp/errors/error'
10
+ require 'weskit/mp/errors/response_error'
11
+ require 'weskit/mp/adapter'
12
+ require 'weskit/mp/connection'
13
+ require 'weskit/mp/worker'
@@ -1,3 +1,3 @@
1
1
  module Weskit
2
- VERSION = "0.0.2"
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,65 @@
1
+ require 'observer'
2
+
3
+ module Weskit::WML
4
+ class Attribute < Item
5
+ include Observable
6
+
7
+ attachable_to :element
8
+
9
+ attr_reader :value
10
+
11
+ def code= bool
12
+ @code = bool ? (@translatable = false ; true) : false
13
+ end
14
+
15
+ def code?
16
+ @code
17
+ end
18
+
19
+ def multiline?
20
+ "#{value}".include? "\n"
21
+ end
22
+
23
+ def text?
24
+ code? or multiline? or translatable?
25
+ end
26
+
27
+ def translatable= bool
28
+ @translatable = bool ? (@code = false ; true) : false
29
+ end
30
+
31
+ def translatable?
32
+ @translatable
33
+ end
34
+
35
+ def initialize name, value, defaults = {}
36
+ @code = @translatable = false
37
+
38
+ self.name = name
39
+ self.value = value
40
+
41
+ merge defaults
42
+ end
43
+
44
+ def value= object
45
+ @value = convert object
46
+ end
47
+
48
+ private
49
+
50
+ def convert object
51
+ string = object.to_s.strip
52
+
53
+ object = case string
54
+ when %r{^nil|null$} then nil
55
+ when %r{^true|yes$} then true
56
+ when %r{^false|no$} then false
57
+ when %r{^[0-9]*\.[0-9]+$} then Float string
58
+ when %r{^[0-9]+$} then Integer string
59
+ else string
60
+ end
61
+
62
+ object.attr = self ; object
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,16 @@
1
+ module Weskit::WML
2
+ class Attributes < Items
3
+ undef_method :attrs, :attributes
4
+ undef_method :elems, :elements
5
+
6
+ def [] name
7
+ name = ::Weskit::WML::Item.identifier name
8
+ attribute(name).value
9
+ end
10
+
11
+ def << item
12
+ append_attribute item
13
+ self
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,66 @@
1
+ module Weskit::WML
2
+ class Builder
3
+ private_class_method :new
4
+
5
+ def attribute name, value, defaults = nil
6
+ a = Attribute.new name, value, defaults || {}
7
+ @built << a ; a
8
+ end
9
+
10
+ def create &contents
11
+ instance_eval &contents ; @built
12
+ end
13
+
14
+ def element name, defaults = nil
15
+ e = Element.new name, defaults || {}
16
+ @built << e ; e
17
+ end
18
+
19
+ def id value
20
+ attribute :id, value
21
+ end
22
+
23
+ def initialize
24
+ @built = []
25
+ end
26
+
27
+ def method_missing *params
28
+ p = params
29
+ unless block_given?
30
+ raise_invalid_count if p.size < 2
31
+ attribute p[0], p[1], p[2]
32
+ else
33
+ raise_invalid_count if p.size < 1
34
+ element(p[0], p[1]).build &Proc.new
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def raise_invalid_count
41
+ raise Errors::InvalidParameters, "Invalid number of parameters"
42
+ end
43
+
44
+ class << self
45
+ def build &contents
46
+ new.create &contents
47
+ end
48
+
49
+ def convert hash
50
+ root = Root.new
51
+
52
+ hash.each do |k, v|
53
+ if v.is_a? Hash
54
+ e = Element.new k
55
+ e.push *Builder.convert(v)
56
+ root << e
57
+ else
58
+ root << Attribute.new(k, v)
59
+ end
60
+ end
61
+
62
+ root
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,34 @@
1
+ module Weskit::WML
2
+ class Element < Item
3
+ include Mixins::Container, Mixins::Searchable, Mixins::Validator
4
+
5
+ attachable_to :parent
6
+
7
+ attr_reader :contents
8
+
9
+ def << item
10
+ (append? item) ? append(item) : add(item)
11
+ item.attach_to self
12
+ self
13
+ end
14
+
15
+ def amendment= bool
16
+ @amendment = bool ? true : false
17
+ end
18
+
19
+ def amendment?
20
+ @amendment
21
+ end
22
+
23
+ def find name, nested = false
24
+ find_elements name, nested
25
+ end
26
+
27
+ alias_method :method_missing, :find
28
+
29
+ def initialize name, defaults = {}
30
+ @amendment, @contents = false, []
31
+ super
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ module Weskit::WML
2
+ class Elements < Items
3
+ include Mixins::Container, Mixins::Searchable
4
+
5
+ undef_method :attrs, :attributes
6
+ undef_method :elems, :elements
7
+
8
+ def [] key
9
+ case key
10
+ when Integer then contents[key]
11
+ else contents[0][key] rescue nil
12
+ end
13
+ end
14
+
15
+ def << item
16
+ raise_unless Element, item
17
+ item.amendment? ? append(item) : add(item)
18
+ self
19
+ end
20
+
21
+ def find name, nested = true
22
+ find_elements name, nested
23
+ end
24
+
25
+ alias_method :method_missing, :find
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class Error < StandardError ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class InvalidIdentifier < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class InvalidItem < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class InvalidOption < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class InvalidParameters < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class ParseError < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Weskit::WML::Errors
2
+ class ReadError < ::Weskit::WML::Errors::Error ; end
3
+ end
@@ -0,0 +1,19 @@
1
+ class Object
2
+ include ::Weskit::WML::Mixins::Validator
3
+
4
+ attr_reader :attribute
5
+
6
+ alias_method :attr, :attribute
7
+
8
+ def attribute= item
9
+ @attribute = item ? (raise_unless ::Weskit::WML::Attribute, item ; item) : nil
10
+ end
11
+
12
+ alias_method :attr=, :attribute=
13
+
14
+ def attribute?
15
+ @attribute ? true : false
16
+ end
17
+
18
+ alias_method :attr?, :attribute?
19
+ end
@@ -0,0 +1,82 @@
1
+ module Weskit::WML
2
+ class Formatter
3
+ private_class_method :new
4
+
5
+ attr_reader :separator
6
+
7
+ def format item, indentation = 0
8
+ case item
9
+ when Attribute then @attr_formatter.format item, indentation
10
+ when Element then @elem_formatter.format item, indentation
11
+ end
12
+ end
13
+
14
+ def format_detached item, formatter = nil
15
+ formatter ||= item.formatter
16
+ duplicate = item.dup.detach
17
+
18
+ duplicate.formatter = formatter
19
+ format item
20
+ end
21
+
22
+ def indent content, width = 0
23
+ @indent * width + "#{content}"
24
+ end
25
+
26
+ def initialize options = {}
27
+ options = options_default.merge options
28
+
29
+ @attr_formatter = options[:attr_formatter].new self
30
+ @elem_formatter = options[:elem_formatter].new self
31
+
32
+ @indent = options[:indent]
33
+ @separator = options[:separator]
34
+
35
+ self
36
+ end
37
+
38
+ private
39
+
40
+ def options_default
41
+ {
42
+ :indent => ' ',
43
+ :separator => $/
44
+ }
45
+ end
46
+
47
+ class << self
48
+ def color
49
+ @color ||= new options_color
50
+ end
51
+
52
+ def default
53
+ @default or plain
54
+ end
55
+
56
+ def default= item
57
+ Mixins::Validator.raise_unless Formatter, item
58
+ @default = item
59
+ end
60
+
61
+ def plain
62
+ @plain ||= new options_plain
63
+ end
64
+
65
+ private
66
+
67
+ def options_color
68
+ {
69
+ :attr_formatter => Formatters::AnsiColorAttribute,
70
+ :elem_formatter => Formatters::AnsiColorElement
71
+ }
72
+ end
73
+
74
+ def options_plain
75
+ {
76
+ :attr_formatter => Formatters::Attribute,
77
+ :elem_formatter => Formatters::Element
78
+ }
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,49 @@
1
+ require 'term/ansicolor'
2
+
3
+ module Weskit::WML::Formatters
4
+ module AnsiColor
5
+ module_function
6
+
7
+ private
8
+
9
+ def ac
10
+ Term::ANSIColor
11
+ end
12
+
13
+ def reset
14
+ ac.reset
15
+ end
16
+
17
+ def attribute text
18
+ "#{attribute_color}#{text}#{reset}"
19
+ end
20
+
21
+ def attribute_color
22
+ ac.yellow
23
+ end
24
+
25
+ def val text
26
+ "#{value_color}#{text}#{reset}"
27
+ end
28
+
29
+ def val_color
30
+ ac.intense_cyan
31
+ end
32
+
33
+ def control text
34
+ "#{control_color}#{text}#{reset}"
35
+ end
36
+
37
+ def control_color
38
+ ac.intense_blue
39
+ end
40
+
41
+ def element text
42
+ "#{element_color}#{text}#{reset}"
43
+ end
44
+
45
+ def element_color
46
+ ac.intense_green
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ module Weskit::WML::Formatters
2
+ class AnsiColorAttribute < Attribute
3
+ include ::Weskit::WML::Formatters::AnsiColor
4
+
5
+ private
6
+
7
+ def defaults
8
+ hash = super
9
+
10
+ hash[:assignment] = control hash[:assignment]
11
+ hash[:code_start] = control hash[:code_start]
12
+ hash[:code_end] = control hash[:code_end]
13
+ hash[:quote] = control hash[:quote]
14
+ hash[:underscore] = control hash[:underscore]
15
+
16
+ hash
17
+ end
18
+
19
+ def escape_sequence
20
+ reset + "#{@quote * 2}" + val_color
21
+ end
22
+
23
+ def text attribute
24
+ val_color + "#{attribute.value}" + reset
25
+ end
26
+
27
+ def name attribute
28
+ attribute super
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module Weskit::WML::Formatters
2
+ class AnsiColorElement < Element
3
+ include ::Weskit::WML::Formatters::AnsiColor
4
+
5
+ private
6
+
7
+ def defaults
8
+ hash = super
9
+
10
+ hash[:amend_char] = control hash[:amend_char]
11
+ hash[:closing_char] = control hash[:closing_char]
12
+ hash[:closing] = control hash[:closing]
13
+ hash[:opening] = control hash[:opening]
14
+
15
+ hash
16
+ end
17
+
18
+ def name element
19
+ element super
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,62 @@
1
+ module Weskit::WML::Formatters
2
+ class Attribute < ItemFormatter
3
+ def format attribute, indent = 0
4
+ content = "#{name attribute}#@assignment#{value attribute}"
5
+ @formatter.indent content, indent
6
+ end
7
+
8
+ private
9
+
10
+ def defaults
11
+ {
12
+ :assignment => '=',
13
+ :code_start => '<<',
14
+ :code_end => '>>',
15
+ :quote => '"',
16
+ :underscore => '_'
17
+ }
18
+ end
19
+
20
+ def escape value
21
+ value.gsub @quote, escape_sequence
22
+ end
23
+
24
+ def escape_sequence
25
+ @quote * 2
26
+ end
27
+
28
+ def text attribute
29
+ "#{attribute.value}"
30
+ end
31
+
32
+ def name attribute
33
+ "#{attribute.name}"
34
+ end
35
+
36
+ def code_value attribute
37
+ "#@code_start#{text attribute}#@code_end"
38
+ end
39
+
40
+ def raw_value attribute
41
+ text attribute
42
+ end
43
+
44
+ def text_value attribute
45
+ string = escape text attribute
46
+ string = "#@quote#{string}#@quote"
47
+ string = "#@underscore#{string}" if attribute.translatable?
48
+ end
49
+
50
+ def value attribute
51
+ method = if attribute.code?
52
+ :code_value
53
+ elsif attribute.text?
54
+ :text_value
55
+ else
56
+ :raw_value
57
+ end
58
+
59
+ send method, attribute
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,44 @@
1
+ module Weskit::WML::Formatters
2
+ class Element < ItemFormatter
3
+ def format element, indent = 0
4
+ contents = []
5
+
6
+ contents.push @formatter.indent(opening_tag(element), indent)
7
+ contents += element.contents.collect {|i| @formatter.format i, indent + 1}
8
+ contents.push @formatter.indent(closing_tag(element), indent)
9
+
10
+ contents.join @formatter.separator
11
+ end
12
+
13
+ private
14
+
15
+ def defaults
16
+ {
17
+ :amend_char => '+',
18
+ :closing_char => '/',
19
+ :closing => ']',
20
+ :opening => '['
21
+ }
22
+ end
23
+
24
+ def closing_tag element
25
+ tag "#@closing_char#{name element}"
26
+ end
27
+
28
+ def name element
29
+ "#{element.name}"
30
+ end
31
+
32
+ def opening_prefix element
33
+ element.amendment? ? "#@amend_char" : ''
34
+ end
35
+
36
+ def opening_tag element
37
+ tag "#{opening_prefix element}#{name element}"
38
+ end
39
+
40
+ def tag content
41
+ "#@opening#{content}#@closing"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ module Weskit::WML::Formatters
2
+ class ItemFormatter
3
+ include ::Weskit::WML::Mixins::Validator
4
+
5
+ def initialize item
6
+ raise_unless ::Weskit::WML::Formatter, item
7
+ set_instance_variables
8
+ @formatter = item
9
+ end
10
+
11
+ private
12
+
13
+ def set_instance_variables
14
+ defaults.each {|var, value| instance_variable_set "@#{var}", value}
15
+ end
16
+ end
17
+ end