factree 0.3.1 → 0.4.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/README.md +3 -3
- data/factree.gemspec +2 -2
- data/lib/factree/dsl.rb +0 -4
- data/lib/factree/fact_source.rb +105 -0
- data/lib/factree/pathfinder.rb +0 -4
- data/lib/factree/version.rb +1 -1
- data/lib/factree.rb +10 -6
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec4b10d80f3e3fda0f49c30fed2b96130b706d34
|
4
|
+
data.tar.gz: 7f3679094a62023d8f43af067177d43b38f5b76e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9465dfadd4267524ca50b0467bd15d6c4e4df965197ad6357f0f30274421df924e7f6ae2e1e2b07eb3486c015802b1b5847319f18997773fb9cba836f5d07b9
|
7
|
+
data.tar.gz: b5310e3f4992629a79b3b781d602cfb47dfe218cc81200867aa3c3d23936f6d81b489f6514303a0c8290af8f352e4e68e8b54bc588ff697f5684425e54cf6c58
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Factree
|
2
2
|
[](https://rubygems.org/gems/factree)
|
3
|
-
[](https://travis-ci.org/ConsultingMD/factree)
|
4
4
|
|
5
5
|
Factree provides tools for making choices based on a set of facts that are not yet known. You write a decision function that takes a set facts and returns a conclusion. Factree will run your function and make sure it has all of the facts it needs to complete. If it doesn't, then Factree will tell you what's needed to continue.
|
6
6
|
|
@@ -22,7 +22,7 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
[API documentation](http://www.rubydoc.info/
|
25
|
+
[API documentation](http://www.rubydoc.info/gems/factree)
|
26
26
|
|
27
27
|
## Development
|
28
28
|
|
@@ -32,7 +32,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
32
|
|
33
33
|
## Contributing
|
34
34
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/ConsultingMD/factree.
|
36
36
|
|
37
37
|
## License
|
38
38
|
|
data/factree.gemspec
CHANGED
@@ -7,10 +7,10 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "factree"
|
8
8
|
spec.version = Factree::VERSION
|
9
9
|
spec.authors = ["Josh Strater"]
|
10
|
-
spec.email = ["
|
10
|
+
spec.email = ["josh.strater@grandrounds.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{Decision trees that request facts as needed}
|
13
|
-
spec.homepage = "https://github.com/
|
13
|
+
spec.homepage = "https://github.com/ConsultingMD/factree"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
data/lib/factree/dsl.rb
CHANGED
@@ -0,0 +1,105 @@
|
|
1
|
+
module Factree
|
2
|
+
# Mixin to help define fact source classes.
|
3
|
+
module FactSource
|
4
|
+
UndefinedFactError = Class.new(StandardError)
|
5
|
+
UnknownFactError = Class.new(StandardError)
|
6
|
+
|
7
|
+
def self.included(base)
|
8
|
+
base.extend(ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
# Defines a named fact along with a block used to compute the fact's value.
|
13
|
+
#
|
14
|
+
# @param [Symbol] fact_name The new fact's name
|
15
|
+
def def_fact(fact_name, &block)
|
16
|
+
raise ArgumentError, "block required" unless block_given?
|
17
|
+
|
18
|
+
all_fact_procs = fact_procs.merge(fact_name => block).freeze
|
19
|
+
class_variable_set(:@@_fact_procs, all_fact_procs)
|
20
|
+
fact_name
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Array<Symbol>] Names for all of the defined facts, whether their values are known or not.
|
24
|
+
def fact_names
|
25
|
+
fact_procs.keys.freeze
|
26
|
+
end
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
def fact_procs
|
30
|
+
class_variable_defined?(:@@_fact_procs) ?
|
31
|
+
class_variable_get(:@@_fact_procs) :
|
32
|
+
{}.freeze
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Boolean] True if the fact has been defined (using {FactSource.def_fact})
|
36
|
+
def defined?(fact_name)
|
37
|
+
fact_procs.include? fact_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Checks to see if the value of the fact is known.
|
42
|
+
def known?(fact_name)
|
43
|
+
fetch(fact_name) { return false }
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the value of the fact, or nil if the value is unknown
|
48
|
+
def [](fact_name)
|
49
|
+
fetch(fact_name) { nil }
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns the value of the fact.
|
53
|
+
#
|
54
|
+
# If the value is unknown, then the block will be called with the name of the fact. If no block is supplied, then an UnknownFactError will be raised.
|
55
|
+
def fetch(fact_name, &block)
|
56
|
+
ensure_defined fact_name
|
57
|
+
fact_proc = self.class.fact_procs[fact_name]
|
58
|
+
|
59
|
+
fact_value = nil
|
60
|
+
fact_known = catch(UNKNOWN_FACT) do
|
61
|
+
fact_value = instance_eval(&fact_proc)
|
62
|
+
true
|
63
|
+
end
|
64
|
+
return fact_value if fact_known
|
65
|
+
|
66
|
+
fetch_unknown(fact_name, &block)
|
67
|
+
end
|
68
|
+
|
69
|
+
# @api private
|
70
|
+
def ensure_defined(fact_name)
|
71
|
+
unless self.class.defined? fact_name
|
72
|
+
raise UndefinedFactError, "undefined fact referenced: #{fact_name}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# @api private
|
77
|
+
def fetch_unknown(fact_name)
|
78
|
+
return yield(fact_name) if block_given?
|
79
|
+
|
80
|
+
raise UnknownFactError, "unknown fact: #{fact_name}"
|
81
|
+
end
|
82
|
+
|
83
|
+
# A hash mapping all of the known fact names to values.
|
84
|
+
def to_h
|
85
|
+
self.class.fact_procs.flat_map { |fact_name, _fact_proc|
|
86
|
+
fact_known = true
|
87
|
+
fact_value = fetch(fact_name) { fact_known = false }
|
88
|
+
|
89
|
+
fact_known ? [[fact_name, fact_value]] : []
|
90
|
+
}.to_h
|
91
|
+
end
|
92
|
+
|
93
|
+
# Takes several FactSources and returns a single hash containing all of their facts mixed together.
|
94
|
+
def self.to_combined_h(*sources)
|
95
|
+
sources.map(&:to_h).inject({}, &:merge)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Calling this method in a fact proc will signal that the fact's value is unknown.
|
99
|
+
def unknown
|
100
|
+
throw UNKNOWN_FACT
|
101
|
+
end
|
102
|
+
|
103
|
+
UNKNOWN_FACT = "Attempted to determine the value of a fact that is unknown".freeze
|
104
|
+
end
|
105
|
+
end
|
data/lib/factree/pathfinder.rb
CHANGED
data/lib/factree/version.rb
CHANGED
data/lib/factree.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
require "factree/version"
|
2
|
-
require "factree/conclusion"
|
3
|
-
require "factree/path"
|
4
|
-
require "factree/aggregate"
|
5
|
-
require "factree/dsl"
|
6
|
-
|
7
1
|
module Factree
|
2
|
+
autoload :Aggregate, "factree/aggregate"
|
3
|
+
autoload :Conclusion, "factree/conclusion"
|
4
|
+
autoload :DSL, "factree/dsl"
|
5
|
+
autoload :FactSource, "factree/fact_source"
|
6
|
+
autoload :Facts, "factree/facts"
|
7
|
+
autoload :FactsSpy, "factree/facts_spy"
|
8
|
+
autoload :Path, "factree/path"
|
9
|
+
autoload :Pathfinder, "factree/pathfinder"
|
10
|
+
autoload :VERSION, "factree/version"
|
11
|
+
|
8
12
|
extend DSL
|
9
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Strater
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
version: '0.9'
|
83
83
|
description:
|
84
84
|
email:
|
85
|
-
-
|
85
|
+
- josh.strater@grandrounds.com
|
86
86
|
executables: []
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
@@ -102,12 +102,13 @@ files:
|
|
102
102
|
- lib/factree/aggregate.rb
|
103
103
|
- lib/factree/conclusion.rb
|
104
104
|
- lib/factree/dsl.rb
|
105
|
+
- lib/factree/fact_source.rb
|
105
106
|
- lib/factree/facts.rb
|
106
107
|
- lib/factree/facts_spy.rb
|
107
108
|
- lib/factree/path.rb
|
108
109
|
- lib/factree/pathfinder.rb
|
109
110
|
- lib/factree/version.rb
|
110
|
-
homepage: https://github.com/
|
111
|
+
homepage: https://github.com/ConsultingMD/factree
|
111
112
|
licenses:
|
112
113
|
- MIT
|
113
114
|
metadata: {}
|