y_support 2.0.3 → 2.0.5

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
  SHA1:
3
- metadata.gz: a6e8e25158487612ee9fd0d9b88dd3cbaa588767
4
- data.tar.gz: 8e4a78cde0deb07dda57cd9ff93f5f64c4a991be
3
+ metadata.gz: 1e5d5e63041346d0129e1ddbd75122c7e878cf92
4
+ data.tar.gz: b7b2e14abfcac7f070cb3b4a0a264c2086f73bd1
5
5
  SHA512:
6
- metadata.gz: e9c8826eab83bf22364655f6559c5c11114162bd35dee5d01e268f971216d35e4131d5f50100faf01f7644a952a95dcd6d00edd8acb688cd671ec354e3d3d487
7
- data.tar.gz: 0901936832de50bd38831a31deb565af1eaf8f545dec53de62ba54c8a672dfdd0e37602ed796eb6a1cfc871069c001c3bd545ee7e9f6de875c0350f99c0ee767
6
+ metadata.gz: 771724a6d0d9c63655ef996443d1861f3c0cb59d94516393f3d7689669c860f6889fa4bf0cdb1673dda77fdfb6bb2498483cdce8b39e97db55ca8727c827c4e1
7
+ data.tar.gz: 0f4502be79ac39d5415ee965dab65419b58cb5b6dad5d76f646bc1037ba9ae01a65e9c0ad615d9bf584683e70ceb0c7ee21ad939d34842b0b436ad977759eb22
@@ -0,0 +1,132 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'y_support'
3
+ require 'active_support/core_ext/array/extract_options'
4
+
5
+ # FIXME: Now, here, in order for the token game to work properly with
6
+ # guarding system, several things have to be done. Firstly,
7
+ # Place#set_marking( marking, blame ) will have to be implemented,
8
+ # and in Place#add, blame argument will have to be added
9
+ # Now with that blame, the transition will have to explain what it is
10
+ # trying to do. So actually it should be a block
11
+ #
12
+ # It's gonna be a mixin, Conscience, or something like that, and it will
13
+ # imbue the receiving class with the ability to try something.
14
+ #
15
+ # Transition.try "to fire!" do
16
+ # if assignment_action? then
17
+ # note has: "assignment action"
18
+ # note "Δt", is: Δt
19
+ # note "domain marking" is: domain_marking
20
+ # act = note "Action" do Array action( Δt ) end
21
+ # codomain.each_with_index do |place, i|
22
+ # try "set the marking of place #{place} to the #{i}-th element of the action vector (#{act[i]})" do
23
+ # place.marking = act[i]
24
+ # end
25
+ # end
26
+ # else
27
+ # etc. etc. etc.
28
+ # end
29
+ #
30
+ # Should produce error messages like this:
31
+ # When trying to fire! the transition #{self}, having assignment action, with Δt being #{Δt}, action has
32
+ # been computed to #{Array action(Δt)}, when trying to set the marking of plac #{place} to the #{i}-th
33
+ # element of the action vector (#{act[i]}), GuardError was encountered, with the message: ..."
34
+ #
35
+ # Yes, this is a managed code miniframework that I need here.
36
+ #
37
+ module Conscience
38
+ class Try
39
+ PUSH_ORDERED = -> ary, e {
40
+ named = ary.extract_options!
41
+ ary << e << named
42
+ }
43
+ PUSH_NAMED = -> ary, k, v {
44
+ named = ary.extract_options!
45
+ ary << named.update( k => v )
46
+ }
47
+ DECORATE = -> str, prefix: '', postfix: '' {
48
+ str.to_s.tap { |ς| return ς.empty? ? '' : prefix + ς + postfix }
49
+ }
50
+ TRANSITIVE = Hash.new do |ꜧ, key| "#{key}ing %s" end
51
+ .update( is: "being %s",
52
+ has: "having %s" )
53
+ STATE = Hash.new do |ꜧ, key| "#{key} %s" end
54
+ .update( is: "%s",
55
+ has: "has %s" )
56
+
57
+ attr_reader :_object_, :_text_, :_block_, :_facts_
58
+
59
+ def initialize( object: nil, text: nil, &block )
60
+ @_object_, @_text_, @_block_ = object, text, block
61
+ @_facts_ = Hash.new do |ꜧ, key| ꜧ[key] = [ {} ] end
62
+ end
63
+
64
+ def note *subjects, **statements, &block
65
+ return *Array( subjects ).each do |s|
66
+ PUSH_ORDERED.( _facts_[s], s )
67
+ end if statements.empty?
68
+ subjects << _object_ if subjects.empty?
69
+ Array( subjects ).each do |subj|
70
+ statements.each do |verb, object|
71
+ PUSH_NAMED.( _facts_[subj], verb, object )
72
+ end
73
+ end
74
+ return statements.first[1]
75
+ end
76
+
77
+ def call *args
78
+ begin
79
+ instance_exec *args, &_block_
80
+ rescue StandardError => err
81
+ txt1 = "When trying #{_text_}"
82
+ thing, statements = _describe_
83
+ txt2 = DECORATE.( thing, prefix: ' ' )
84
+ txt3 = DECORATE.( statements.map { |verb, object|
85
+ STATE[verb] % object
86
+ }.join( ', ' ),
87
+ prefix: ' (', postfix: ')' )
88
+ txt4 = DECORATE.( _circumstances_, prefix: ', ' )
89
+ txt5 = DECORATE.( "#{err.class} occurred: #{err}", prefix: ', ' )
90
+ raise err, txt1 + txt2 + txt3 + txt4 + txt5
91
+ end
92
+ end
93
+
94
+ def method_missing sym, *args
95
+ _object_.send sym, *args
96
+ end
97
+
98
+ private
99
+
100
+ def _describe_ obj=_object_
101
+ facts = _facts_[obj].dup
102
+ statements = facts.extract_options!
103
+ fs = facts.join ', '
104
+ if statements.empty? then
105
+ return fs, statements
106
+ else
107
+ return facts.empty? ? obj.to_s : fs, statements
108
+ end
109
+ end
110
+
111
+ def _circumstances_
112
+ _facts_.reject { |subj, _| subj == _object_ }.map { |subj, _|
113
+ thing, statements = _describe_( subj )
114
+ thing + DECORATE.( statements.map { |v, o|
115
+ TRANSITIVE[v] % o
116
+ }.join( ', ' ),
117
+ prefix: ' ' )
118
+ }.join( ', ' )
119
+ end
120
+ end
121
+
122
+ # Try method taxes two textual arguments and one block. The first (optional)
123
+ # textual argument describes what is the receiver of #try. The second argument
124
+ # describes in plain speech what activity is #try attempting. The block that
125
+ # follows then contains the code, which performs that activity. In the block,
126
+ # #note method is available, that builds up the context for the error message,
127
+ # if any.
128
+ #
129
+ def try object=self, to_do_something, &block
130
+ Try.new( object: object, text: to_do_something, &block ).call
131
+ end
132
+ end
@@ -42,29 +42,32 @@ module NameMagic
42
42
  # Attach the decorators etc.
43
43
  target.extend ::NameMagic::ClassMethods
44
44
  target.extend ::NameMagic::NamespaceMethods
45
- # Attach namespace methods to also to the namespace, if given.
45
+ # Attach namespace methods also to the namespace, if given.
46
46
  begin
47
- target.namespace.extend ::NameMagic::NamespaceMethods unless
48
- target.namespace == target
47
+ if target.namespace == target then
48
+ target.define_singleton_method :namespace do target end
49
+ else
50
+ target.namespace.extend ::NameMagic::NamespaceMethods
51
+ end
49
52
  rescue NoMethodError
50
53
  end
51
54
  else # it is a Module; we'll infect it with this #included method
52
- included_of_the_target = target.method( :included )
53
- included_of_self = self.method( :included )
54
- pre_included_of_the_target = begin
55
- target.method( :pre_included )
56
- rescue NameError
57
- end
58
- if pre_included_of_the_target then # target has #pre_included hook
55
+ target_included = target.method( :included )
56
+ this_included = self.method( :included )
57
+ target_pre_included = begin
58
+ target.method( :pre_included )
59
+ rescue NameError
60
+ end
61
+ if target_pre_included then # target has #pre_included hook
59
62
  target.define_singleton_method :included do |ç|
60
- pre_included_of_the_target.( ç )
61
- included_of_self.call( ç )
62
- included_of_the_target.call( ç )
63
+ target_pre_included.( ç )
64
+ this_included.( ç )
65
+ target_included.( ç )
63
66
  end
64
67
  else # target has no #pre_included hook
65
68
  target.define_singleton_method :included do |ç|
66
- included_of_self.( ç )
67
- included_of_the_target.( ç )
69
+ this_included.( ç )
70
+ target_included.( ç )
68
71
  end
69
72
  end
70
73
  end
@@ -1,3 +1,3 @@
1
1
  module YSupport
2
- VERSION = "2.0.3"
2
+ VERSION = "2.0.5"
3
3
  end
@@ -0,0 +1,75 @@
1
+ #! /usr/bin/ruby
2
+
3
+ require 'minitest/spec'
4
+ require 'minitest/autorun'
5
+ # require 'y_support/conscience' # tested component itself
6
+ require './../lib/y_support/conscience'
7
+
8
+ include Conscience
9
+
10
+ describe Try do
11
+ before do
12
+ @try = Try.new object: "Dummy", text: "to fire" do
13
+ note is: "dummy"
14
+ note has: "no care in the world"
15
+ n = note "the number", is: 42
16
+ raise TypeError, 'foo'
17
+ end
18
+ end
19
+
20
+ it "should have basic functionality" do
21
+ assert_equal "to fire", @try._text_
22
+ assert_equal "Dummy", @try._object_
23
+ assert_equal 0, @try._facts_.size # haven't tried anything yet
24
+ @try._facts_["something"]
25
+ assert_equal 1, @try._facts_.size
26
+ @try.note is: 'dummy'
27
+ @try.note has: 'no care in the world'
28
+ assert_equal 2, @try._facts_.size
29
+ assert_equal ["something", "Dummy"], @try._facts_.keys
30
+ assert_equal( [ { is: "dummy", has: "no care in the world" } ],
31
+ @try._facts_["Dummy"] )
32
+ assert_equal " hello!", Try::DECORATE.( :hello, prefix: ' ', postfix: '!' )
33
+ assert_equal( ['Dummy', {is: 'dummy', has: 'no care in the world'}],
34
+ @try.send( :_describe_, "Dummy" ) )
35
+ end
36
+
37
+ describe 'case 1' do
38
+ it "should work" do
39
+ begin
40
+ @try.call
41
+ rescue TypeError => err
42
+ expected_msg = "When trying to fire Dummy (dummy, has no care in " +
43
+ "the world), the number being 42, TypeError occurred: foo"
44
+ assert_equal expected_msg, err.message
45
+ else
46
+ flunk "Expected TypeError error not raised!"
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'case 2' do
52
+ it "should work" do
53
+ begin
54
+ try "to call constant Nonexistant" do Nonexistant end
55
+ rescue NameError => err
56
+ expected_msg = 'When trying to call constant Nonexistant, ' +
57
+ 'NameError occurred: uninitialized constant Nonexistant'
58
+ assert_equal( expected_msg, err.message )
59
+ else
60
+ flunk "Expected NameError error not raised!"
61
+ end
62
+ end
63
+ end
64
+
65
+ describe 'case 3' do
66
+ it "should work" do
67
+ o = Object.new
68
+ class << o
69
+ def to_s; "THIS OBJECT" end
70
+ def hello!; "hello hello" end
71
+ end
72
+ o.try "to call a missing method" do hello! end
73
+ end
74
+ end
75
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: y_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - boris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-23 00:00:00.000000000 Z
11
+ date: 2013-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -53,6 +53,7 @@ files:
53
53
  - lib/y_support.rb
54
54
  - lib/y_support/abstract_algebra.rb
55
55
  - lib/y_support/all.rb
56
+ - lib/y_support/conscience.rb
56
57
  - lib/y_support/core_ext.rb
57
58
  - lib/y_support/core_ext/array.rb
58
59
  - lib/y_support/core_ext/array/misc.rb
@@ -94,6 +95,7 @@ files:
94
95
  - lib/y_support/unicode.rb
95
96
  - lib/y_support/version.rb
96
97
  - test/abstract_algebra_test.rb
98
+ - test/conscience_test.rb
97
99
  - test/inert_recorder_test.rb
98
100
  - test/kde_test.rb
99
101
  - test/local_object_test.rb
@@ -131,6 +133,7 @@ summary: LocalObject, RespondTo, InertRecorder, NullObject, NameMagic, core exte
131
133
  typing etc.
132
134
  test_files:
133
135
  - test/abstract_algebra_test.rb
136
+ - test/conscience_test.rb
134
137
  - test/inert_recorder_test.rb
135
138
  - test/kde_test.rb
136
139
  - test/local_object_test.rb