phenomenal 0.9.0 → 0.11.11.24.3
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README +4 -3
- data/Rakefile +0 -3
- data/demo.rb +24 -0
- data/demo_age.rb +89 -0
- data/demo_dsl.rb +28 -0
- data/lib/phenomenal.rb +2 -15
- data/lib/phenomenal/adaptation.rb +12 -22
- data/lib/phenomenal/context.rb +134 -127
- data/lib/phenomenal/dsl.rb +14 -41
- data/lib/phenomenal/logger.rb +1 -0
- data/lib/phenomenal/manager.rb +35 -117
- data/phenomenal.gemspec +15 -0
- data/{spec → test}/test_classes.rb +0 -3
- data/test/test_cop_adaptation.rb +168 -0
- data/test/test_cop_composition.rb +84 -0
- data/test/test_cop_conflictpolicy.rb +177 -0
- data/test/test_cop_infrastructure.rb +129 -0
- data/test_declaration.rb +18 -0
- metadata +29 -70
- data/lib/phenomenal/feature.rb +0 -8
- data/lib/phenomenal/relationships/context_relationships.rb +0 -22
- data/lib/phenomenal/relationships/dsl.rb +0 -18
- data/lib/phenomenal/relationships/feature_relationships.rb +0 -42
- data/lib/phenomenal/relationships/implication.rb +0 -35
- data/lib/phenomenal/relationships/relationship.rb +0 -42
- data/lib/phenomenal/relationships/relationships_manager.rb +0 -63
- data/lib/phenomenal/relationships/relationships_store.rb +0 -73
- data/lib/phenomenal/relationships/requirement.rb +0 -26
- data/lib/phenomenal/relationships/suggestion.rb +0 -41
- data/lib/phenomenal/version.rb +0 -3
- data/spec/adaptation_spec.rb +0 -64
- data/spec/behavior/adaptation_spec.rb +0 -5
- data/spec/behavior/combined_contexts_spec.rb +0 -5
- data/spec/behavior/composition_spec.rb +0 -5
- data/spec/behavior/conflict_policy_spec.rb +0 -5
- data/spec/behavior/open_context.rb +0 -5
- data/spec/behavior/relationships_spec.rb +0 -249
- data/spec/context_spec.rb +0 -268
- data/spec/dsl_spec.rb +0 -181
- data/spec/feature_spec.rb +0 -5
- data/spec/manager_spec.rb +0 -84
- data/spec/proc_spec.rb +0 -20
- data/spec/relationships/context_relationships_spec.rb +0 -13
- data/spec/relationships/dsl_spec.rb +0 -13
- data/spec/relationships/feature_relationships_spec.rb +0 -13
- data/spec/relationships/relationship_spec.rb +0 -31
- data/spec/relationships/relationships_manager_spec.rb +0 -15
- data/spec/relationships/relationships_store_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -18
@@ -0,0 +1,84 @@
|
|
1
|
+
require_relative "../lib/phenomenal.rb"
|
2
|
+
require_relative "./test_classes.rb"
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
class TestCopComposition < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
phen_define_context(:screening)
|
8
|
+
phen_add_adaptation(:screening,Phone,:advertise) do |a_call|
|
9
|
+
phen_proceed(a_call)+" with screening"
|
10
|
+
end
|
11
|
+
phen_define_context(:test)
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
while phen_context_active?(:test) do
|
16
|
+
phen_deactivate_context(:test)
|
17
|
+
end
|
18
|
+
phen_forget_context(:test)
|
19
|
+
|
20
|
+
while phen_context_active?(:screening) do
|
21
|
+
phen_deactivate_context(:screening)
|
22
|
+
end
|
23
|
+
phen_forget_context(:screening)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_invalid_proceed
|
27
|
+
assert_raise(Phenomenal::Error, %(
|
28
|
+
Proceed cannot be used outside adaptation of
|
29
|
+
other methods)) {phen_proceed}
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_simple_composition_noargs
|
33
|
+
prefix = "It's a nice "
|
34
|
+
suffix = "simple composition"
|
35
|
+
composed = prefix+suffix
|
36
|
+
inst = TestClass.new(prefix)
|
37
|
+
phen_add_adaptation(:test,String,:to_s) {phen_proceed+suffix}
|
38
|
+
assert(inst.to_s==prefix,
|
39
|
+
"The base to_s method of String must have its default behaviour")
|
40
|
+
phen_activate_context(:test)
|
41
|
+
assert(inst.to_s==composed,
|
42
|
+
%(The adapted to_s method of String must had '#{suffix}'
|
43
|
+
at the end of the string))
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_simple_composition_args
|
47
|
+
str="Nice String!"
|
48
|
+
inst= TestClass.new(str)
|
49
|
+
phen_add_adaptation(:test,String,:eql?) do | str |
|
50
|
+
if phen_proceed(str)
|
51
|
+
"OK"
|
52
|
+
else
|
53
|
+
"KO"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
assert(inst.eql?(str),
|
57
|
+
"The base eql? method of String must have its default behaviour")
|
58
|
+
phen_activate_context(:test)
|
59
|
+
assert(inst.eql?(str)=="OK",
|
60
|
+
%(The adapted eql? method of String must return 'OK' if the two string
|
61
|
+
are equal))
|
62
|
+
assert(inst.eql?(str+str)=="KO",
|
63
|
+
%(The adapted eql? method of String must return 'KO' if the two string
|
64
|
+
are not equal))
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_nested_activation
|
68
|
+
phone = Phone.new
|
69
|
+
call = Call.new("Alice")
|
70
|
+
phone.receive(call)
|
71
|
+
|
72
|
+
assert((phone.advertise(call))=="ringtone",
|
73
|
+
"Default behaviour should be expressed")
|
74
|
+
phen_activate_context(:screening)
|
75
|
+
assert((phone.advertise(call))=="ringtone with screening",
|
76
|
+
%(Screening information should be overlaid over the default ringtone
|
77
|
+
advertisement'.))
|
78
|
+
phen_deactivate_context(:screening)
|
79
|
+
assert((phone.advertise(call))=="ringtone",
|
80
|
+
"Default behaviour should be expressed")
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require_relative "../lib/phenomenal.rb"
|
2
|
+
require_relative "./test_classes.rb"
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
class TestCopConflictPolicy < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
phen_define_context(:screening)
|
8
|
+
phen_add_adaptation(:screening,Phone,:advertise) do |a_call|
|
9
|
+
phen_proceed(a_call)+" with screening"
|
10
|
+
end
|
11
|
+
|
12
|
+
phen_define_context(:quiet)
|
13
|
+
phen_add_adaptation(:quiet,Phone,:advertise){|a_call| "vibrator" }
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
while phen_context_active?(:screening) do
|
19
|
+
phen_deactivate_context(:screening)
|
20
|
+
end
|
21
|
+
phen_forget_context(:screening)
|
22
|
+
|
23
|
+
while phen_context_active?(:quiet) do
|
24
|
+
phen_deactivate_context(:quiet)
|
25
|
+
end
|
26
|
+
phen_forget_context(:quiet)
|
27
|
+
phen_change_conflict_policy { |a,b| no_resolution_conflict_policy(a,b) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_no_resolution_policy
|
31
|
+
assert_nothing_raised(Phenomenal::Error,"The first context have to be
|
32
|
+
activated without any problem"){phen_activate_context(:screening)}
|
33
|
+
assert_raise(Phenomenal::Error,"In the default policy, a second context
|
34
|
+
that adapt the same method and is not the default one cannot
|
35
|
+
be activated"){phen_activate_context(:quiet)}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_protocol_age_policy
|
39
|
+
assert(phen_context_informations(
|
40
|
+
phen_default_context)[:activation_age].kind_of?(Fixnum),
|
41
|
+
"Contexts should have the age property")
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_activation_age_policy
|
45
|
+
phen_change_conflict_policy { |a,b| age_conflict_policy(a,b) }
|
46
|
+
puts "llll #{phen_default_context.class}"
|
47
|
+
assert(phen_context_active?(phen_default_context),
|
48
|
+
"Default context should normally be active")
|
49
|
+
assert(!phen_context_active?(:screening), "Context1 should be inactive")
|
50
|
+
assert(!phen_context_active?(:quiet),"Context2 should be inactive")
|
51
|
+
|
52
|
+
phen_activate_context(:screening)
|
53
|
+
assert(phen_context_informations(:screening)[:activation_age] <
|
54
|
+
phen_context_informations(phen_default_context)[:activation_age],
|
55
|
+
"screening context has been activated more recently than default")
|
56
|
+
|
57
|
+
phen_activate_context(:quiet)
|
58
|
+
assert(phen_context_informations(:quiet)[:activation_age] <
|
59
|
+
phen_context_informations(:screening)[:activation_age],
|
60
|
+
"quiet context has been activated more recently than screening")
|
61
|
+
assert(phen_context_informations(:screening)[:activation_age] <
|
62
|
+
phen_context_informations(phen_default_context)[:activation_age],
|
63
|
+
"quiet context has still been activated more recently than default")
|
64
|
+
phen_deactivate_context(:quiet)
|
65
|
+
phen_deactivate_context(:screening)
|
66
|
+
phen_activate_context(:screening)
|
67
|
+
assert(phen_context_informations(:screening)[:activation_age] <
|
68
|
+
phen_context_informations(:quiet)[:activation_age],
|
69
|
+
"screening context has now been activated more recently than quiet")
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_conflicting_activation_age_policy
|
73
|
+
phen_change_conflict_policy { |a,b| age_conflict_policy(a,b) }
|
74
|
+
assert_nothing_raised(Phenomenal::Error,"The first context have to be
|
75
|
+
activated without any problem"){phen_activate_context(:screening)}
|
76
|
+
assert_nothing_raised(Phenomenal::Error,"In the age policy, a second context
|
77
|
+
that adapt the same method and is not the default one should
|
78
|
+
be activated without error"){phen_activate_context(:quiet)}
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_interleaved_activation_age_policy
|
82
|
+
phen_change_conflict_policy { |a,b| age_conflict_policy(a,b) }
|
83
|
+
phone = Phone.new
|
84
|
+
call = Call.new("Alice")
|
85
|
+
phone.receive(call)
|
86
|
+
|
87
|
+
assert((phone.advertise(call))=="ringtone",
|
88
|
+
"Default behaviour should be expressed --> ringtone")
|
89
|
+
|
90
|
+
phen_activate_context(:quiet)
|
91
|
+
assert((phone.advertise(call))=="vibrator",
|
92
|
+
"Call advertisement should adapt to quiet context")
|
93
|
+
|
94
|
+
phen_activate_context(:screening)
|
95
|
+
assert((phone.advertise(call))=="vibrator with screening",
|
96
|
+
"Screening information should be overlaid over quiet context behaviour
|
97
|
+
(vibrator)")
|
98
|
+
|
99
|
+
phen_deactivate_context(:quiet)
|
100
|
+
assert((phone.advertise(call))=="ringtone with screening",
|
101
|
+
"Screening information should be overlaid over default context behaviour
|
102
|
+
(ringtone)")
|
103
|
+
|
104
|
+
phen_deactivate_context(:screening)
|
105
|
+
assert((phone.advertise(call))=="ringtone",
|
106
|
+
"Call advertisement should be reverted to the default")
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_nested_activation_age_policy
|
110
|
+
phen_change_conflict_policy { |a,b| age_conflict_policy(a,b) }
|
111
|
+
phone = Phone.new
|
112
|
+
call = Call.new("Alice")
|
113
|
+
phone.receive(call)
|
114
|
+
|
115
|
+
assert((phone.advertise(call))=="ringtone",
|
116
|
+
"Default behaviour should be expressed --> ringtone")
|
117
|
+
|
118
|
+
phen_activate_context(:quiet)
|
119
|
+
assert((phone.advertise(call))=="vibrator",
|
120
|
+
"Call advertisement should adapt to quiet context")
|
121
|
+
|
122
|
+
phen_activate_context(:screening)
|
123
|
+
assert((phone.advertise(call))=="vibrator with screening",
|
124
|
+
"Screening information should be overlaid over quiet context behaviour
|
125
|
+
(vibrator)")
|
126
|
+
|
127
|
+
phen_deactivate_context(:screening)
|
128
|
+
assert((phone.advertise(call))=="vibrator",
|
129
|
+
"Call advertisement should be reverted to that of quiet context")
|
130
|
+
|
131
|
+
phen_deactivate_context(:quiet)
|
132
|
+
assert((phone.advertise(call))=="ringtone",
|
133
|
+
"Call advertisement should be reverted to the default")
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_4_level_age_policy
|
137
|
+
phen_change_conflict_policy { |a,b| age_conflict_policy(a,b) }
|
138
|
+
phen_define_context(:level1)
|
139
|
+
phen_add_adaptation(:level1,TestClass,:print) do |arg|
|
140
|
+
phen_proceed(arg) + " 1 -> ARG1: #{arg.to_s}"
|
141
|
+
end
|
142
|
+
|
143
|
+
phen_define_context(:level2)
|
144
|
+
phen_add_adaptation(:level2,TestClass,:print) do |arg|
|
145
|
+
phen_proceed(arg) + " 2 -> ARG2: #{arg.to_s}"
|
146
|
+
end
|
147
|
+
|
148
|
+
phen_define_context(:level3)
|
149
|
+
phen_add_adaptation(:level3,TestClass,:print) do |arg|
|
150
|
+
phen_proceed(arg) + " 3 -> ARG3: #{arg.to_s}"
|
151
|
+
end
|
152
|
+
|
153
|
+
phen_define_context(:level4)
|
154
|
+
phen_add_adaptation(:level4,TestClass,:print) do |arg|
|
155
|
+
phen_proceed(arg) + " 4 -> ARG4: #{arg.to_s}"
|
156
|
+
end
|
157
|
+
t = TestClass.new("Foo")
|
158
|
+
assert(t.print("bar")=="0 -> ARG: bar",
|
159
|
+
"Default behaviour should be expressed")
|
160
|
+
phen_activate_context(:level1)
|
161
|
+
phen_activate_context(:level2)
|
162
|
+
phen_activate_context(:level3)
|
163
|
+
phen_activate_context(:level4)
|
164
|
+
assert(t.print("bar")==
|
165
|
+
"0 -> ARG: bar 1 -> ARG1: bar 2 -> ARG2: bar 3 -> ARG3: bar 4 -> ARG4: bar",
|
166
|
+
"Composed behaviour should be expressed")
|
167
|
+
phen_deactivate_context(:level1)
|
168
|
+
phen_forget_context(:level1)
|
169
|
+
phen_deactivate_context(:level2)
|
170
|
+
phen_forget_context(:level2)
|
171
|
+
phen_deactivate_context(:level3)
|
172
|
+
phen_forget_context(:level3)
|
173
|
+
phen_deactivate_context(:level4)
|
174
|
+
phen_forget_context(:level4)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require_relative "../lib/phenomenal.rb"
|
2
|
+
require "test/unit"
|
3
|
+
|
4
|
+
class TestCopInfrastructure < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@cm = Phenomenal::Manager.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_protocol
|
10
|
+
context = Phenomenal::Context.new(:test)
|
11
|
+
assert(Phenomenal::Context, "The class Phenomenal::Context doesn't exist")
|
12
|
+
assert(@cm, "The class @cm exist")
|
13
|
+
assert_respond_to(context, :activate, "The activate method doesn't exist")
|
14
|
+
assert_respond_to(context, :deactivate,
|
15
|
+
"The deactivate method doesn't exist")
|
16
|
+
assert_respond_to(context, :active?, "The is_active method doesn't exist")
|
17
|
+
@cm.unregister_context(context)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_creation
|
21
|
+
context = Phenomenal::Context.new(:test)
|
22
|
+
assert_kind_of(Phenomenal::Context, context,
|
23
|
+
"A fresh instance should be contexts indeed")
|
24
|
+
assert(
|
25
|
+
(context.active?.is_a?(TrueClass) || context.active?.is_a?(FalseClass)),
|
26
|
+
"The context should be either active (true) or inactive (false).")
|
27
|
+
assert(!context.active?, "A fresh context should not be initially active.")
|
28
|
+
@cm.unregister_context(context)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_activation
|
32
|
+
context_name=:test
|
33
|
+
context = Phenomenal::Context.new(context_name)
|
34
|
+
assert(!context.active?, "A fresh context should not be initially active.")
|
35
|
+
assert_equal(context,context.activate,
|
36
|
+
"Phenomenal::Context activation should return the context")
|
37
|
+
assert(context.active?,
|
38
|
+
"Activation should leave the context in an active state")
|
39
|
+
assert_equal(context,context.deactivate,
|
40
|
+
"Phenomenal::Context deactivation should return the context")
|
41
|
+
assert(!context.active?,
|
42
|
+
"Deactivation should leave the context in an inactive state")
|
43
|
+
@cm.unregister_context(context)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_redundant_activation
|
47
|
+
context = Phenomenal::Context.new(:test)
|
48
|
+
assert(!context.active?, "A fresh context should not be initially active.")
|
49
|
+
10.times { context.activate }
|
50
|
+
assert(context.active?,
|
51
|
+
"Activation should leave the context in an active state")
|
52
|
+
9.times { context.deactivate }
|
53
|
+
assert(context.active?,
|
54
|
+
"Should stay active for fewer deactivations than activations")
|
55
|
+
context.deactivate
|
56
|
+
assert(!context.active?,
|
57
|
+
"Should become inactive after matching number of deactivations")
|
58
|
+
@cm.unregister_context(context)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_redundant_deactivation
|
62
|
+
context = Phenomenal::Context.new(:test)
|
63
|
+
assert(!context.active?, "A fresh context should not be initially active.")
|
64
|
+
3.times { context.activate }
|
65
|
+
assert(context.active?,
|
66
|
+
"Activation should leave the context in an active state")
|
67
|
+
9.times { context.deactivate }
|
68
|
+
assert(!context.active?,
|
69
|
+
"More deactivation than activation leave the context inactive")
|
70
|
+
context.activate
|
71
|
+
assert(context.active?,
|
72
|
+
"Deactivation does not accumulate once the context is already inactive")
|
73
|
+
context.deactivate
|
74
|
+
assert(!context.active?,
|
75
|
+
"Deactivation does not accumulate once the context is already inactive")
|
76
|
+
@cm.unregister_context(context)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_context_name
|
80
|
+
context_name = :test
|
81
|
+
context = Phenomenal::Context.new(context_name)
|
82
|
+
assert_respond_to(context, :name, "Contexts should have a name")
|
83
|
+
assert_equal(context_name,context.name,
|
84
|
+
"A fresh context should be the definition name")
|
85
|
+
@cm.unregister_context(context)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_default
|
89
|
+
assert_nothing_raised(Phenomenal::Error,"Default context should exist"){
|
90
|
+
@cm.default_context.informations[:name]}
|
91
|
+
|
92
|
+
assert(@cm.default_context.active?,
|
93
|
+
"The default context should normally be active")
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_default_forget
|
97
|
+
old_informations = @cm.default_context.informations
|
98
|
+
assert_respond_to(@cm, :unregister_context,
|
99
|
+
"Method to drop unneeded contexts should exist")
|
100
|
+
assert(@cm.default_context.active?,
|
101
|
+
"The default context should be initialy active")
|
102
|
+
assert_raise(Phenomenal::Error,
|
103
|
+
"An active context cannot be thrown away"){
|
104
|
+
@cm.default_context.forget }
|
105
|
+
@cm.default_context.deactivate
|
106
|
+
assert(!@cm.default_context.active?, "Default should be inactive")
|
107
|
+
assert_nothing_raised(Phenomenal::Error,
|
108
|
+
"It should be possible to forget an inactive context"){
|
109
|
+
@cm.default_context.forget }
|
110
|
+
assert_nothing_raised(Phenomenal::Error,
|
111
|
+
%(Default context assumptions should hold for freshly
|
112
|
+
created default context)){
|
113
|
+
@cm.default_context.activate }
|
114
|
+
#TODO
|
115
|
+
#assert(old_informations[:creation_time]!=
|
116
|
+
#@cm.context_informations(:default)[:creation_time],
|
117
|
+
#"Fresh default context should not be the default context just forgotten")
|
118
|
+
assert(@cm.default_context.activate, "Default should be active")
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_adaptation_api
|
122
|
+
assert_respond_to(@cm, :register_adaptation,
|
123
|
+
"Phenomenal::Context manager should allow to adapt methods")
|
124
|
+
|
125
|
+
assert_respond_to(@cm, :unregister_adaptation,
|
126
|
+
"Phenomenal::Context manager should allow to deadapt methods")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
data/test_declaration.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'lib/phenomenal.rb'
|
2
|
+
class TestClass
|
3
|
+
def print(p)
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Phenomenal::TestDeclaration
|
8
|
+
act_as_context :persistent
|
9
|
+
|
10
|
+
adaptations_for TestClass
|
11
|
+
adapt :print do |p|
|
12
|
+
puts p
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Phenomenal::Manager.instance.find_context("Phenomenal::TestDeclaration").activate
|
17
|
+
puts Phenomenal::Manager.instance.find_context("Phenomenal::TestDeclaration").persistent
|
18
|
+
TestClass.new.print("plop")
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: phenomenal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.11.11.24.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Loic Vigneron - Thibault Poncelet
|
@@ -10,21 +10,16 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
version: "2.5"
|
24
|
-
type: :development
|
25
|
-
version_requirements: *id001
|
26
|
-
description: A context oriented programming framework for Ruby
|
27
|
-
email: team@phenomenal-gem.com
|
13
|
+
date: 2011-10-07 00:00:00 Z
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: |
|
17
|
+
Build gem command:
|
18
|
+
gem build phenomenal.gemspec
|
19
|
+
Test gem command:
|
20
|
+
rake test
|
21
|
+
|
22
|
+
email: thibault.poncelet@student.uclouvain.be - loic.vigneron@student.uclouvain.be
|
28
23
|
executables: []
|
29
24
|
|
30
25
|
extensions: []
|
@@ -32,48 +27,27 @@ extensions: []
|
|
32
27
|
extra_rdoc_files: []
|
33
28
|
|
34
29
|
files:
|
30
|
+
- test/test_cop_conflictpolicy.rb
|
31
|
+
- test/test_cop_infrastructure.rb
|
32
|
+
- test/test_classes.rb
|
33
|
+
- test/test_cop_composition.rb
|
34
|
+
- test/test_cop_adaptation.rb
|
35
|
+
- README
|
36
|
+
- phenomenal.gemspec
|
37
|
+
- LICENSE
|
38
|
+
- test_declaration.rb
|
39
|
+
- demo_dsl.rb
|
40
|
+
- demo_age.rb
|
41
|
+
- demo.rb
|
35
42
|
- lib/phenomenal/manager.rb
|
36
|
-
- lib/phenomenal/feature.rb
|
37
43
|
- lib/phenomenal/proc.rb
|
38
44
|
- lib/phenomenal/conflict_policies.rb
|
39
45
|
- lib/phenomenal/dsl.rb
|
40
|
-
- lib/phenomenal/version.rb
|
41
|
-
- lib/phenomenal/relationships/implication.rb
|
42
|
-
- lib/phenomenal/relationships/relationships_store.rb
|
43
|
-
- lib/phenomenal/relationships/relationship.rb
|
44
|
-
- lib/phenomenal/relationships/requirement.rb
|
45
|
-
- lib/phenomenal/relationships/dsl.rb
|
46
|
-
- lib/phenomenal/relationships/relationships_manager.rb
|
47
|
-
- lib/phenomenal/relationships/context_relationships.rb
|
48
|
-
- lib/phenomenal/relationships/suggestion.rb
|
49
|
-
- lib/phenomenal/relationships/feature_relationships.rb
|
50
46
|
- lib/phenomenal/context.rb
|
51
47
|
- lib/phenomenal/logger.rb
|
52
48
|
- lib/phenomenal/adaptation.rb
|
53
49
|
- lib/phenomenal.rb
|
54
|
-
- LICENSE
|
55
50
|
- Rakefile
|
56
|
-
- README
|
57
|
-
- spec/spec_helper.rb
|
58
|
-
- spec/feature_spec.rb
|
59
|
-
- spec/context_spec.rb
|
60
|
-
- spec/behavior/composition_spec.rb
|
61
|
-
- spec/behavior/combined_contexts_spec.rb
|
62
|
-
- spec/behavior/adaptation_spec.rb
|
63
|
-
- spec/behavior/open_context.rb
|
64
|
-
- spec/behavior/conflict_policy_spec.rb
|
65
|
-
- spec/behavior/relationships_spec.rb
|
66
|
-
- spec/test_classes.rb
|
67
|
-
- spec/manager_spec.rb
|
68
|
-
- spec/adaptation_spec.rb
|
69
|
-
- spec/relationships/relationships_store_spec.rb
|
70
|
-
- spec/relationships/relationship_spec.rb
|
71
|
-
- spec/relationships/feature_relationships_spec.rb
|
72
|
-
- spec/relationships/dsl_spec.rb
|
73
|
-
- spec/relationships/context_relationships_spec.rb
|
74
|
-
- spec/relationships/relationships_manager_spec.rb
|
75
|
-
- spec/dsl_spec.rb
|
76
|
-
- spec/proc_spec.rb
|
77
51
|
homepage: http://www.phenomenal-gem.com
|
78
52
|
licenses: []
|
79
53
|
|
@@ -100,25 +74,10 @@ rubyforge_project:
|
|
100
74
|
rubygems_version: 1.8.11
|
101
75
|
signing_key:
|
102
76
|
specification_version: 3
|
103
|
-
summary: A context oriented
|
77
|
+
summary: A context oriented programing framework for ruby
|
104
78
|
test_files:
|
105
|
-
-
|
106
|
-
-
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
110
|
-
- spec/behavior/adaptation_spec.rb
|
111
|
-
- spec/behavior/open_context.rb
|
112
|
-
- spec/behavior/conflict_policy_spec.rb
|
113
|
-
- spec/behavior/relationships_spec.rb
|
114
|
-
- spec/test_classes.rb
|
115
|
-
- spec/manager_spec.rb
|
116
|
-
- spec/adaptation_spec.rb
|
117
|
-
- spec/relationships/relationships_store_spec.rb
|
118
|
-
- spec/relationships/relationship_spec.rb
|
119
|
-
- spec/relationships/feature_relationships_spec.rb
|
120
|
-
- spec/relationships/dsl_spec.rb
|
121
|
-
- spec/relationships/context_relationships_spec.rb
|
122
|
-
- spec/relationships/relationships_manager_spec.rb
|
123
|
-
- spec/dsl_spec.rb
|
124
|
-
- spec/proc_spec.rb
|
79
|
+
- test/test_cop_conflictpolicy.rb
|
80
|
+
- test/test_cop_infrastructure.rb
|
81
|
+
- test/test_classes.rb
|
82
|
+
- test/test_cop_composition.rb
|
83
|
+
- test/test_cop_adaptation.rb
|