DSON 0.1.0 → 0.2.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.
- data/.gitignore +22 -22
- data/.travis.yml +6 -0
- data/DSON.gemspec +28 -24
- data/Gemfile +4 -4
- data/LICENSE.txt +22 -22
- data/README.md +61 -62
- data/Rakefile +6 -2
- data/lib/DSON.rb +14 -13
- data/lib/DSON/value.rb +94 -98
- data/lib/DSON/value/array_value.rb +49 -47
- data/lib/DSON/value/false_value.rb +21 -21
- data/lib/DSON/value/hash_value.rb +56 -59
- data/lib/DSON/value/nil_value.rb +21 -21
- data/lib/DSON/value/numeric_value.rb +40 -20
- data/lib/DSON/value/object_value.rb +37 -37
- data/lib/DSON/value/string_value.rb +26 -25
- data/lib/DSON/value/true_value.rb +21 -21
- data/lib/DSON/version.rb +7 -7
- data/spec/lib/example_class.rb +15 -15
- data/spec/parsing_spec.rb +364 -292
- data/spec/serialization_spec.rb +378 -390
- metadata +57 -15
@@ -1,47 +1,49 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
module DSON
|
5
|
-
module Value
|
6
|
-
class ArrayValue
|
7
|
-
include Value
|
8
|
-
|
9
|
-
def self.so_parse(options)
|
10
|
-
word_array = options[:word_array]
|
11
|
-
parent_array = options[:parent_array]
|
12
|
-
|
13
|
-
if word_array[0] == 'many'
|
14
|
-
word_array.shift
|
15
|
-
return parent_array
|
16
|
-
end
|
17
|
-
word_array.shift unless (word_array[0] =~
|
18
|
-
|
19
|
-
# the next value will be the value
|
20
|
-
parent_array.push(DSON::Value.handle_next(options))
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
module DSON
|
5
|
+
module Value
|
6
|
+
class ArrayValue
|
7
|
+
include Value
|
8
|
+
|
9
|
+
def self.so_parse(options)
|
10
|
+
word_array = options[:word_array]
|
11
|
+
parent_array = options[:parent_array]
|
12
|
+
|
13
|
+
if word_array[0] == 'many'
|
14
|
+
word_array.shift
|
15
|
+
return parent_array
|
16
|
+
end
|
17
|
+
word_array.shift unless (word_array[0] =~ /^(and|also)$/).nil?
|
18
|
+
|
19
|
+
# the next value will be the value
|
20
|
+
parent_array.push(DSON::Value.handle_next(options))
|
21
|
+
|
22
|
+
return parent_array if word_array.empty?
|
23
|
+
|
24
|
+
so_parse(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
POTENTIAL_JOINERS = [' and' , ' also']
|
28
|
+
|
29
|
+
attr_reader :value
|
30
|
+
|
31
|
+
def initialize(value)
|
32
|
+
@value = value
|
33
|
+
end
|
34
|
+
|
35
|
+
def such_serialize_wow
|
36
|
+
content = value.map do |arr_elem|
|
37
|
+
Value.new(arr_elem).such_serialize_wow
|
38
|
+
end
|
39
|
+
'so ' + reduce(content, POTENTIAL_JOINERS) + 'many'
|
40
|
+
end
|
41
|
+
|
42
|
+
AND_ALSO_REGEX = / and | also /
|
43
|
+
|
44
|
+
def self.parse_value(value, acc_array)
|
45
|
+
acc_array.push DSON.so_parse(value)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
require 'singleton'
|
5
|
-
|
6
|
-
module DSON
|
7
|
-
module Value
|
8
|
-
class FalseValue
|
9
|
-
include Value
|
10
|
-
include Singleton
|
11
|
-
|
12
|
-
def self.so_parse
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
def such_serialize_wow
|
17
|
-
'no'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
require 'singleton'
|
5
|
+
|
6
|
+
module DSON
|
7
|
+
module Value
|
8
|
+
class FalseValue
|
9
|
+
include Value
|
10
|
+
include Singleton
|
11
|
+
|
12
|
+
def self.so_parse
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
def such_serialize_wow
|
17
|
+
'no'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,59 +1,56 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
module DSON
|
5
|
-
module Value
|
6
|
-
class HashValue
|
7
|
-
include Value
|
8
|
-
|
9
|
-
def self.so_parse(options)
|
10
|
-
word_array = options[:word_array]
|
11
|
-
parent_hash = options[:parent_hash]
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
key_str
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
module DSON
|
5
|
+
module Value
|
6
|
+
class HashValue
|
7
|
+
include Value
|
8
|
+
|
9
|
+
def self.so_parse(options)
|
10
|
+
word_array = options[:word_array]
|
11
|
+
parent_hash = options[:parent_hash]
|
12
|
+
return parent_hash if word_array.empty?
|
13
|
+
|
14
|
+
if word_array[0] == 'wow'
|
15
|
+
word_array.shift
|
16
|
+
return parent_hash
|
17
|
+
end
|
18
|
+
|
19
|
+
# The next value will be a key
|
20
|
+
key = word_array.shift[1..-2]
|
21
|
+
|
22
|
+
# remove is
|
23
|
+
word_array.shift
|
24
|
+
|
25
|
+
value = DSON::Value.handle_next(options)
|
26
|
+
parent_hash[key] = value
|
27
|
+
|
28
|
+
so_parse(options)
|
29
|
+
end
|
30
|
+
|
31
|
+
POTENTIAL_PUNCTUATION = %w(, . ! ?)
|
32
|
+
|
33
|
+
attr_reader :value
|
34
|
+
|
35
|
+
def initialize(value)
|
36
|
+
@value = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def such_serialize_wow
|
40
|
+
strings = value.keys.map do |key|
|
41
|
+
key_str = StringValue.new(key).such_serialize_wow
|
42
|
+
value_str = Value.new(value[key]).such_serialize_wow
|
43
|
+
|
44
|
+
%Q(#{key_str} is #{value_str})
|
45
|
+
end
|
46
|
+
'such ' + reduce(strings, POTENTIAL_PUNCTUATION) + 'wow'
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.parse_pair(string, acc_hash)
|
50
|
+
results = string.scan(/"(.*)" is (.*)/)
|
51
|
+
acc_hash[results[0][0]] = DSON::Value.so_parse(results[0][1])
|
52
|
+
acc_hash
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/DSON/value/nil_value.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
require 'singleton'
|
5
|
-
|
6
|
-
module DSON
|
7
|
-
module Value
|
8
|
-
class NilValue
|
9
|
-
include Value
|
10
|
-
include Singleton
|
11
|
-
|
12
|
-
def self.so_parse
|
13
|
-
nil
|
14
|
-
end
|
15
|
-
|
16
|
-
def such_serialize_wow
|
17
|
-
'empty'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
require 'singleton'
|
5
|
+
|
6
|
+
module DSON
|
7
|
+
module Value
|
8
|
+
class NilValue
|
9
|
+
include Value
|
10
|
+
include Singleton
|
11
|
+
|
12
|
+
def self.so_parse
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def such_serialize_wow
|
17
|
+
'empty'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,20 +1,40 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
module DSON
|
5
|
-
module Value
|
6
|
-
class NumericValue
|
7
|
-
include Value
|
8
|
-
|
9
|
-
attr_reader :value
|
10
|
-
|
11
|
-
def initialize(value)
|
12
|
-
@value = value
|
13
|
-
end
|
14
|
-
|
15
|
-
def
|
16
|
-
value
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
module DSON
|
5
|
+
module Value
|
6
|
+
class NumericValue
|
7
|
+
include Value
|
8
|
+
|
9
|
+
attr_reader :value
|
10
|
+
|
11
|
+
def initialize(value)
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.so_parse(value)
|
16
|
+
if value.include?('very') || value.include?('VERY')
|
17
|
+
parts = value.downcase.split('very')
|
18
|
+
octal_string_to_numeric(parts[0]) * 8 ** octal_string_to_numeric(parts[1])
|
19
|
+
else
|
20
|
+
octal_string_to_numeric(value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def such_serialize_wow
|
25
|
+
value.b(8).to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def self.octal_string_to_numeric(value)
|
31
|
+
value = value.b(8)
|
32
|
+
if value.kind_of?(Radix::Float)
|
33
|
+
value.to_f
|
34
|
+
else
|
35
|
+
value.to_i
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,37 +1,37 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
module DSON
|
5
|
-
module Value
|
6
|
-
class ObjectValue
|
7
|
-
include Value
|
8
|
-
|
9
|
-
attr_reader :value
|
10
|
-
|
11
|
-
def initialize(value)
|
12
|
-
@value = value
|
13
|
-
end
|
14
|
-
|
15
|
-
def such_serialize_wow
|
16
|
-
# Construct a hash of the instance variables
|
17
|
-
object_hash = Hash[
|
18
|
-
value.instance_variables.map do |variable|
|
19
|
-
[
|
20
|
-
remove_at_from_attribute_name(variable),
|
21
|
-
value.instance_variable_get(variable)
|
22
|
-
]
|
23
|
-
end
|
24
|
-
]
|
25
|
-
|
26
|
-
value = DSON::Value.new(object_hash)
|
27
|
-
value.such_serialize_wow
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def remove_at_from_attribute_name(attribute_name)
|
33
|
-
attribute_name[1..-1]
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
module DSON
|
5
|
+
module Value
|
6
|
+
class ObjectValue
|
7
|
+
include Value
|
8
|
+
|
9
|
+
attr_reader :value
|
10
|
+
|
11
|
+
def initialize(value)
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def such_serialize_wow
|
16
|
+
# Construct a hash of the instance variables
|
17
|
+
object_hash = Hash[
|
18
|
+
value.instance_variables.map do |variable|
|
19
|
+
[
|
20
|
+
remove_at_from_attribute_name(variable),
|
21
|
+
value.instance_variable_get(variable)
|
22
|
+
]
|
23
|
+
end
|
24
|
+
]
|
25
|
+
|
26
|
+
value = DSON::Value.new(object_hash)
|
27
|
+
value.such_serialize_wow
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def remove_at_from_attribute_name(attribute_name)
|
33
|
+
attribute_name[1..-1]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,25 +1,26 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
require 'DSON/value'
|
3
|
-
|
4
|
-
module DSON
|
5
|
-
module Value
|
6
|
-
class StringValue
|
7
|
-
include Value
|
8
|
-
|
9
|
-
attr_reader :value
|
10
|
-
|
11
|
-
def self.so_parse(
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'DSON/value'
|
3
|
+
|
4
|
+
module DSON
|
5
|
+
module Value
|
6
|
+
class StringValue
|
7
|
+
include Value
|
8
|
+
|
9
|
+
attr_reader :value
|
10
|
+
|
11
|
+
def self.so_parse(value)
|
12
|
+
start_index = value.index('"') + 1
|
13
|
+
end_index = value.rindex('"') - 1
|
14
|
+
value[start_index..end_index]
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(value)
|
18
|
+
@value = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def such_serialize_wow
|
22
|
+
"\"#{value}\""
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|