proinsias 1.2.1 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4cc4afac6b630a03f4902d07c32c2766e7597216ba591488709f5c0f697e0e3f
4
- data.tar.gz: b9be00704bdc30f08c9b50bbf6ede861c8c2648b76b7c3da3db597f670548b4f
3
+ metadata.gz: 35ba319f54215c1e4057977bb3c971672f4e13b80b8958c93fa1b303d6ca64cf
4
+ data.tar.gz: e48229747990bc6c063bf0f49e73ccedc9b9678f59b48b83644f8eafc08a4062
5
5
  SHA512:
6
- metadata.gz: e8cc099af34a51366f9398962420eaa78b0590478d0c542851d06e07c3fb343bfcf5e6095e27fb446eee0d10a0af45b7769e9287ae20630faad8bbff24d59767
7
- data.tar.gz: bd770965e5bee1114d729819169105c678f8e951aa0cc9ea8ade78765c182822116fe4e0b339e76eb3366975ac689cca0326cae252b8154087107f8bc7c43eee
6
+ metadata.gz: f9d3d905224e86a57df7f55b75be5b2d8547396ff229e19b8a452c48314a4bb2f6a05db15414eab89f87179855d432dd04bf2aedb7a28ea7c6362df3f1a3a863
7
+ data.tar.gz: aec80ba887fe727ae85fa98a93f1825a694d1916e995243fa9deaa2d5427a5e08052a4513fc103ace59417e71f62f1b9896728d84bf0d367e9e95d0f9750a119
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- proinsias (1.2.1)
5
- moory (~> 1.2.6)
4
+ proinsias (1.3.0)
5
+ moory (~> 1.3.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  diff-lcs (1.3)
11
- moory (1.2.6)
11
+ moory (1.3.0)
12
12
  rake (10.5.0)
13
13
  rspec (3.8.0)
14
14
  rspec-core (~> 3.8.0)
data/lib/proinsias.rb CHANGED
@@ -2,10 +2,10 @@ require "proinsias/version"
2
2
  require "proinsias/configurations/configurations"
3
3
  require "proinsias/receiver/receiver"
4
4
  require "proinsias/particle/particle"
5
+ require "proinsias/logistic/logistic"
5
6
  require "proinsias/assemblyline/assemblyline"
6
7
  require "proinsias/parser/parser"
7
8
 
8
-
9
9
  module Proinsias
10
10
  # Your code goes here...
11
11
  end
@@ -0,0 +1,132 @@
1
+ require 'moory'
2
+
3
+ module Proinsias
4
+ module Logistic
5
+ module NilExtensions
6
+ refine NilClass do
7
+ def <<(other);end
8
+ end
9
+ end
10
+
11
+ class Unit
12
+ include Moory::Efferent
13
+
14
+ def initialize(rules:, initial:'^')
15
+ @initial = initial
16
+ configure(rules)
17
+ end
18
+
19
+ def issue(stimulus)
20
+ understand?(stimulus) ?
21
+ super :
22
+ bad_stimulus(stimulus)
23
+ end
24
+
25
+ def prime
26
+ @state = @initial
27
+ end
28
+
29
+ private
30
+
31
+ def configure(rules)
32
+ Moory::Loader.load(rules:rules, machine:self)
33
+ prime
34
+ end
35
+
36
+ def bad_stimulus(stimulus)
37
+ raise "Unexpected #{stimulus}"
38
+ end
39
+ end
40
+
41
+ class Controller
42
+ using NilExtensions
43
+
44
+ def initialize(config)
45
+ @config = config
46
+ prepare_units
47
+ end
48
+
49
+ def prepare_units
50
+ create_units
51
+ wire_units
52
+ focus_on(@config[:basis])
53
+ end
54
+
55
+ def units
56
+ @units ||= {}
57
+ end
58
+
59
+ def active_unit
60
+ units[@focus]
61
+ end
62
+
63
+ def deferrals
64
+ @deferrals ||= []
65
+ end
66
+
67
+ def issue(stimulus)
68
+ @consequences = []
69
+
70
+ understand?(stimulus) ?
71
+ distribute(stimulus) :
72
+ nil
73
+ end
74
+
75
+ def understand?(stimulus)
76
+ active_unit.understand?(stimulus)
77
+ end
78
+
79
+ private
80
+
81
+ def create_units
82
+ @config[:specs].each do |name, spec|
83
+ units.store(name, Unit.new(spec))
84
+ end
85
+ end
86
+
87
+ def wire_units
88
+ units.values.each do |v|
89
+ v.repertoire.cram({
90
+ 'defer' => method(:defer),
91
+ 'reconvene' => method(:reconvene),
92
+ })
93
+ end
94
+ end
95
+
96
+ def focus_on(unit_name)
97
+ @focus = unit_name
98
+ end
99
+
100
+ def distribute(stimulus)
101
+ active_unit.issue(stimulus)
102
+ @consequences
103
+ end
104
+
105
+ def defer(unit_name)
106
+ @consequences << :defer
107
+
108
+ deferrals.push(
109
+ {
110
+ name: @focus.clone,
111
+ state: units[@focus].state.clone
112
+ }
113
+ )
114
+ focus_on(unit_name)
115
+ active_unit.prime
116
+ end
117
+
118
+ def reconvene(stimulus=nil)
119
+ raise "Cannot reconvene without prior deferral" if deferrals.empty?
120
+
121
+ @consequences << :reconvene
122
+
123
+ deferrals.pop.tap do |last_deferral|
124
+ focus_on(last_deferral[:name])
125
+ active_unit.state = last_deferral[:state]
126
+ end
127
+
128
+ active_unit.issue(stimulus) if stimulus
129
+ end
130
+ end
131
+ end
132
+ end
@@ -13,7 +13,7 @@ module Proinsias
13
13
  end
14
14
 
15
15
  def controller
16
- @controller ||= Moory::Logistic::Controller.new(
16
+ @controller ||= Proinsias::Logistic::Controller.new(
17
17
  Configurations::get_controller(language)
18
18
  )
19
19
  end
@@ -1,12 +1,57 @@
1
- require 'moory'
2
-
3
1
  module Proinsias
4
- module Filter
2
+ class Filter < Proinsias::Logistic::Unit
3
+ attr_writer :consumer
4
+ attr_writer :quarantine
5
+ attr_reader :buffer
6
+
7
+ IGNORE = [' ', "\t", "\n"]
8
+ DEFAULT_CONSUMER = $stdout.method(:puts)
9
+ IGNORE_UNKNOWN = proc { |c| warn "Warning! Ignoring unknown character: #{c}" }
10
+
5
11
  def Filter.create(consumer:, language:'Propositions')
6
- Moory::Filter.new(
12
+ Proinsias::Filter.new(
7
13
  rules: Configurations.get_filter_rules(language),
8
14
  consumer: consumer
9
15
  )
10
16
  end
17
+
18
+ def initialize(rules:, consumer:DEFAULT_CONSUMER, quarantine:IGNORE_UNKNOWN)
19
+ @buffer = ""
20
+ @consumer = consumer
21
+ @quarantine = quarantine
22
+ super(rules: rules)
23
+ end
24
+
25
+ def configure(rules)
26
+ super
27
+ repertoire.learn(name: 'produce', item: method(:produce))
28
+ end
29
+
30
+ def issue(stimulus)
31
+ return if IGNORE.include?(stimulus)
32
+
33
+ @buffer << stimulus
34
+ super
35
+ end
36
+
37
+ def produce(output)
38
+ consumer.call(@buffer)
39
+ @buffer = ""
40
+ end
41
+
42
+ private
43
+
44
+ def bad_stimulus(stimulus)
45
+ quarantine.call(stimulus)
46
+ @buffer = @buffer.slice(0..-2)
47
+ end
48
+
49
+ def consumer
50
+ @consumer || DEFAULT_CONSUMER
51
+ end
52
+
53
+ def quarantine
54
+ @quarantine || IGNORE_UNKNOWN
55
+ end
11
56
  end
12
57
  end
@@ -1,3 +1,3 @@
1
1
  module Proinsias
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
data/proinsias.gemspec CHANGED
@@ -35,5 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency "rake", "~> 10.0"
36
36
  spec.add_development_dependency "rspec", "~> 3.0"
37
37
 
38
- spec.add_dependency "moory", "~>1.2.6"
38
+ spec.add_dependency "moory", "~>1.3.0"
39
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proinsias
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam W. Grant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-15 00:00:00.000000000 Z
11
+ date: 2018-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.2.6
61
+ version: 1.3.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: 1.2.6
68
+ version: 1.3.0
69
69
  description:
70
70
  email:
71
71
  - adam_grnt@yahoo.co.uk
@@ -93,6 +93,7 @@ files:
93
93
  - lib/proinsias/configurations/filter.rb
94
94
  - lib/proinsias/configurations/form.rb
95
95
  - lib/proinsias/configurations/particle.rb
96
+ - lib/proinsias/logistic/logistic.rb
96
97
  - lib/proinsias/parser/director.rb
97
98
  - lib/proinsias/parser/filter.rb
98
99
  - lib/proinsias/parser/parser.rb