lunar_cheese 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,45 @@
1
+ module LunarCheese
2
+ grammar LuaTableDump
3
+
4
+ rule table
5
+ '{' child:(assignment / value)? other_children:(',' child:(assignment / value))* '}' <AST::LuaTable>
6
+ end
7
+
8
+ rule prefix
9
+ '+' / '-'
10
+ end
11
+
12
+ rule integer
13
+ prefix? [0-9]+ <AST::IntegerLiteral>
14
+ end
15
+
16
+ rule float
17
+ integer '.' [0-9]+ <AST::FloatLiteral>
18
+ end
19
+
20
+ rule boolean
21
+ 'false' <AST::BooleanLit>
22
+ /
23
+ 'true' <AST::BooleanLit>
24
+ end
25
+
26
+ rule string
27
+ '"' text:('\"' / !'"' .)* '"' <AST::StringLiteral>
28
+ end
29
+
30
+ rule identifier
31
+ [a-zA-Z_] [a-zA-Z0-9_]* <AST::IdentifierLiteral>
32
+ /
33
+ '[' [^\[\]]+ ']' <AST::IdentifierLiteral>
34
+ end
35
+
36
+ rule value
37
+ (float / integer / string / boolean / table)
38
+ end
39
+
40
+ rule assignment
41
+ identifier '=' value <AST::Assignment>
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,20 @@
1
+ #coding: utf-8
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'lunar_cheese'
5
+ s.version = '0.2.3'
6
+ s.summary = 'Treetop grammar & additions to core classes to convert "Don\'t Starve" save games to Ruby and vice versa.'
7
+ s.description = 'A gem consisting of two parts: A Treetop-based grammar which allows to parse save games of the game "Don\'t Starve" to Ruby objects, and additions to Ruby core classes to dump those back into the same format.'
8
+
9
+ s.author = 'Michael Senn'
10
+ s.email = 'morrolan@morrolan.ch'
11
+ s.homepage = 'https://bitbucket.org/Lavode/lunar-cheese'
12
+ s.license = 'Apache 2.0'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files spec/`.split("\n")
16
+
17
+ s.add_dependency 'treetop'
18
+
19
+ s.add_development_dependency 'rspec'
20
+ end
@@ -0,0 +1,71 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :assignment }
12
+
13
+ context 'valid assignments' do
14
+
15
+ it 'should parse assignments of numerics' do
16
+ expect(parse('x=12')).to eq({ :x => 12 })
17
+ expect(parse('foo=21.5')).to eq({ :foo => 21.5 })
18
+ expect(parse('salary=9.5')).to eq({ :salary => 9.5 })
19
+ expect(parse('[3]=15.345')).to eq({ :'[3]' => 15.345 })
20
+ end
21
+
22
+ it 'should parse assignments of strings' do
23
+ expect(parse('race="Human"')).to eq({ :race => 'Human' })
24
+ expect(parse('greeting="Hello World!"')).to eq({ :greeting => 'Hello World!' })
25
+ expect(parse('[e=]="m*c^2"')).to eq({ :'[e=]' => 'm*c^2' })
26
+ end
27
+
28
+ it 'should parse assignments of booleans' do
29
+ expect(parse('is_working=true')).to eq({ :is_working => true })
30
+ expect(parse('on_fire=false')).to eq({ :on_fire => false })
31
+ expect(parse('[x && true]=true')).to eq({ :'[x && true]' => true })
32
+ end
33
+
34
+ it 'should parse assignment of tables' do
35
+ expect(parse('person={name="John",age=55}')).to eq({ :person => { :name => 'John', :age => 55 } })
36
+ expect(parse('coords={10,5,10}')).to eq({ :coords => { 0 => 10, 1 => 5, 2 => 10 } })
37
+ expect(parse('coords={foo="bar",1,2}')).to eq({ :coords => { :foo => 'bar', 0 => 1, 1 => 2 } })
38
+ end
39
+
40
+ end
41
+
42
+ context 'invalid assignments' do
43
+
44
+ it 'should not parse assignments which are missing the lhs' do
45
+ expect(parse('=3')).to be_nil
46
+ end
47
+
48
+ it 'should not parse assignments which are missing the rhs' do
49
+ expect(parse('foo=')).to be_nil
50
+ end
51
+
52
+ it "should not parse assignments without an 'equals' sign" do
53
+ expect(parse('foo123')).to be_nil
54
+ end
55
+
56
+ it "should not parse assignments with multiple 'equals' signs" do
57
+ expect(parse('foo=="bar"')).to be_nil
58
+ expect(parse('foo="bar"="baz"')).to be_nil
59
+ end
60
+
61
+ it "should not parse the 'equals' sign alone" do
62
+ expect(parse('=')).to be_nil
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,40 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :boolean }
12
+
13
+ it 'should parse booleans' do
14
+ result = parse('false')
15
+ expect(result).to be_false
16
+ expect(result).to_not be_nil
17
+
18
+ expect(parse('true')).to be_true
19
+ end
20
+
21
+ it 'should not parse invalid booleans' do
22
+ expect(parse('False')).to be_nil
23
+ expect(parse('True')).to be_nil
24
+ expect(parse('fAtrue')).to be_nil
25
+ end
26
+
27
+ end
28
+
29
+ context 'dumping' do
30
+
31
+ it 'should dump booleans' do
32
+ expect(false.to_lua).to eq 'false'
33
+ expect(true.to_lua).to eq 'true'
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,67 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :float }
12
+
13
+ context 'valid floats' do
14
+
15
+ it 'should parse basic floats' do
16
+ expect(parse('0.512')).to eq 0.512
17
+ expect(parse('21.27')).to eq 21.27
18
+ expect(parse('0.00')).to eq 0
19
+ end
20
+
21
+ it 'should parse floats with a prefix' do
22
+ expect(parse('-193.2')).to eq -193.2
23
+ expect(parse('+9.1')).to eq 9.1
24
+ expect(parse('-211.286')).to eq -211.286
25
+ end
26
+
27
+ end
28
+
29
+ context 'invalid floats' do
30
+
31
+ it 'should not parse floats with more than one period' do
32
+ expect(parse('15..6')).to be_nil
33
+ expect(parse('14.5.7')).to be_nil
34
+ end
35
+
36
+ it 'should not parse floats with a period in the beginning or end' do
37
+ expect(parse('132.')).to be_nil
38
+ expect(parse('.25')).to be_nil
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ context 'dumping' do
46
+
47
+ it 'should dump basic floats' do
48
+ expect(0.0.to_lua).to eq '0.0'
49
+ expect(928.51.to_lua).to eq '928.51'
50
+ end
51
+
52
+ it 'should dump floats with a prefix' do
53
+ expect(-50.2.to_lua).to eq '-50.2'
54
+ expect(-21.5.to_lua).to eq '-21.5'
55
+ end
56
+
57
+ it 'should not print the prefix for numbers >= 0' do
58
+ expect(-0.to_lua).to eq '0'
59
+ expect(0.5.to_lua).to eq '0.5'
60
+ expect(+213.21.to_lua).to eq '213.21'
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,63 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :identifier }
12
+
13
+ context 'valid identifiers' do
14
+
15
+ it 'should parse identifiers' do
16
+ expect(parse('x')).to eq :x
17
+ expect(parse('age')).to eq :age
18
+ expect(parse('last_name')).to eq :last_name
19
+ end
20
+
21
+ it 'should parse identifiers in brackets' do
22
+ expect(parse('[1]')).to eq :'[1]'
23
+ expect(parse('[25]')).to eq :'[25]'
24
+ expect(parse('[*]')).to eq :'[*]'
25
+ expect(parse('[liar liar pants on fire!]')).to eq :'[liar liar pants on fire!]'
26
+ end
27
+
28
+ end
29
+
30
+ context 'invalid identifiers' do
31
+
32
+ it 'should not parse non-alphanumeric (+underscore) identifiers without brackets' do
33
+ expect(parse('ab*c')).to be_nil
34
+ expect(parse('foo-bar_baz')).to be_nil
35
+ expect(parse('Hello there. :D')).to be_nil
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ context 'dumping' do
43
+
44
+ it 'should dump alphanumeric (+underscore) identifiers' do
45
+ expect(:last_name.to_lua).to eq 'last_name'
46
+ expect(:age.to_lua).to eq 'age'
47
+ end
48
+
49
+ it 'should dump non-alphanumeric (+underscore) identifiers' do
50
+ expect(:'e=m*c^2'.to_lua).to eq '[e=m*c^2]'
51
+ expect(:'a big horse'.to_lua).to eq '[a big horse]'
52
+ end
53
+
54
+ it 'should dump identifiers inside square brackets' do
55
+ expect(:'[1]'.to_lua).to eq '[1]'
56
+ expect(:'[liar liar pants on fire!]'.to_lua).to eq '[liar liar pants on fire!]'
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,85 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :integer }
12
+
13
+ context 'valid integers' do
14
+
15
+ it 'should parse basic integers' do
16
+ expect(parse('0')).to eq 0
17
+ expect(parse('21')).to eq 21
18
+ expect(parse('928')).to eq 928
19
+ end
20
+
21
+ it 'should parse integers with a prefix' do
22
+ expect(parse('+0')).to eq 0
23
+ expect(parse('-0')).to eq 0
24
+ expect(parse('+216')).to eq 216
25
+ expect(parse('-31')).to eq -31
26
+ end
27
+
28
+ end
29
+
30
+ context 'invalid integers' do
31
+
32
+ it 'should not parse integers with more than one prefix' do
33
+ expect(parse('--21')).to be_nil
34
+ expect(parse('-+18')).to be_nil
35
+ expect(parse('+-157')).to be_nil
36
+ expect(parse('++24')).to be_nil
37
+ end
38
+
39
+ it 'should not parse integers with an invalid prefix' do
40
+ expect(parse('*21')).to be_nil
41
+ expect(parse('§18')).to be_nil
42
+ end
43
+
44
+ it 'should not parse integers with a prefix anywhere but the very beginning' do
45
+ expect(parse('2+1')).to be_nil
46
+ expect(parse('-14+5')).to be_nil
47
+ end
48
+
49
+ it 'should not parse prefixes alone' do
50
+ expect(parse('-')).to be_nil
51
+ expect(parse('+')).to be_nil
52
+ end
53
+
54
+ it 'should not parse integers which consist of non-numeric characters' do
55
+ expect(parse('12a')).to be_nil
56
+ expect(parse('a51§')).to be_nil
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ context 'dumping' do
64
+
65
+ it 'should dump basic integers' do
66
+ expect(0.to_lua).to eq '0'
67
+ expect(928.to_lua).to eq '928'
68
+ end
69
+
70
+ it 'should dump integers with a prefix' do
71
+ expect(-50.to_lua).to eq '-50'
72
+ expect(-21.to_lua).to eq '-21'
73
+ end
74
+
75
+ it 'should not print the prefix for numbers >= 0' do
76
+ expect(-0.to_lua).to eq '0'
77
+ expect(0.to_lua).to eq '0'
78
+ expect(+213.to_lua).to eq '213'
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,81 @@
1
+ #coding: utf-8
2
+
3
+ require_relative '../spec_helper'
4
+
5
+ module LunarCheese
6
+
7
+ describe LuaTableDumpParser do
8
+ let(:p) { LuaTableDumpParser.new }
9
+
10
+ context 'parsing' do
11
+ before(:each) { p.root = :string }
12
+
13
+ context 'valid strings' do
14
+
15
+ it 'should parse empty strings' do
16
+ expect(parse('""')).to eq ''
17
+ end
18
+
19
+ it 'should parse alphanumeric one-word strings' do
20
+ expect(parse('"foobar"')).to eq 'foobar'
21
+ expect(parse('"Michael"')).to eq 'Michael'
22
+ expect(parse('"Parsing4Life"')).to eq 'Parsing4Life'
23
+ end
24
+
25
+ it 'should parse non-alphanumeric strings' do
26
+ expect(parse('"@¼|¬§éLA12^"')).to eq '@¼|¬§éLA12^'
27
+ expect(parse('"l\'église"')).to eq "l'église"
28
+ end
29
+
30
+ it 'should parse multi-word strings' do
31
+ expect(parse('"Hello world, how are you today?"')).to eq 'Hello world, how are you today?'
32
+ expect(parse('"e = m * c ^ 2"')).to eq 'e = m * c ^ 2'
33
+ end
34
+
35
+ it 'should parse strings with escaped quotation marks' do
36
+ expect(parse('"He called her \"Honeymoon\""')).to eq 'He called her "Honeymoon"'
37
+ expect(parse('"Yes, \"John\" is his name, now kill him!"')).to eq 'Yes, "John" is his name, now kill him!'
38
+ end
39
+
40
+ end
41
+
42
+ context 'invalid strings' do
43
+
44
+ it 'should not parse strings without quotation marks' do
45
+ expect(parse('hello there')).to be_nil
46
+ expect(parse('but I want to be parsed D:')).to be_nil
47
+ end
48
+
49
+ it 'should not parse strings with the leading or trailing quotation mark missing' do
50
+ expect(parse('"Hello wor...')).to be_nil
51
+ expect(parse('..lo world"')).to be_nil
52
+ end
53
+
54
+ it 'should not parse strings with non-escaped quotation marks' do
55
+ expect(parse('"He called her \"Honeymoon""')).to be_nil
56
+ expect(parse('"Yes, "John\" is his name, now kill him!"')).to be_nil
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ context 'dumping' do
64
+
65
+ it 'should dump empty strings' do
66
+ expect(''.to_lua).to eq '""'
67
+ end
68
+
69
+ it 'should dump strings' do
70
+ expect('Hello World!'.to_lua).to eq '"Hello World!"'
71
+ end
72
+
73
+ it 'should escape quotation marks' do
74
+ expect('He called her "Honeymoon"'.to_lua).to eq '"He called her \"Honeymoon\""'
75
+ end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end