trxl 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.8
1
+ 0.1.9
@@ -4857,16 +4857,26 @@ module Trxl
4857
4857
  if r16
4858
4858
  r0 = r16
4859
4859
  else
4860
- r17 = _nt_matching_ids_function
4860
+ r17 = _nt_compact_function
4861
4861
  if r17
4862
4862
  r0 = r17
4863
4863
  else
4864
- r18 = _nt_values_of_type_function
4864
+ r18 = _nt_is_empty_function
4865
4865
  if r18
4866
4866
  r0 = r18
4867
4867
  else
4868
- @index = i0
4869
- r0 = nil
4868
+ r19 = _nt_matching_ids_function
4869
+ if r19
4870
+ r0 = r19
4871
+ else
4872
+ r20 = _nt_values_of_type_function
4873
+ if r20
4874
+ r0 = r20
4875
+ else
4876
+ @index = i0
4877
+ r0 = nil
4878
+ end
4879
+ end
4870
4880
  end
4871
4881
  end
4872
4882
  end
@@ -4923,7 +4933,8 @@ module Trxl
4923
4933
  help << " HELP,ENV,SIZE,SPLIT,ROUND,MIN,MAX\n"
4924
4934
  help << " SUM, MULT, AVG, PRINT, PRINT_LINE\n"
4925
4935
  help << " TO_INT, TO_FLOAT, TO_ARRAY, AVG_SUM\n"
4926
- help << " MATCHING_IDS, VALUES_OF_TYPE\n"
4936
+ help << " MATCHING_IDS, VALUES_OF_TYPE, COMPACT\n"
4937
+ help << " IS_EMPTY\n"
4927
4938
  help << "-----------------------------------------\n"
4928
4939
  help << "7) Standard library functions:\n"
4929
4940
  help << " foreach_in, inject, map, select\n"
@@ -6694,6 +6705,344 @@ module Trxl
6694
6705
  r0
6695
6706
  end
6696
6707
 
6708
+ module CompactFunction0
6709
+ def space1
6710
+ elements[1]
6711
+ end
6712
+
6713
+ def space2
6714
+ elements[3]
6715
+ end
6716
+
6717
+ def expression
6718
+ elements[4]
6719
+ end
6720
+
6721
+ def space3
6722
+ elements[5]
6723
+ end
6724
+
6725
+ end
6726
+
6727
+ module CompactFunction1
6728
+ def eval(env = Environment.new)
6729
+ arr = expression.eval(env)
6730
+ arr.compact
6731
+ end
6732
+ end
6733
+
6734
+ module CompactFunction2
6735
+ def space1
6736
+ elements[1]
6737
+ end
6738
+
6739
+ def space2
6740
+ elements[3]
6741
+ end
6742
+
6743
+ end
6744
+
6745
+ module CompactFunction3
6746
+ def eval(env = Environment.new)
6747
+ []
6748
+ end
6749
+ end
6750
+
6751
+ def _nt_compact_function
6752
+ start_index = index
6753
+ if node_cache[:compact_function].has_key?(index)
6754
+ cached = node_cache[:compact_function][index]
6755
+ if cached
6756
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
6757
+ @index = cached.interval.end
6758
+ end
6759
+ return cached
6760
+ end
6761
+
6762
+ i0 = index
6763
+ i1, s1 = index, []
6764
+ if has_terminal?('COMPACT', false, index)
6765
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 7))
6766
+ @index += 7
6767
+ else
6768
+ terminal_parse_failure('COMPACT')
6769
+ r2 = nil
6770
+ end
6771
+ s1 << r2
6772
+ if r2
6773
+ r3 = _nt_space
6774
+ s1 << r3
6775
+ if r3
6776
+ if has_terminal?('(', false, index)
6777
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
6778
+ @index += 1
6779
+ else
6780
+ terminal_parse_failure('(')
6781
+ r4 = nil
6782
+ end
6783
+ s1 << r4
6784
+ if r4
6785
+ r5 = _nt_space
6786
+ s1 << r5
6787
+ if r5
6788
+ r6 = _nt_expression
6789
+ s1 << r6
6790
+ if r6
6791
+ r7 = _nt_space
6792
+ s1 << r7
6793
+ if r7
6794
+ if has_terminal?(')', false, index)
6795
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
6796
+ @index += 1
6797
+ else
6798
+ terminal_parse_failure(')')
6799
+ r8 = nil
6800
+ end
6801
+ s1 << r8
6802
+ end
6803
+ end
6804
+ end
6805
+ end
6806
+ end
6807
+ end
6808
+ if s1.last
6809
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
6810
+ r1.extend(CompactFunction0)
6811
+ r1.extend(CompactFunction1)
6812
+ else
6813
+ @index = i1
6814
+ r1 = nil
6815
+ end
6816
+ if r1
6817
+ r0 = r1
6818
+ else
6819
+ i9, s9 = index, []
6820
+ if has_terminal?('COMPACT', false, index)
6821
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 7))
6822
+ @index += 7
6823
+ else
6824
+ terminal_parse_failure('COMPACT')
6825
+ r10 = nil
6826
+ end
6827
+ s9 << r10
6828
+ if r10
6829
+ r11 = _nt_space
6830
+ s9 << r11
6831
+ if r11
6832
+ if has_terminal?('(', false, index)
6833
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
6834
+ @index += 1
6835
+ else
6836
+ terminal_parse_failure('(')
6837
+ r12 = nil
6838
+ end
6839
+ s9 << r12
6840
+ if r12
6841
+ r13 = _nt_space
6842
+ s9 << r13
6843
+ if r13
6844
+ if has_terminal?(')', false, index)
6845
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
6846
+ @index += 1
6847
+ else
6848
+ terminal_parse_failure(')')
6849
+ r14 = nil
6850
+ end
6851
+ s9 << r14
6852
+ end
6853
+ end
6854
+ end
6855
+ end
6856
+ if s9.last
6857
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
6858
+ r9.extend(CompactFunction2)
6859
+ r9.extend(CompactFunction3)
6860
+ else
6861
+ @index = i9
6862
+ r9 = nil
6863
+ end
6864
+ if r9
6865
+ r0 = r9
6866
+ else
6867
+ @index = i0
6868
+ r0 = nil
6869
+ end
6870
+ end
6871
+
6872
+ node_cache[:compact_function][start_index] = r0
6873
+
6874
+ r0
6875
+ end
6876
+
6877
+ module IsEmptyFunction0
6878
+ def space1
6879
+ elements[1]
6880
+ end
6881
+
6882
+ def space2
6883
+ elements[3]
6884
+ end
6885
+
6886
+ def expression
6887
+ elements[4]
6888
+ end
6889
+
6890
+ def space3
6891
+ elements[5]
6892
+ end
6893
+
6894
+ end
6895
+
6896
+ module IsEmptyFunction1
6897
+ def eval(env = Environment.new)
6898
+ arr = expression.eval(env)
6899
+ arr.empty?
6900
+ end
6901
+ end
6902
+
6903
+ module IsEmptyFunction2
6904
+ def space1
6905
+ elements[1]
6906
+ end
6907
+
6908
+ def space2
6909
+ elements[3]
6910
+ end
6911
+
6912
+ end
6913
+
6914
+ module IsEmptyFunction3
6915
+ def eval(env = Environment.new)
6916
+ true
6917
+ end
6918
+ end
6919
+
6920
+ def _nt_is_empty_function
6921
+ start_index = index
6922
+ if node_cache[:is_empty_function].has_key?(index)
6923
+ cached = node_cache[:is_empty_function][index]
6924
+ if cached
6925
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
6926
+ @index = cached.interval.end
6927
+ end
6928
+ return cached
6929
+ end
6930
+
6931
+ i0 = index
6932
+ i1, s1 = index, []
6933
+ if has_terminal?('IS_EMPTY', false, index)
6934
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 8))
6935
+ @index += 8
6936
+ else
6937
+ terminal_parse_failure('IS_EMPTY')
6938
+ r2 = nil
6939
+ end
6940
+ s1 << r2
6941
+ if r2
6942
+ r3 = _nt_space
6943
+ s1 << r3
6944
+ if r3
6945
+ if has_terminal?('(', false, index)
6946
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
6947
+ @index += 1
6948
+ else
6949
+ terminal_parse_failure('(')
6950
+ r4 = nil
6951
+ end
6952
+ s1 << r4
6953
+ if r4
6954
+ r5 = _nt_space
6955
+ s1 << r5
6956
+ if r5
6957
+ r6 = _nt_expression
6958
+ s1 << r6
6959
+ if r6
6960
+ r7 = _nt_space
6961
+ s1 << r7
6962
+ if r7
6963
+ if has_terminal?(')', false, index)
6964
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
6965
+ @index += 1
6966
+ else
6967
+ terminal_parse_failure(')')
6968
+ r8 = nil
6969
+ end
6970
+ s1 << r8
6971
+ end
6972
+ end
6973
+ end
6974
+ end
6975
+ end
6976
+ end
6977
+ if s1.last
6978
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
6979
+ r1.extend(IsEmptyFunction0)
6980
+ r1.extend(IsEmptyFunction1)
6981
+ else
6982
+ @index = i1
6983
+ r1 = nil
6984
+ end
6985
+ if r1
6986
+ r0 = r1
6987
+ else
6988
+ i9, s9 = index, []
6989
+ if has_terminal?('IS_EMPTY', false, index)
6990
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 8))
6991
+ @index += 8
6992
+ else
6993
+ terminal_parse_failure('IS_EMPTY')
6994
+ r10 = nil
6995
+ end
6996
+ s9 << r10
6997
+ if r10
6998
+ r11 = _nt_space
6999
+ s9 << r11
7000
+ if r11
7001
+ if has_terminal?('(', false, index)
7002
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
7003
+ @index += 1
7004
+ else
7005
+ terminal_parse_failure('(')
7006
+ r12 = nil
7007
+ end
7008
+ s9 << r12
7009
+ if r12
7010
+ r13 = _nt_space
7011
+ s9 << r13
7012
+ if r13
7013
+ if has_terminal?(')', false, index)
7014
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
7015
+ @index += 1
7016
+ else
7017
+ terminal_parse_failure(')')
7018
+ r14 = nil
7019
+ end
7020
+ s9 << r14
7021
+ end
7022
+ end
7023
+ end
7024
+ end
7025
+ if s9.last
7026
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
7027
+ r9.extend(IsEmptyFunction2)
7028
+ r9.extend(IsEmptyFunction3)
7029
+ else
7030
+ @index = i9
7031
+ r9 = nil
7032
+ end
7033
+ if r9
7034
+ r0 = r9
7035
+ else
7036
+ @index = i0
7037
+ r0 = nil
7038
+ end
7039
+ end
7040
+
7041
+ node_cache[:is_empty_function][start_index] = r0
7042
+
7043
+ r0
7044
+ end
7045
+
6697
7046
  module AvgFunction0
6698
7047
  def space1
6699
7048
  elements[0]
@@ -825,6 +825,10 @@ grammar Trxl
825
825
  /
826
826
  avg_function
827
827
  /
828
+ compact_function
829
+ /
830
+ is_empty_function
831
+ /
828
832
  matching_ids_function
829
833
  /
830
834
  values_of_type_function
@@ -863,7 +867,8 @@ grammar Trxl
863
867
  help << " HELP,ENV,SIZE,SPLIT,ROUND,MIN,MAX\n"
864
868
  help << " SUM, MULT, AVG, PRINT, PRINT_LINE\n"
865
869
  help << " TO_INT, TO_FLOAT, TO_ARRAY, AVG_SUM\n"
866
- help << " MATCHING_IDS, VALUES_OF_TYPE\n"
870
+ help << " MATCHING_IDS, VALUES_OF_TYPE, COMPACT\n"
871
+ help << " IS_EMPTY\n"
867
872
  help << "-----------------------------------------\n"
868
873
  help << "7) Standard library functions:\n"
869
874
  help << " foreach_in, inject, map, select\n"
@@ -1173,6 +1178,36 @@ grammar Trxl
1173
1178
  }
1174
1179
  end
1175
1180
 
1181
+ rule compact_function
1182
+ 'COMPACT' space '(' space expression space ')' {
1183
+ def eval(env = Environment.new)
1184
+ arr = expression.eval(env)
1185
+ arr.compact
1186
+ end
1187
+ }
1188
+ /
1189
+ 'COMPACT' space '(' space ')' {
1190
+ def eval(env = Environment.new)
1191
+ []
1192
+ end
1193
+ }
1194
+ end
1195
+
1196
+ rule is_empty_function
1197
+ 'IS_EMPTY' space '(' space expression space ')' {
1198
+ def eval(env = Environment.new)
1199
+ arr = expression.eval(env)
1200
+ arr.empty?
1201
+ end
1202
+ }
1203
+ /
1204
+ 'IS_EMPTY' space '(' space ')' {
1205
+ def eval(env = Environment.new)
1206
+ true
1207
+ end
1208
+ }
1209
+ end
1210
+
1176
1211
  rule avg_function
1177
1212
  'AVG' space '(' space expression more_expressions:( space ',' space expression)* space ')' {
1178
1213
  def eval(env = Environment.new)
@@ -3,16 +3,16 @@ require 'spec_helper'
3
3
  describe "The language" do
4
4
 
5
5
  include Trxl::SpecHelper
6
-
6
+
7
7
  before(:each) do
8
8
  @parser = Trxl::Calculator.new
9
9
  end
10
-
10
+
11
11
  it "should allow to access the current environment by calling ENV" do
12
12
  env = eval("ENV", {})
13
13
  env.should be_kind_of(Trxl::Environment)
14
14
  env.should be_empty
15
-
15
+
16
16
  env = eval("ENV", { :a => 1, :b => 2 })
17
17
  env.should be_kind_of(Trxl::Environment)
18
18
  env.should have_key(:a)
@@ -36,24 +36,24 @@ describe "The language" do
36
36
  eval("ENV['a'..'c']", { :a => 1, :b => 2, :c => 3 }).should include(2)
37
37
  eval("ENV['a'..'c']", { :a => 1, :b => 2, :c => 3 }).should include(3)
38
38
  end
39
-
39
+
40
40
  it "should be able to PRINT and PRINT_LINE to STDOUT" do
41
41
  eval("PRINT('- This is output from PRINT. ')").should be_nil
42
42
  eval("PRINT_LINE('And this is output from PRINT_LINE')").should be_nil
43
43
  end
44
-
44
+
45
45
  it "should be able to split strings by calling SPLIT(some_string, split_char)" do
46
46
  eval("SPLIT('foo/bar', '/')").should == [ 'foo', 'bar' ]
47
47
  end
48
-
48
+
49
49
  it "should be able to convert values into integers by calling TO_INT(alpha_numeric_string)" do
50
50
  eval("TO_INT('1')").should == 1
51
51
  end
52
-
52
+
53
53
  it "should be able to convert values into floats by calling TO_FLOAT(alpha_numeric_string)" do
54
54
  eval("TO_FLOAT('1.12')").should == 1.12
55
55
  end
56
-
56
+
57
57
  it "should be able to convert values into arrays by calling TO_ARRAY(some_value)" do
58
58
  eval("TO_ARRAY(1)").should == [ 1 ]
59
59
  eval("TO_ARRAY('1')").should == [ '1' ]
@@ -100,14 +100,14 @@ describe "The language" do
100
100
  eval(program).should == 12
101
101
  program = "SUM(x)"
102
102
  eval(program, { :x => [ 1, 2, 3 ] }).should == 6
103
-
103
+
104
104
  program = "SUM([2,2,2],[4,4,4],[3,3,3])"
105
105
  eval(program).should == 27
106
-
106
+
107
107
  program = "SUM([ [2,2,2], [4,4,4], [3,3,3] ])"
108
108
  eval(program).should == 27
109
109
  end
110
-
110
+
111
111
  it "should be able to calculate MULT for an arbitrary number of argument expressions" do
112
112
  program = "MULT()"
113
113
  eval(program).should == 0
@@ -126,20 +126,48 @@ describe "The language" do
126
126
  program = "MULT(x)"
127
127
  eval(program, { :x => [ 1, 2, 3 ] }).should == 6
128
128
  end
129
-
129
+
130
+ it "should provide COMPACT in order to remove NULL values from arrays" do
131
+ program = "COMPACT([1])"
132
+ eval(program).should == [1]
133
+ program = "COMPACT([1, NULL])"
134
+ eval(program).should == [1]
135
+ program = "COMPACT([NULL])"
136
+ eval(program).should == []
137
+ program = "COMPACT([NULL, NULL])"
138
+ eval(program).should == []
139
+ end
140
+
141
+ it "should provide IS_EMPTY in order to test if an array contains elements" do
142
+ program = "IS_EMPTY([])"
143
+ eval(program).should == true
144
+ program = "IS_EMPTY([1])"
145
+ eval(program).should == false
146
+ program = "IS_EMPTY([NULL])"
147
+ eval(program).should == false
148
+ end
149
+
130
150
  it "should be able to calculate AVG for an arbitrary number of argument expressions" do
131
151
  program = "AVG()"
132
152
  eval(program).should == 0
133
153
  program = "AVG(NULL)"
134
154
  eval(program).should be_nil
155
+ program = "AVG(FALSE, NULL)"
156
+ eval(program).should be_nil
157
+ program = "AVG(NULL, NULL)"
158
+ eval(program).should be_nil
159
+ program = "AVG(FALSE, NULL, NULL)"
160
+ eval(program).should be_nil
161
+ program = "AVG([NULL, NULL])"
162
+ eval(program).should == 0
163
+ program = "AVG(FALSE, [NULL, NULL])"
164
+ eval(program).should == 0
135
165
  program = "AVG(0)"
136
166
  eval(program).should == 0
137
167
  program = "AVG(1)"
138
168
  eval(program).should == 1
139
169
  program = "AVG(3,3,3)"
140
170
  eval(program).should == 3
141
- program = "AVG(3,3,3)"
142
- eval(program).should == 3
143
171
  program = "AVG(3,5,0)"
144
172
  eval(program).should be_close(2.66666666666, 0.01)
145
173
  program = "AVG(FALSE, 3,5,0)"
@@ -154,19 +182,19 @@ describe "The language" do
154
182
  eval(program).should == 4
155
183
  program = "AVG(fun(){4}(),fun(x){x}(4),fun(x,y){x+y}(2,2))"
156
184
  eval(program).should == 4
157
-
185
+
158
186
  program = "AVG([1,2,3],[4,4,4],[6,6,6])"
159
187
  eval(program).should == 4
160
188
  program = "AVG([2,2],[4,4,4],[6,6])"
161
189
  eval(program).should == 4
162
190
  end
163
-
191
+
164
192
  it "should be able to calculate AVG_SUM for an arbitrary number of argument expressions" do
165
193
  program = "AVG_SUM([1,2,3],[4,4,4],[6,6,6])"
166
194
  eval(program).should == 12
167
195
  program = "AVG_SUM([2,2],[4,4,4],[6,6])"
168
196
  eval(program).should == 12
169
-
197
+
170
198
  env = {
171
199
  :ap => [138542.0, 136795.0, 134256.0], # 136531
172
200
  :aq => [124580.0, 21458.0, 34560.0], # 60199.3333333333
@@ -176,10 +204,10 @@ describe "The language" do
176
204
  :au => [250.0, 250.0, 250.0] # 250
177
205
  # ------------------
178
206
  # 206859
179
-
207
+
180
208
  }
181
209
  eval("AVG_SUM(ENV['ap'..'au'])", env).should == 206859
182
-
210
+
183
211
  env = {
184
212
  :ap => [138542.0, 136795.0, 134256.0], # 136531
185
213
  :aq => [124580.0, 21458.0, 34560.0], # 60199.3333333333
@@ -189,10 +217,10 @@ describe "The language" do
189
217
  :au => [0, 0, 0] # 0
190
218
  # ------------------
191
219
  # 206609
192
-
220
+
193
221
  }
194
222
  eval("AVG_SUM(ENV['ap'..'au'])", env).should == 206609
195
-
223
+
196
224
  end
197
225
 
198
226
  it "should be able to calculate MIN for an arbitrary number of argument expressions" do
@@ -224,7 +252,7 @@ describe "The language" do
224
252
  program = "MAX(fun(){4}(),fun(x){x}(4),fun(x,y){x+y}(2,2))"
225
253
  eval(program).should == 4
226
254
  end
227
-
255
+
228
256
  it "should be able to map all hash ids that match a given value by calling MATCHING_IDS" do
229
257
  env = { :foo => { :a => "bar", :b => "bar", :c => "baz" } }
230
258
  eval("MATCHING_IDS('bar', foo)", env).should include(:a)
@@ -232,9 +260,9 @@ describe "The language" do
232
260
  eval("MATCHING_IDS('baz', foo)", env).should == [ :c ]
233
261
  eval("MATCHING_IDS('bam', foo)", env).should == []
234
262
  end
235
-
263
+
236
264
  it "should define a VALUES_OF_TYPE function" do
237
- env = {
265
+ env = {
238
266
  :all_types => { :a => "bar", :b => "bar", :c => "baz" },
239
267
  :all_values => { :a => 100, :b => 200, :c => 300 }
240
268
  }
@@ -243,7 +271,7 @@ describe "The language" do
243
271
  eval("VALUES_OF_TYPE('baz', all_types, all_values)", env).should == [ 300 ]
244
272
  eval("VALUES_OF_TYPE('bam', all_types, all_values)", env).should == []
245
273
 
246
- env = {
274
+ env = {
247
275
  :all_types => { :a => "bar", :b => "bar", :c => "baz" },
248
276
  :all_values => { :a => [100,200,300], :b => [400,500,600], :c => [700,800,900] }
249
277
  }
@@ -252,17 +280,17 @@ describe "The language" do
252
280
  eval("VALUES_OF_TYPE('baz', all_types, all_values)", env).should == [ [700,800,900] ]
253
281
  eval("VALUES_OF_TYPE('bam', all_types, all_values)", env).should == []
254
282
 
255
- env = {
283
+ env = {
256
284
  :all_types => { :a => "bar", :b => "bar", :c => "baz" },
257
285
  :all_values => []
258
286
  }
259
287
  lambda { eval("VALUES_OF_TYPE('bar', all_types, all_values)", env) }.should raise_error(Trxl::InvalidArgumentException)
260
-
261
- env = {
288
+
289
+ env = {
262
290
  :all_types => [],
263
291
  :all_values => { :a => [100,200,300], :b => [400,500,600], :c => [700,800,900] }
264
292
  }
265
293
  lambda { eval("VALUES_OF_TYPE('bar', all_types, all_values)", env) }.should raise_error(Trxl::InvalidArgumentException)
266
294
  end
267
-
295
+
268
296
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{trxl}
8
- s.version = "0.1.8"
8
+ s.version = "0.1.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Martin Gamsjaeger (snusnu)}, %q{Michael Aufreiter}]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trxl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 8
10
- version: 0.1.8
9
+ - 9
10
+ version: 0.1.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Martin Gamsjaeger (snusnu)