conlang 0.2.1.1 → 0.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +14 -5
- data/bin/conlang +17 -6
- data/lib/conlang.rb +1 -1
- data/lib/conlang/errors.rb +16 -0
- data/lib/conlang/operators.rb +14 -7
- data/lib/conlang/symbolset.rb +2 -1
- data/lib/conlang/version.rb +1 -1
- data/lib/conlang/wordgenerator.rb +9 -8
- data/test/not_lang.gaga +0 -0
- data/test/test_symbolset.rb +24 -0
- data/test/test_syntax_error.lang +18 -0
- data/test/test_wordgenerator.rb +30 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84b2be900d933ecb7e56837534a993f5ad6c4219
|
4
|
+
data.tar.gz: e99c3ede33eb2a80daa0fa9a7d9d6b16594d9d7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c01f9db7fc189ea4596934fa6b3dc4b6628340f6f6363b024226c26591df561c5558291bb8e256011d17e2b52e6511355105b4f7a8c12edb6c17594c1424c8ba
|
7
|
+
data.tar.gz: fdd3340b5d0de13370d2a86080543246d0aa409524c393ff49b9c5d61544543e0497243a13c6ba349bc4e7f9be8aaf173757c4d7c131abaabbfb5ea80c78cffb
|
data/CHANGELOG.md
CHANGED
@@ -14,4 +14,8 @@ Implemented features
|
|
14
14
|
* An executable in `\bin` has been included.
|
15
15
|
See [README.md](README.md) to see
|
16
16
|
documentation about how to use this gem
|
17
|
-
as a command line utility.
|
17
|
+
as a command line utility.
|
18
|
+
* New release (v0.3.0)
|
19
|
+
* Better and more specific Exceptions
|
20
|
+
* More tests, Rake file
|
21
|
+
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
ConlangWordGenerator,
|
1
|
+
ConlangWordGenerator, v0.3.0
|
2
2
|
=================================
|
3
3
|
**Now it's a gem!**
|
4
4
|
|
@@ -7,8 +7,8 @@ Description
|
|
7
7
|
This gem allows the user to generate words for
|
8
8
|
constructed languages, given a LANG file that
|
9
9
|
describes the language. It can also be useful
|
10
|
-
for linguistics to study and generate words
|
11
|
-
a
|
10
|
+
for linguistics to study and generate valid words
|
11
|
+
from a descripted language.
|
12
12
|
|
13
13
|
The `*.lang` file must include sets of phonemes with
|
14
14
|
their individual probability weight, and a grammatical
|
@@ -17,7 +17,7 @@ described language.
|
|
17
17
|
|
18
18
|
Instructions
|
19
19
|
------------
|
20
|
-
Usage as **command line executable**:
|
20
|
+
Usage as a **command line executable**:
|
21
21
|
|
22
22
|
conlang <words count> '<LANG file>'
|
23
23
|
|
@@ -25,7 +25,7 @@ This command produces an `output-<name>.txt`
|
|
25
25
|
file that includes a list of the generated words,
|
26
26
|
separated by newlines.
|
27
27
|
|
28
|
-
Usage as **gem**:
|
28
|
+
Usage as a **gem**:
|
29
29
|
|
30
30
|
require 'conlang'
|
31
31
|
|
@@ -55,3 +55,12 @@ Again, examples at `lang-examples` directory can help you a lot.
|
|
55
55
|
The class `WordGenerator` takes a path to a valid `*.lang`
|
56
56
|
file to produce a generator of words, as described previously
|
57
57
|
in the **Instructions** section.
|
58
|
+
|
59
|
+
Root-level identifiers
|
60
|
+
----------------------
|
61
|
+
- **WordGenerator** - Main class
|
62
|
+
- **ConlangWordGenerator** - Namespace module for the gem
|
63
|
+
- Exceptions
|
64
|
+
- **LangFileError** < StandardError, for LANG files
|
65
|
+
- **LangFileIOError** < LangFileError
|
66
|
+
- **LangSyntaxError** < LangFileError
|
data/bin/conlang
CHANGED
@@ -10,7 +10,6 @@ USAGE = " Usage:\n conlang <words count> '<LANG file>'\n\n" +
|
|
10
10
|
|
11
11
|
# If incorrect quantity of arguments
|
12
12
|
if ARGV.length != 2 && ARGV[0] !~ /d+/ && ARGV[1] !~ /\.lang$/
|
13
|
-
p "argv"
|
14
13
|
puts USAGE
|
15
14
|
exit
|
16
15
|
end
|
@@ -23,15 +22,27 @@ require 'conlang'
|
|
23
22
|
begin
|
24
23
|
# Parse arguments
|
25
24
|
words_qty = ARGV[0].to_i
|
26
|
-
filename = ARGV[1]
|
25
|
+
filename = ARGV[1]
|
26
|
+
name = filename.split(".")[0]
|
27
27
|
|
28
28
|
# Generate words
|
29
|
-
generator = WordGenerator.new(filename
|
29
|
+
generator = WordGenerator.new(filename)
|
30
30
|
words = generator.get_words(words_qty)
|
31
31
|
|
32
32
|
# Produce output file
|
33
|
-
IO.write(
|
34
|
-
puts " '#{
|
35
|
-
|
33
|
+
IO.write(name + "-output.txt", words.join("\n"))
|
34
|
+
puts " '#{name}-output.txt' file has been produced."
|
35
|
+
|
36
|
+
rescue LangFileIOError => e
|
37
|
+
puts e.inspect + "\n"
|
36
38
|
puts USAGE
|
39
|
+
|
40
|
+
rescue LangFileIOError => e
|
41
|
+
puts e.inspect + "\n"
|
42
|
+
puts USAGE
|
43
|
+
|
44
|
+
rescue StandardError => e
|
45
|
+
puts e.inspect + "\n"
|
46
|
+
puts USAGE
|
47
|
+
|
37
48
|
end
|
data/lib/conlang.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
class LangFileError < StandardError
|
4
|
+
def initialize(msg)
|
5
|
+
super msg
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# If LANG file doesn't exists
|
10
|
+
# or the loading fails
|
11
|
+
class LangFileIOError < LangFileError
|
12
|
+
end
|
13
|
+
|
14
|
+
# If syntax error in LANG file
|
15
|
+
class LangSyntaxError < LangFileError
|
16
|
+
end
|
data/lib/conlang/operators.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
1
3
|
# Operators for .lang grammatical expressions.
|
2
4
|
# - maybe(weight, symbolset)
|
3
5
|
# The symbolset may appear or not (empty string),
|
@@ -21,8 +23,8 @@ module ConlangWordGenerator
|
|
21
23
|
class Or
|
22
24
|
def initialize(weight, setA, setB)
|
23
25
|
unless weight > 0 and weight < 100
|
24
|
-
raise "
|
25
|
-
|
26
|
+
raise LangSyntaxError, "Weight for an or() operator must " +
|
27
|
+
"be between 1 and 100 (exclusive)."
|
26
28
|
end
|
27
29
|
|
28
30
|
@weight = weight
|
@@ -64,8 +66,8 @@ module ConlangWordGenerator
|
|
64
66
|
class Maybe
|
65
67
|
def initialize(weight, set)
|
66
68
|
unless weight > 0 and weight < 100
|
67
|
-
raise "
|
68
|
-
|
69
|
+
raise LangSyntaxError, "Weight for an maybe() operator " +
|
70
|
+
"must be between 1 and 100 (exclusive)."
|
69
71
|
end
|
70
72
|
|
71
73
|
@weight = weight
|
@@ -95,7 +97,7 @@ module ConlangWordGenerator
|
|
95
97
|
elsif args.length == 3
|
96
98
|
Or.new(args[0].to_i, args[1], args[2])
|
97
99
|
else
|
98
|
-
raise "
|
100
|
+
raise LangSyntaxError, "Invalid Or() operator arguments."
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
@@ -105,7 +107,7 @@ module ConlangWordGenerator
|
|
105
107
|
elsif args.length == 2
|
106
108
|
Maybe.new(args[0].to_i, args[1])
|
107
109
|
else
|
108
|
-
raise "
|
110
|
+
raise LangSyntaxError, "Invalid Maybe() operator arguments."
|
109
111
|
end
|
110
112
|
end
|
111
113
|
|
@@ -132,6 +134,11 @@ module ConlangWordGenerator
|
|
132
134
|
|
133
135
|
# Evaluate all generated assigments
|
134
136
|
# and then the grammatical expression.
|
135
|
-
|
137
|
+
begin
|
138
|
+
eval(expr)
|
139
|
+
rescue
|
140
|
+
raise LangSyntaxError, "Invalid operators or bindings " +
|
141
|
+
"in grammatical expression."
|
142
|
+
end
|
136
143
|
end
|
137
144
|
end
|
data/lib/conlang/symbolset.rb
CHANGED
@@ -12,7 +12,8 @@ module ConlangWordGenerator
|
|
12
12
|
# Add new symbol with its probability into the set
|
13
13
|
def add_pair(symbol, weight)
|
14
14
|
unless weight > 0 and weight < 100
|
15
|
-
raise "Weight of symbol '#{symbol}' must be
|
15
|
+
raise LangSyntaxError, "Weight of symbol '#{symbol}' must be " +
|
16
|
+
"a value between 1 and 99, inclusive."
|
16
17
|
end
|
17
18
|
|
18
19
|
# Insert new pair in the sorted array of pairs
|
data/lib/conlang/version.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
#require 'lib/symbolset.rb'
|
4
|
-
|
5
3
|
#
|
6
4
|
# This Ruby class generates random words using
|
7
5
|
# prabability-weighted symbols, and grammar rules
|
8
|
-
# from a given
|
6
|
+
# from a given *.lang file as input.
|
9
7
|
#
|
10
8
|
|
11
9
|
class WordGenerator
|
@@ -13,12 +11,14 @@ class WordGenerator
|
|
13
11
|
def initialize(file)
|
14
12
|
# Check file extension.
|
15
13
|
unless file.match(/.*\.lang/)
|
16
|
-
raise
|
14
|
+
raise LangFileIOError,
|
15
|
+
"Given file, \"#{file}\", is not a .lang file."
|
17
16
|
end
|
18
17
|
|
19
18
|
# Check if files exist
|
20
19
|
unless File.exist?(file)
|
21
|
-
raise
|
20
|
+
raise LangFileIOError,
|
21
|
+
"File \"#{file}\" was not found."
|
22
22
|
end
|
23
23
|
|
24
24
|
# # # # # # # # #
|
@@ -75,8 +75,8 @@ class WordGenerator
|
|
75
75
|
# Copying expression
|
76
76
|
@full_expression += line.strip
|
77
77
|
else
|
78
|
-
raise "Runtime error when evaluating " +
|
79
|
-
|
78
|
+
raise LangSyntaxError, "Runtime error when evaluating " +
|
79
|
+
"\"#{@lang_file}\" at line #{lines_count}."
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -89,7 +89,8 @@ class WordGenerator
|
|
89
89
|
# This method evaluates the grammatical expression
|
90
90
|
# and then generate random words.
|
91
91
|
def eval_expression
|
92
|
-
@evaluated_expression =
|
92
|
+
@evaluated_expression =
|
93
|
+
ConlangWordGenerator::run_expression(@full_expression, @bindings)
|
93
94
|
end
|
94
95
|
|
95
96
|
# This method generates words
|
data/test/not_lang.gaga
ADDED
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'conlang'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
class TestSymbolset < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@ss = ConlangWordGenerator::SymbolSet.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_out_of_weight_upper_range
|
10
|
+
(100...110).each do |n|
|
11
|
+
assert_raise(LangSyntaxError) do
|
12
|
+
@ss.add_pair 'x', n
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_out_of_weight_lower_range
|
18
|
+
(-5...1).each do |n|
|
19
|
+
assert_raise(LangSyntaxError) do
|
20
|
+
@ss.add_pair 'x', n
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Thest LANG file for MAYBE operators.
|
2
|
+
|
3
|
+
symbols for a vowel:
|
4
|
+
a: 50
|
5
|
+
o: 50
|
6
|
+
|
7
|
+
########ERROR##########
|
8
|
+
maybe(vowel)
|
9
|
+
#######################
|
10
|
+
|
11
|
+
symbols for any constant:
|
12
|
+
p: 33
|
13
|
+
t: 33
|
14
|
+
k: 33
|
15
|
+
|
16
|
+
expression:
|
17
|
+
# Pattern: /^[ptk]*[ao]*$/
|
18
|
+
Maybe(constant) + maybe(10, vowel)
|
data/test/test_wordgenerator.rb
CHANGED
@@ -2,15 +2,43 @@ require 'conlang'
|
|
2
2
|
require 'test/unit'
|
3
3
|
|
4
4
|
class TestWordGenerator < Test::Unit::TestCase
|
5
|
+
#
|
6
|
+
# Test if an Error occurs when opening a file
|
7
|
+
#
|
8
|
+
def test_file_does_not_exist
|
9
|
+
assert_raise(LangFileIOError) do
|
10
|
+
WordGenerator.new(Dir.pwd + "/test/doesnt_exists.lang")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_not_lang_file
|
15
|
+
assert_raise(LangFileIOError) do
|
16
|
+
WordGenerator.new(Dir.pwd + "/test/not_lang.gaga")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Catch a general error in LANG file's body
|
22
|
+
#
|
23
|
+
def test_lang_syntax_error
|
24
|
+
assert_raise(LangSyntaxError) do
|
25
|
+
WordGenerator.new(Dir.pwd + "/test/test_syntax_error.lang")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# Test if operators work fine throw
|
31
|
+
# the WordGenerator class.
|
32
|
+
#
|
5
33
|
def test_or_operators
|
6
|
-
words = WordGenerator.new("test_file_or.lang").get_words(10)
|
34
|
+
words = WordGenerator.new(Dir.pwd + "/test/test_file_or.lang").get_words(10)
|
7
35
|
words.each do |word|
|
8
36
|
assert_match(/^[aoptk][ao]$/, word)
|
9
37
|
end
|
10
38
|
end
|
11
39
|
|
12
40
|
def test_maybe_operators
|
13
|
-
words = WordGenerator.new("test_file_maybe.lang").get_words(10)
|
41
|
+
words = WordGenerator.new(Dir.pwd + "/test/test_file_maybe.lang").get_words(10)
|
14
42
|
words.each do |word|
|
15
43
|
assert_match(/^[ptk]*[ao]*$/, word)
|
16
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: conlang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'This gem takes constructed grammar and phonemes from a LANG file to
|
14
14
|
generate random words. You can learn how to create LANG files, or explore some sample
|
@@ -20,6 +20,7 @@ extensions: []
|
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
22
|
- lib/conlang.rb
|
23
|
+
- lib/conlang/errors.rb
|
23
24
|
- lib/conlang/operators.rb
|
24
25
|
- lib/conlang/symbolset.rb
|
25
26
|
- lib/conlang/version.rb
|
@@ -30,8 +31,11 @@ files:
|
|
30
31
|
- README.md
|
31
32
|
- LICENSE.txt
|
32
33
|
- NOTICE.txt
|
34
|
+
- test/not_lang.gaga
|
33
35
|
- test/test_file_maybe.lang
|
34
36
|
- test/test_file_or.lang
|
37
|
+
- test/test_symbolset.rb
|
38
|
+
- test/test_syntax_error.lang
|
35
39
|
- test/test_wordgenerator.rb
|
36
40
|
homepage: https://github.com/fluorine/ConlangWordGenerator
|
37
41
|
licenses:
|