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