phenomenal 0.9.0 → 0.11.11.24.3
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.
- 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
|