rfunk 1.0.0 → 1.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.
- checksums.yaml +4 -4
- data/lib/rfunk/attribute/attribute.rb +5 -5
- data/lib/rfunk/attribute/attribute_definition.rb +9 -3
- data/lib/rfunk/attribute/attribute_type.rb +1 -2
- data/lib/rfunk/attribute/error_checking.rb +8 -10
- data/lib/rfunk/attribute/function.rb +19 -19
- data/lib/rfunk/attribute/immutable.rb +10 -6
- data/lib/rfunk/attribute/type_annotation.rb +14 -4
- data/lib/rfunk/either/either.rb +1 -1
- data/lib/rfunk/maybe/none.rb +1 -1
- data/lib/rfunk/maybe/some.rb +1 -5
- data/lib/rfunk/version.rb +1 -1
- metadata +25 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b86ea072b8641826aaa1c6ae805f908dfd5e5020
|
4
|
+
data.tar.gz: 14d4524321d24ab95b17cea3d0644c4bdaca7f4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00d216f4079806989219261e8bfea826a0edafe373a3f8a5fa4296473eece58ab37b83b90304152a86a74d29f75c13290e3d09b680f4334334751fb3e457149c
|
7
|
+
data.tar.gz: de6abb927459d4c379a9b146e77f0cb5c5d6d03ef41a2c4e59e7480a264ec7f72fd47f298bea9572593ce7afacbe8670c92187060e9da7201cf8baf3ca6f5632
|
@@ -17,22 +17,22 @@ module RFunk
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def with_defaults
|
20
|
-
attributes.each
|
20
|
+
attributes.each do |key, attribute|
|
21
21
|
value = attribute.options[:default]
|
22
22
|
set_variable(attribute, key, value) if value
|
23
|
-
|
23
|
+
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def with_attributes(options)
|
27
|
-
options.each
|
27
|
+
options.each do |key, value|
|
28
28
|
RFunk::ErrorChecking.new.raise_not_found(key, attributes)
|
29
29
|
set_variable(attributes[key], key, value)
|
30
|
-
|
30
|
+
end
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_variable(attribute, key, value)
|
34
34
|
RFunk::ErrorChecking.new.raise_expected_attribute_type(key, value, attribute.type)
|
35
|
-
|
35
|
+
instance_variable_set(variable_name(key), value)
|
36
36
|
end
|
37
37
|
|
38
38
|
def variable_name(name)
|
@@ -6,16 +6,22 @@ module RFunk
|
|
6
6
|
type: type,
|
7
7
|
options: options)
|
8
8
|
|
9
|
-
|
9
|
+
create_method(name, type)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def create_method(name, type)
|
15
|
+
define_method(name) do |value = nil|
|
10
16
|
if value
|
11
17
|
RFunk::ErrorChecking.new.raise_expected_attribute_type(name, value, type)
|
12
18
|
RFunk::Immutable.new.create(instance: self,
|
13
19
|
variable_name: variable_name(name),
|
14
20
|
value: value)
|
15
21
|
else
|
16
|
-
RFunk::Option(
|
22
|
+
RFunk::Option(instance_variable_get(variable_name(name)))
|
17
23
|
end
|
18
|
-
|
24
|
+
end
|
19
25
|
end
|
20
26
|
end
|
21
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module RFunk
|
2
2
|
class ErrorChecking
|
3
3
|
def raise_condition_error(type, value)
|
4
|
-
|
4
|
+
fail type, 'The condition was not met!' unless value
|
5
5
|
end
|
6
6
|
|
7
7
|
def raise_expected_return_type(name, value, type)
|
@@ -17,16 +17,15 @@ module RFunk
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def raise_not_found(key, attributes)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
20
|
+
return if attributes.key?(key)
|
21
|
+
message = "Attribute with name '#{key}' does not exist. The only available attributes are '#{attributes.keys}'"
|
22
|
+
fail RFunk::NotFoundError, message
|
24
23
|
end
|
25
24
|
|
26
25
|
def raise_immutable(options, variable)
|
27
|
-
keys = options.keys.select { |k| variable.
|
26
|
+
keys = options.keys.select { |k| variable.key?(k) }
|
28
27
|
message = "Could not set variables '#{keys}', because variables are immutable."
|
29
|
-
|
28
|
+
fail RFunk::ImmutableError, message if keys.any?
|
30
29
|
end
|
31
30
|
|
32
31
|
private
|
@@ -52,9 +51,8 @@ module RFunk
|
|
52
51
|
end
|
53
52
|
|
54
53
|
def raise_type(name, value, type, message)
|
55
|
-
|
56
|
-
|
57
|
-
end
|
54
|
+
return if value.is_a?(type)
|
55
|
+
fail TypeError, "Expected a type of '#{type}' for #{message} '#{name}'"
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
@@ -26,7 +26,7 @@ module RFunk
|
|
26
26
|
if yield
|
27
27
|
true
|
28
28
|
else
|
29
|
-
|
29
|
+
fail RFunk::AssertionError
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -43,25 +43,11 @@ module RFunk
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def execute(*args)
|
46
|
-
validate_parameter_types
|
46
|
+
validate_parameter_types(*args)
|
47
47
|
return_value = instance_exec(*args, &block)
|
48
48
|
|
49
49
|
if body_block
|
50
|
-
|
51
|
-
instance_eval(&pre_block).tap { |r|
|
52
|
-
error_checking.raise_condition_error(RFunk::PreConditionError, r)
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
RFunk::Option(instance_eval(&body_block)).tap { |body|
|
57
|
-
if post_block
|
58
|
-
instance_eval(&post_block).tap { |post|
|
59
|
-
error_checking.raise_condition_error(RFunk::PostConditionError, post)
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
validate_return_type(body)
|
64
|
-
}
|
50
|
+
execute_body_block
|
65
51
|
else
|
66
52
|
validate_return_type(return_value)
|
67
53
|
RFunk::Option(return_value)
|
@@ -77,6 +63,20 @@ module RFunk
|
|
77
63
|
attr_reader :block, :pre_block, :post_block, :body_block, :function_definition
|
78
64
|
attr_accessor :variables
|
79
65
|
|
66
|
+
def execute_body_block
|
67
|
+
execute_block pre_block, RFunk::PreConditionError
|
68
|
+
|
69
|
+
RFunk::Option(instance_eval(&body_block)).tap do |body|
|
70
|
+
execute_block post_block, RFunk::PostConditionError
|
71
|
+
validate_return_type(body)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def execute_block(block, error)
|
76
|
+
return unless block
|
77
|
+
instance_eval(&block).tap { |r| error_checking.raise_condition_error(error, r) }
|
78
|
+
end
|
79
|
+
|
80
80
|
def error_checking
|
81
81
|
RFunk::Lazy(-> { RFunk::ErrorChecking.new }).value
|
82
82
|
end
|
@@ -89,10 +89,10 @@ module RFunk
|
|
89
89
|
|
90
90
|
def validate_parameter_types(*args)
|
91
91
|
values = args.zip(type_annotation.parameters)
|
92
|
-
values.each_with_index
|
92
|
+
values.each_with_index do |v, i|
|
93
93
|
tuple = RFunk::Tuple(*v)
|
94
94
|
error_checking.raise_expected_parameter_type(i + 1, tuple.value(0), tuple.value(1))
|
95
|
-
|
95
|
+
end
|
96
96
|
end
|
97
97
|
|
98
98
|
def function_name
|
@@ -5,15 +5,12 @@ module RFunk
|
|
5
5
|
variable_name = options.fetch(:variable_name)
|
6
6
|
value = options.fetch(:value)
|
7
7
|
|
8
|
-
instance.class.new.tap
|
9
|
-
instance
|
10
|
-
previous_value = instance.instance_variable_get(v)
|
11
|
-
object.instance_variable_set(v, previous_value)
|
12
|
-
}
|
8
|
+
instance.class.new.tap do |object|
|
9
|
+
create_instance_variables(instance, object, variable_name)
|
13
10
|
|
14
11
|
object.instance_variable_set(variable_name, value)
|
15
12
|
object.deep_freeze if should_deep_freeze?(value)
|
16
|
-
|
13
|
+
end
|
17
14
|
end
|
18
15
|
|
19
16
|
private
|
@@ -21,5 +18,12 @@ module RFunk
|
|
21
18
|
def should_deep_freeze?(value)
|
22
19
|
['Hamster'].none? { |m| value.class.to_s.include?(m) }
|
23
20
|
end
|
21
|
+
|
22
|
+
def create_instance_variables(instance, object, variable_name)
|
23
|
+
instance.instance_variables.select { |v| v != variable_name }.each do |v|
|
24
|
+
previous_value = instance.instance_variable_get(v)
|
25
|
+
object.instance_variable_set(v, previous_value)
|
26
|
+
end
|
27
|
+
end
|
24
28
|
end
|
25
29
|
end
|
@@ -7,10 +7,20 @@ module RFunk
|
|
7
7
|
split = option.split('->')
|
8
8
|
parameters = split.select { |v| v.count == 2 }
|
9
9
|
|
10
|
-
@parameters = parameters
|
11
|
-
@return =
|
12
|
-
|
13
|
-
|
10
|
+
@parameters = create_parameters(parameters)
|
11
|
+
@return = create_return(split)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def create_parameters(parameters)
|
17
|
+
parameters.flat_map { |v| v[0].split(',').map { |p| Object.const_get(p.strip) } }
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_return(split)
|
21
|
+
RFunk::Option(split.map do |v|
|
22
|
+
v.count == 2 ? Object.const_get(v[1].strip) : Object.const_get(v[0].strip)
|
23
|
+
end.first).value
|
14
24
|
end
|
15
25
|
end
|
16
26
|
end
|
data/lib/rfunk/either/either.rb
CHANGED
data/lib/rfunk/maybe/none.rb
CHANGED
data/lib/rfunk/maybe/some.rb
CHANGED
@@ -32,11 +32,7 @@ module RFunk
|
|
32
32
|
[other, value]
|
33
33
|
end
|
34
34
|
|
35
|
-
[:to_str, :to_ary, :to_hash].each { |k|
|
36
|
-
define_method(k) {
|
37
|
-
value
|
38
|
-
}
|
39
|
-
}
|
35
|
+
[:to_str, :to_ary, :to_hash].each { |k| define_method(k) { value } }
|
40
36
|
|
41
37
|
def_delegators :@value, :to_s, :inspect, :respond_to?, :class
|
42
38
|
|
data/lib/rfunk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rfunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Falkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ice_nine
|
@@ -30,42 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.9.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.9.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: concurrent-ruby-ext
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.9.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.9.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: hamster
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 2.0.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 2.0.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,28 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 3.7.
|
103
|
+
version: 3.7.1
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 3.7.
|
110
|
+
version: 3.7.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.34.2
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.34.2
|
111
125
|
description: See https://github.com/alexfalkowski/rfunk/blob/master/README.md
|
112
126
|
email:
|
113
127
|
- alexrfalkowski@gmail.com
|
@@ -159,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
173
|
version: '0'
|
160
174
|
requirements: []
|
161
175
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.4.
|
176
|
+
rubygems_version: 2.4.5.1
|
163
177
|
signing_key:
|
164
178
|
specification_version: 4
|
165
179
|
summary: Functional Programming in Ruby
|