functio 0.1.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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/CHANGELOG.md +9 -0
  4. data/COPYING +674 -0
  5. data/Gemfile +16 -0
  6. data/Gemfile.lock +79 -0
  7. data/README.md +109 -0
  8. data/Rakefile +47 -0
  9. data/bin/fn +28 -0
  10. data/features/expression_evaluation.feature +58 -0
  11. data/features/function_creation.feature +74 -0
  12. data/features/function_deletion.feature +37 -0
  13. data/features/function_list.feature +35 -0
  14. data/features/function_use.feature +56 -0
  15. data/features/help_option.feature +13 -0
  16. data/features/step_definitions/steps.rb +36 -0
  17. data/features/support/env.rb +41 -0
  18. data/features/support/functio_world.rb +45 -0
  19. data/features/version_option.feature +19 -0
  20. data/functio.gemspec +43 -0
  21. data/lib/functio.rb +24 -0
  22. data/lib/functio/data_storage.rb +90 -0
  23. data/lib/functio/errors.rb +47 -0
  24. data/lib/functio/expression.rb +61 -0
  25. data/lib/functio/formatted_num.rb +39 -0
  26. data/lib/functio/functio_cli.rb +111 -0
  27. data/lib/functio/function.rb +104 -0
  28. data/lib/functio/function_repository.rb +73 -0
  29. data/lib/functio/version.rb +23 -0
  30. data/test/doubles/expression_double.rb +33 -0
  31. data/test/doubles/function_double.rb +34 -0
  32. data/test/doubles/storage_double.rb +36 -0
  33. data/test/doubles/test_expression_double.rb +30 -0
  34. data/test/doubles/test_function_double.rb +30 -0
  35. data/test/doubles/test_storage_double.rb +30 -0
  36. data/test/expression_interface_test.rb +30 -0
  37. data/test/interface_test_helper.rb +25 -0
  38. data/test/license_test_helper.rb +49 -0
  39. data/test/storable_interface_test.rb +30 -0
  40. data/test/storage_interface_test.rb +30 -0
  41. data/test/test_data_storage.rb +127 -0
  42. data/test/test_expression.rb +89 -0
  43. data/test/test_formatted_num.rb +56 -0
  44. data/test/test_function.rb +142 -0
  45. data/test/test_function_repository.rb +97 -0
  46. data/test/test_helper.rb +22 -0
  47. data/test/test_licenses_compatibility.rb +29 -0
  48. metadata +140 -0
@@ -0,0 +1,89 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'test_helper'
21
+ require 'functio/errors'
22
+ require 'functio/expression'
23
+ require 'expression_interface_test'
24
+
25
+ class TestExpression < Minitest::Test # :nodoc:
26
+ include ExpressionInterfaceTest
27
+
28
+ def setup
29
+ @object = Expression.new('42')
30
+ end
31
+
32
+ def test_instantiate_with_invalid_expressions
33
+ exprs = ['1 +', '3 $ 5', '1 2 3', '#@!', '', ' ', ' ']
34
+ exprs.each do |expr|
35
+ assert_raises(InvalidExpressionError) { Expression.new(expr) }
36
+ end
37
+ end
38
+
39
+ def test_instantiate_with_division_by_zero
40
+ exprs = ['1 / 0', '1 / (1 - 1)']
41
+ exprs.each do |expr|
42
+ assert_raises(DivisionByZeroError) do
43
+ Expression.new(expr)
44
+ end
45
+ end
46
+ end
47
+
48
+ def test_evaluate_expressions_with_no_variables
49
+ tests = { '1 + 1' => 2, '3.14 * 2' => 6.28, '42' => 42, '2 * (3 + 5)' => 16,
50
+ '-2 + 1' => -1 }
51
+ tests.each do |expr, expected|
52
+ assert_equal(expected, Expression.new(expr).evaluate)
53
+ end
54
+ end
55
+
56
+ def test_evaluate_expressions_with_variables
57
+ tests = { ['a + b', { a: 1, b: 2 }] => 3,
58
+ ['x * y', { x: 2, y: 3.14 }] => 6.28,
59
+ ['const', { const: 42 }] => 42 }
60
+ tests.each do |inputs, expected|
61
+ expression = Expression.new(inputs[0])
62
+ assert_equal(expected, expression.evaluate(inputs[1]))
63
+ end
64
+ end
65
+
66
+ def test_evaluate_with_wrong_list_of_variables
67
+ tests = { 'x' => {}, 'a + b' => { a: 1 }, 'x + y' => { y: 1 },
68
+ 'y' => { x: 1 } }
69
+ tests.each do |expr, vars|
70
+ expression = Expression.new(expr)
71
+ assert_nil(expression.evaluate(vars))
72
+ end
73
+ end
74
+
75
+ def test_evaluate_division_by_zero
76
+ expression = Expression.new('1 / x')
77
+ assert_raises(DivisionByZeroError) do
78
+ expression.evaluate(x: 0)
79
+ end
80
+ end
81
+
82
+ def test_variables
83
+ tests = { 'a + b' => %w(a b), 'x' => ['x'], 'b / (a + b) * c' => %w(b a c),
84
+ '42' => [] }
85
+ tests.each do |expr, expected|
86
+ assert_equal(expected, Expression.new(expr).variables)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,56 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'test_helper'
21
+ require 'bigdecimal'
22
+ require 'functio/formatted_num'
23
+
24
+ class TestFormattedNum < Minitest::Test # :nodoc:
25
+ def test_fixnum_format
26
+ test_data = [[123, '123'], [0, '0'], [-123, '-123']]
27
+ test_data.each do |input, expected|
28
+ assert_instance_of(Fixnum, input)
29
+ assert_equal(expected, FormattedNum.new(input).to_s)
30
+ end
31
+ end
32
+
33
+ def test_bignum_to_string
34
+ test_data = [
35
+ [12_345_678_901_234_567_890, '12345678901234567890'],
36
+ [-12_345_678_901_234_567_890, '-12345678901234567890']
37
+ ]
38
+ test_data.each do |input, expected|
39
+ assert_instance_of(Bignum, input)
40
+ assert_equal(expected, FormattedNum.new(input).to_s)
41
+ end
42
+ end
43
+
44
+ def test_bigdecimal_to_string
45
+ test_data = [
46
+ [BigDecimal.new('3.14'), '3.14'],
47
+ [BigDecimal.new('-3.14'), '-3.14'],
48
+ [BigDecimal.new('1234567.8901234567890'), '1234567.890123456789'],
49
+ [BigDecimal.new('0.00000001'), '0.00000001']
50
+ ]
51
+ test_data.each do |input, expected|
52
+ assert_instance_of(BigDecimal, input)
53
+ assert_equal(expected, FormattedNum.new(input).to_s)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,142 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'test_helper'
21
+ require 'doubles/expression_double'
22
+ require 'functio/errors'
23
+ require 'functio/function'
24
+ require 'storable_interface_test'
25
+
26
+ class TestFunction < Minitest::Test # :nodoc:
27
+ include StorableInterfaceTest
28
+
29
+ def setup
30
+ @object = Function.new(name: 'test', expression: ExpressionDouble.new)
31
+ end
32
+
33
+ def test_build_function
34
+ function = Function.build(name: 'succ', definition: 'x + 1')
35
+ assert_instance_of(Function, function)
36
+ assert_equal('succ', function.name)
37
+ assert_equal('x + 1', function.definition)
38
+ end
39
+
40
+ def test_build_with_invalid_name
41
+ ['1abc', 'ab c', '+!@#'].each do |name|
42
+ ex = assert_raises(InvalidFunctionError) do
43
+ Function.build(name: name, definition: 'x + 1')
44
+ end
45
+ assert_equal('name must be alphanumeric and begin with a letter',
46
+ ex.message)
47
+ end
48
+ end
49
+
50
+ def test_build_with_too_long_name
51
+ ex = assert_raises(InvalidFunctionError) do
52
+ Function.build(name: 'abcdefghijklmnopqrstu', definition: 'x + 1')
53
+ end
54
+ assert_equal(
55
+ "name size can't be greater than #{Function::MAX_NAME_SIZE} characters",
56
+ ex.message)
57
+ end
58
+
59
+ def test_build_with_invalid_definition
60
+ ex = assert_raises(InvalidFunctionError) do
61
+ Function.build(name: 'invalid', definition: 'x +')
62
+ end
63
+ assert_equal('definition must be a valid expression', ex.message)
64
+ end
65
+
66
+ def test_build_with_division_by_zero
67
+ ex = assert_raises(DivisionByZeroError) do
68
+ Function.build(name: 'divbyzero', definition: '1 / 0')
69
+ end
70
+ assert_equal('division by zero', ex.message)
71
+ end
72
+
73
+ def test_instantiate_with_invalid_name
74
+ ['1abc', 'ab c', '+!@#'].each do |name|
75
+ ex = assert_raises(InvalidFunctionError) do
76
+ expr_stub = ExpressionDouble.new(expression: 'a * b')
77
+ Function.new(name: name, expression: expr_stub)
78
+ end
79
+ assert_equal('name must be alphanumeric and begin with a letter',
80
+ ex.message)
81
+ end
82
+ end
83
+
84
+ def test_instantiate_with_too_long_name
85
+ ex = assert_raises(InvalidFunctionError) do
86
+ expr_stub = ExpressionDouble.new(expression: 'a * b')
87
+ Function.new(name: 'abcdefghijklmnopqrstu', expression: expr_stub)
88
+ end
89
+ assert_equal(
90
+ "name size can't be greater than #{Function::MAX_NAME_SIZE} characters",
91
+ ex.message)
92
+ end
93
+
94
+ def test_attributes
95
+ expr_stub = ExpressionDouble.new(expression: 'a * b')
96
+ function = Function.new(name: 'test', expression: expr_stub)
97
+ assert_equal({ name: 'test', definition: 'a * b' }, function.attributes)
98
+ end
99
+
100
+ def test_equals_operator
101
+ add = function('add', 'a + b')
102
+ assert add == function('add', 'a + b')
103
+ refute add == function('sum', 'a + b')
104
+ refute add == function('add', 'x + y')
105
+ refute add == function('sum', 'x + y')
106
+ end
107
+
108
+ def test_function_params
109
+ expr_stub = ExpressionDouble.new(variables: %w(x y z))
110
+ function = Function.new(name: 'test', expression: expr_stub)
111
+ assert_equal(%w(x y z), function.params)
112
+ end
113
+
114
+ def test_use_function
115
+ expr_stub = ExpressionDouble.new(evaluate: -> { 42 })
116
+ function = Function.new(name: 'test', expression: expr_stub)
117
+ assert_equal(42, function.use('x' => 1))
118
+ end
119
+
120
+ def test_use_with_invalid_args
121
+ expr_stub = ExpressionDouble.new(evaluate: -> { nil })
122
+ function = Function.new(name: 'test', expression: expr_stub)
123
+ assert_equal(nil, function.use('x' => 1))
124
+ assert_equal(nil, function.use)
125
+ end
126
+
127
+ def test_use_with_division_by_zero
128
+ expr_stub = ExpressionDouble.new(evaluate: lambda do
129
+ raise DivisionByZeroError, 'division by zero'
130
+ end)
131
+ function = Function.new(name: 'test', expression: expr_stub)
132
+ ex = assert_raises(DivisionByZeroError) { function.use }
133
+ assert_equal('division by zero', ex.message)
134
+ end
135
+
136
+ private
137
+
138
+ def function(name, definition)
139
+ expr = ExpressionDouble.new(expression: definition)
140
+ Function.new(name: name, expression: expr)
141
+ end
142
+ end
@@ -0,0 +1,97 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'test_helper'
21
+ require 'doubles/function_double'
22
+ require 'doubles/storage_double'
23
+ require 'functio/function_repository'
24
+
25
+ class TestFunctionRepository < Minitest::Test # :nodoc:
26
+ def test_add_new_function
27
+ storage_mock = Minitest::Mock.new
28
+ def storage_mock.find(_fields)
29
+ nil
30
+ end
31
+ storage_mock.expect :store, :return, [{ name: 'test', definition: 'a + b' }]
32
+ repo = FunctionRepository.new(storage: storage_mock)
33
+ function = FunctionDouble.build(name: 'test', definition: 'a + b')
34
+
35
+ assert repo.add(function)
36
+
37
+ storage_mock.verify
38
+ end
39
+
40
+ def test_add_function_with_existent_id
41
+ storage_double = StorageDouble.new(
42
+ find: { name: 'test', definition: 'a * b' })
43
+ repo = FunctionRepository.new(storage: storage_double)
44
+ function = FunctionDouble.build(name: 'test', definition: 'a + b')
45
+
46
+ refute repo.add(function)
47
+ end
48
+
49
+ def test_get_all_functions
50
+ stored = [{ name: 'add', definition: 'a + b' },
51
+ { name: 'sub', definition: 'a - b' }]
52
+ storage_double = StorageDouble.new(all: stored)
53
+ repo = FunctionRepository.new(storage: storage_double,
54
+ function_class: FunctionDouble)
55
+ expected = [FunctionDouble.build(stored[0]),
56
+ FunctionDouble.build(stored[1])]
57
+ assert_equal(expected, repo.all)
58
+ end
59
+
60
+ def test_get_all_with_empty_repository
61
+ storage_double = StorageDouble.new(all: [])
62
+ repo = FunctionRepository.new(storage: storage_double,
63
+ function_class: FunctionDouble)
64
+ assert_equal([], repo.all)
65
+ end
66
+
67
+ def test_find_function
68
+ record = { name: 'test', definition: 'a + b' }
69
+ storage_double = StorageDouble.new(find: record)
70
+ repo = FunctionRepository.new(storage: storage_double,
71
+ function_class: FunctionDouble)
72
+ assert_equal(FunctionDouble.build(record), repo.find('test'))
73
+ end
74
+
75
+ def test_find_inexistent_function
76
+ storage_double = StorageDouble.new(find: nil)
77
+ repo = FunctionRepository.new(storage: storage_double,
78
+ function_class: FunctionDouble)
79
+ assert_equal(nil, repo.find('test'))
80
+ end
81
+
82
+ def test_delete_function
83
+ storage_mock = Minitest::Mock.new
84
+ storage_mock.expect :delete, true, [{ name: 'test' }]
85
+ repo = FunctionRepository.new(storage: storage_mock)
86
+
87
+ assert repo.delete('test')
88
+ storage_mock.verify
89
+ end
90
+
91
+ def test_delete_inexistent_function
92
+ storage_double = StorageDouble.new(delete: false)
93
+ repo = FunctionRepository.new(storage: storage_double)
94
+
95
+ refute repo.delete('test')
96
+ end
97
+ end
@@ -0,0 +1,22 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'minitest/autorun'
21
+
22
+ include Functio
@@ -0,0 +1,29 @@
1
+ #--
2
+ # Copyright (C) 2016 Cassiano Rocha Kuplich
3
+ #
4
+ # This file is part of Functio.
5
+ #
6
+ # Functio is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Functio is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Functio. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'license_test_helper'
21
+
22
+ class TestLicensesCompatibility < Minitest::Test # :nodoc:
23
+ def test_licenses_compatibility
24
+ validator = Papers::LicenseValidator.new
25
+
26
+ assert validator.valid?,
27
+ "License validation failed:\n#{validator.errors.join("\n")}"
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: functio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Cassiano Kuplich
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dentaku
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.7
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.7
33
+ - !ruby/object:Gem::Dependency
34
+ name: thor
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.19'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.19'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.11'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.11'
61
+ description: |
62
+ Functio is a calculator that allows you to create and manage functions for your
63
+ recurrent calculations.
64
+ email: crkuplich@openmailbox.org
65
+ executables:
66
+ - fn
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - ".gitignore"
71
+ - CHANGELOG.md
72
+ - COPYING
73
+ - Gemfile
74
+ - Gemfile.lock
75
+ - README.md
76
+ - Rakefile
77
+ - bin/fn
78
+ - features/expression_evaluation.feature
79
+ - features/function_creation.feature
80
+ - features/function_deletion.feature
81
+ - features/function_list.feature
82
+ - features/function_use.feature
83
+ - features/help_option.feature
84
+ - features/step_definitions/steps.rb
85
+ - features/support/env.rb
86
+ - features/support/functio_world.rb
87
+ - features/version_option.feature
88
+ - functio.gemspec
89
+ - lib/functio.rb
90
+ - lib/functio/data_storage.rb
91
+ - lib/functio/errors.rb
92
+ - lib/functio/expression.rb
93
+ - lib/functio/formatted_num.rb
94
+ - lib/functio/functio_cli.rb
95
+ - lib/functio/function.rb
96
+ - lib/functio/function_repository.rb
97
+ - lib/functio/version.rb
98
+ - test/doubles/expression_double.rb
99
+ - test/doubles/function_double.rb
100
+ - test/doubles/storage_double.rb
101
+ - test/doubles/test_expression_double.rb
102
+ - test/doubles/test_function_double.rb
103
+ - test/doubles/test_storage_double.rb
104
+ - test/expression_interface_test.rb
105
+ - test/interface_test_helper.rb
106
+ - test/license_test_helper.rb
107
+ - test/storable_interface_test.rb
108
+ - test/storage_interface_test.rb
109
+ - test/test_data_storage.rb
110
+ - test/test_expression.rb
111
+ - test/test_formatted_num.rb
112
+ - test/test_function.rb
113
+ - test/test_function_repository.rb
114
+ - test/test_helper.rb
115
+ - test/test_licenses_compatibility.rb
116
+ homepage: https://gitlab.com/functio/functio
117
+ licenses:
118
+ - GPL-3.0+
119
+ metadata: {}
120
+ post_install_message:
121
+ rdoc_options: []
122
+ require_paths:
123
+ - lib
124
+ required_ruby_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 2.1.9
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 2.4.8
137
+ signing_key:
138
+ specification_version: 4
139
+ summary: Turn your recurrent calculations into functions
140
+ test_files: []