engine-rea 0.2.1 → 0.2.2
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/VERSION +1 -1
- data/app/models/rea/category.rb +4 -0
- data/app/models/rea/category_member.rb +1 -0
- data/app/models/rea/category_type.rb +1 -1
- data/app/models/rea/group.rb +17 -6
- data/app/models/rea/group_type.rb +7 -0
- data/app/models/rea/identifier.rb +12 -3
- data/config/locales/en.yml +4 -0
- data/config/locales/zh-CN.yml +42 -0
- data/db/migrate/20120601074531_create_rea_category_types.rb +1 -1
- data/db/migrate/20120601074540_create_rea_categories.rb +1 -1
- data/db/migrate/20120605030658_create_rea_groups.rb +14 -3
- data/db/migrate/20120605082028_create_rea_identifiers.rb +2 -2
- data/db/migrate/20120717080004_create_rea_group_types.rb +7 -0
- data/engine-rea.gemspec +31 -14
- data/lib/generators/rea/install/install_generator.rb +8 -0
- data/lib/rails_patch.rb +26 -0
- data/lib/rea.rb +25 -1
- data/lib/rea/application.rb +86 -0
- data/lib/rea/aspect_type.rb +28 -6
- data/lib/rea/aspect_type/base.rb +3 -2
- data/lib/rea/aspect_type/classification.rb +142 -0
- data/lib/rea/aspect_type/description.rb +3 -2
- data/lib/rea/aspect_type/due_date.rb +34 -0
- data/lib/rea/aspect_type/identification.rb +38 -0
- data/lib/rea/engine.rb +1 -3
- data/lib/rea/meta_type.rb +1 -1
- data/lib/rea/meta_type/agent.rb +1 -1
- data/lib/rea/meta_type/commitment.rb +5 -6
- data/lib/rea/meta_type/contract.rb +17 -4
- data/lib/rea/meta_type/conversion.rb +6 -0
- data/lib/rea/meta_type/entity.rb +61 -20
- data/lib/rea/meta_type/event.rb +17 -24
- data/lib/rea/meta_type/exchange.rb +6 -0
- data/lib/rea/meta_type/group.rb +25 -0
- data/lib/rea/meta_type/process.rb +28 -0
- data/lib/rea/meta_type/resource.rb +5 -1
- data/lib/rea/model.rb +65 -0
- data/lib/rea/settings.rb +58 -0
- data/spec/dummy/db/schema.rb +1 -56
- data/spec/generators/rea/install/install_generator_spec.rb +2 -0
- data/spec/models/rea/category_member_spec.rb +5 -1
- data/spec/models/rea/category_spec.rb +19 -1
- data/spec/models/rea/category_type_spec.rb +24 -1
- data/spec/models/rea/group_spec.rb +34 -1
- data/spec/models/rea/group_type_spec.rb +8 -0
- data/spec/rea/application_spec.rb +8 -0
- data/spec/rea/aspect_type/classification_spec.rb +107 -0
- data/spec/rea/aspect_type/due_date_spec.rb +75 -0
- data/spec/rea/aspect_type/identification_spec.rb +64 -0
- data/spec/rea/aspect_type_spec.rb +44 -0
- data/spec/rea/engine_spec.rb +0 -3
- data/spec/rea/meta_type/agent_spec.rb +28 -0
- data/spec/rea/meta_type/commitment_spec.rb +45 -0
- data/spec/rea/meta_type/contract_spec.rb +42 -0
- data/spec/rea/meta_type/entity_spec.rb +58 -0
- data/spec/rea/meta_type/event_spec.rb +21 -0
- data/spec/rea/meta_type/group_spec.rb +55 -0
- data/spec/rea/meta_type/process_spec.rb +5 -0
- data/spec/rea/meta_type/resource_spec.rb +65 -0
- data/spec/rea/meta_type_spec.rb +1 -1
- data/spec/rea/model_spec.rb +79 -0
- metadata +32 -15
- data/app/models/rea/group_entity.rb +0 -7
- data/db/migrate/20120605030708_create_rea_group_entities.rb +0 -9
- data/lib/rea/aspect_type/classification_aspect.rb +0 -75
- data/lib/rea/aspect_type/due_date_type.rb +0 -5
- data/lib/rea/aspect_type/identifier_setup.rb +0 -7
- data/lib/rea/dsl.rb +0 -24
- data/lib/rea/dsl/behavioral.rb +0 -50
- data/lib/rea/dsl/structural.rb +0 -53
- data/spec/models/rea/group_entity_spec.rb +0 -5
- data/spec/rea/dsl/behavioral_spec.rb +0 -149
- data/spec/rea/dsl/structural_spec.rb +0 -299
- data/spec/rea/dsl_spec.rb +0 -11
data/lib/rea/aspect_type.rb
CHANGED
@@ -1,11 +1,33 @@
|
|
1
1
|
module Rea
|
2
2
|
module AspectType
|
3
|
+
|
3
4
|
autoload :Base, 'rea/aspect_type/base'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
|
6
|
+
TYPES = %W{identification classification due_date description}
|
7
|
+
|
8
|
+
TYPES.each do |type|
|
9
|
+
require "rea/aspect_type/#{type}"
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
TYPES.each do |pattern|
|
15
|
+
define_method pattern do |*names, &block|
|
16
|
+
$options = names.extract_options!
|
17
|
+
$options.merge! :base=>self
|
18
|
+
self.send :include, "Rea::AspectType::#{pattern.camelize}".constantize
|
19
|
+
self.send :cattr_accessor, "#{pattern}_aspect".to_sym
|
20
|
+
if names.size == 0
|
21
|
+
names << "%s_%s_aspect" % [self.name.underscore, pattern]
|
22
|
+
end
|
23
|
+
names.each do |name|
|
24
|
+
$aspect = "Rea::AspectType::#{pattern.camelize}::Aspect".constantize.new($options)
|
25
|
+
$aspect.instance_eval &block if block
|
26
|
+
self.send "#{pattern}_aspect=", $aspect
|
27
|
+
Rea.context.symbol_table[name] = $aspect
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
10
32
|
end
|
11
33
|
end
|
data/lib/rea/aspect_type/base.rb
CHANGED
@@ -0,0 +1,142 @@
|
|
1
|
+
module Rea
|
2
|
+
module AspectType
|
3
|
+
module Classification
|
4
|
+
def self.included base
|
5
|
+
base.scope :by_category, lambda { |*categories|
|
6
|
+
$options = categories.extract_options!
|
7
|
+
$aspect = base.classification_aspect
|
8
|
+
$condition = {}
|
9
|
+
categories.each do |category|
|
10
|
+
$category_type_name = category.category_type.name
|
11
|
+
$condition["#{$aspect.member_type_for($category_type_name)}_id"] = category.id
|
12
|
+
end
|
13
|
+
$condition.merge! $options
|
14
|
+
base.where($condition)
|
15
|
+
}
|
16
|
+
|
17
|
+
base.send :has_many, :category_members, :class_name=>::Rea::CategoryMember.name, :as=>:entity
|
18
|
+
base.send :has_many, :categories, :class_name=>::Rea::Category.name,
|
19
|
+
:through=>:category_members, :source=>:category
|
20
|
+
|
21
|
+
base.class_eval do
|
22
|
+
|
23
|
+
def self.categories_for member_type
|
24
|
+
self.classification_aspect.categories_for member_type
|
25
|
+
end
|
26
|
+
|
27
|
+
def is? category
|
28
|
+
$field_name = self.class.classification_aspect.member_type_for(category.category_type.name)
|
29
|
+
self.send($field_name) == category
|
30
|
+
end
|
31
|
+
def is_in? category
|
32
|
+
$field_name = self.class.classification_aspect.member_type_for(category.category_type.name)
|
33
|
+
$current = category.class.find(self.send($field_name))
|
34
|
+
while($current) do
|
35
|
+
return true if $current == category
|
36
|
+
$current = $current.parent_category
|
37
|
+
end
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
module CategoryType
|
45
|
+
|
46
|
+
def self.included base
|
47
|
+
base.extend ClassMethods
|
48
|
+
end
|
49
|
+
|
50
|
+
module ClassMethods
|
51
|
+
def category_type *category_types, &block
|
52
|
+
$options = category_types.extract_options!
|
53
|
+
category_types.each do |type|
|
54
|
+
$category_type = self.find_or_create_by_name type, $options
|
55
|
+
$category_type.instance_eval &block if block
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def category *category_names, &block
|
61
|
+
$options = category_names.extract_options!
|
62
|
+
category_names.flatten.each do |name|
|
63
|
+
category = self.categories.find_or_create_by_name name, $options
|
64
|
+
category.instance_eval &block if block_given?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
module Category
|
70
|
+
def category *category_names, &block
|
71
|
+
$options = category_names.extract_options!
|
72
|
+
$options = {:category_type_id=>self.category_type_id, :category_id=>self.id}.merge($options)
|
73
|
+
category_names.flatten.each do |name|
|
74
|
+
$category = self.child_categories.find_or_create_by_name name, $options
|
75
|
+
$categroy.instance_eval &block if block_given?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class Aspect < Base
|
81
|
+
|
82
|
+
def members
|
83
|
+
@members ||= {}
|
84
|
+
end
|
85
|
+
|
86
|
+
def member *names, &block
|
87
|
+
$options = names.extract_options!
|
88
|
+
names.each do |name|
|
89
|
+
base.attr_accessible "#{name}_id"
|
90
|
+
base.belongs_to name, :class_name=>::Rea::Category.name
|
91
|
+
members[name] = MemberType.new($options)
|
92
|
+
members[name].instance_eval &block if block
|
93
|
+
#pp members[name]
|
94
|
+
if members[name].multiple_select
|
95
|
+
define_multiple_member name, members[name]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def member_type_for category_type
|
101
|
+
$types = {}
|
102
|
+
members.each_pair { |k,v| $types[v.category_type_name] = k }
|
103
|
+
$types[category_type.to_sym]
|
104
|
+
end
|
105
|
+
|
106
|
+
def categories_for member_type
|
107
|
+
$member_type = members[member_type]
|
108
|
+
raise "not found member_type #{member_type}" unless $member_type
|
109
|
+
$member_type.category_options
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
def define_multiple_member name, member
|
114
|
+
base.send :attr_accessible, "#{name.to_s.singularize}_ids"
|
115
|
+
base.send :has_many, name, :through=>:category_members, :source=>:category,
|
116
|
+
:class_name=>::Rea::Category.name, :include=> :category_type,
|
117
|
+
:conditions=>"rea_category_type.name = #{member.category_type_name}"
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
class MemberType < Base
|
122
|
+
|
123
|
+
attr_reader :category_type_name, :multiple_select
|
124
|
+
|
125
|
+
def initialize options={}
|
126
|
+
super
|
127
|
+
@multiple_select = options[:multiple_select] || false
|
128
|
+
end
|
129
|
+
|
130
|
+
def category name, options={}
|
131
|
+
@category_type_name = name
|
132
|
+
end
|
133
|
+
|
134
|
+
def category_options
|
135
|
+
Rea::CategoryType.find_by_name(category_type_name).categories
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Rea
|
2
|
+
module AspectType
|
3
|
+
module DueDate
|
4
|
+
|
5
|
+
class Aspect < Base
|
6
|
+
def member *names
|
7
|
+
$options = names.extract_options!
|
8
|
+
|
9
|
+
base.send :scope, :expired_on, lambda { |*names|
|
10
|
+
$options = names.extract_options!
|
11
|
+
$clause = (names.collect {|name| " #{name} < :now " }).join(" AND ")
|
12
|
+
base.where($clause, :now=>DateTime.now )
|
13
|
+
}
|
14
|
+
base.send :scope, :active_on, lambda { |*names|
|
15
|
+
$options = names.extract_options!
|
16
|
+
$clause = (names.collect {|name| " #{name} > :now " }).join(" AND ")
|
17
|
+
base.where($clause, :now=>DateTime.now )
|
18
|
+
}
|
19
|
+
|
20
|
+
names.each do |name|
|
21
|
+
base.send :attr_accessible, name
|
22
|
+
base.send :define_method, "#{name}_state" do
|
23
|
+
(Time.now > self.send(name)) ? :expired : :active
|
24
|
+
end
|
25
|
+
|
26
|
+
base.send :define_method, "#{name}_expired?" do
|
27
|
+
self.send("#{name}_state") == :expired
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Rea
|
2
|
+
module AspectType
|
3
|
+
module Identification
|
4
|
+
|
5
|
+
def self.included base
|
6
|
+
base.before_create do |object|
|
7
|
+
base.identification_aspect.identifiers.values.each do |val|
|
8
|
+
identifier = Rea::Identifier.find_by_name val.type
|
9
|
+
return unless identifier
|
10
|
+
object.send "#{val.name}=", identifier.generate
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Setup
|
16
|
+
attr_accessor :name, :type
|
17
|
+
def initialize options={}
|
18
|
+
options.keys.each do |key| instance_variable_set("@#{key}", options[key]) end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Aspect < Base
|
23
|
+
def identifiers
|
24
|
+
@identifiers ||= {}
|
25
|
+
end
|
26
|
+
|
27
|
+
def identifier *names
|
28
|
+
$options = names.extract_options!
|
29
|
+
names.each do |name|
|
30
|
+
$default_id_type = "#{base.name.underscore}.#{name}"
|
31
|
+
$options = {:name=>name,:type=>$default_id_type}.merge($options)
|
32
|
+
identifiers[name] = Setup.new($options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/rea/engine.rb
CHANGED
data/lib/rea/meta_type.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Rea
|
2
2
|
module MetaType
|
3
3
|
|
4
|
-
%w{entity resource event agent commitment contract group type schedule}.each do |name|
|
4
|
+
%w{entity resource event agent commitment contract group type schedule process exchange conversion}.each do |name|
|
5
5
|
autoload name.camelize.to_sym, "rea/meta_type/#{name}"
|
6
6
|
end
|
7
7
|
end
|
data/lib/rea/meta_type/agent.rb
CHANGED
@@ -6,20 +6,19 @@ module Rea
|
|
6
6
|
Entity.included base
|
7
7
|
base.extend ::Rea::MetaType::Event::ClassMethods
|
8
8
|
base.extend ClassMethods
|
9
|
+
base.cattr_accessor :event_handler
|
9
10
|
base.after_save :after_save_commitment
|
10
11
|
end
|
11
12
|
|
12
13
|
def after_save_commitment
|
13
|
-
if fulfilled_changed?
|
14
|
-
self.class.
|
14
|
+
if self.respond_to?(:fulfilled_changed?) && fulfilled_changed?
|
15
|
+
self.instance_exec &self.class.event_handler if self.class.event_handler
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
19
|
module ClassMethods
|
19
|
-
|
20
|
-
|
21
|
-
cattr_reader :event_creator
|
22
|
-
self.class_variable_set "@@event_creator", klass
|
20
|
+
def event_creator &block
|
21
|
+
self.event_handler = block
|
23
22
|
end
|
24
23
|
end
|
25
24
|
end
|
@@ -3,14 +3,27 @@ module Rea
|
|
3
3
|
module Contract
|
4
4
|
def self.included base
|
5
5
|
base.fields = nil
|
6
|
-
|
6
|
+
base.send :include, Entity
|
7
7
|
base.extend ClassMethods
|
8
8
|
end
|
9
9
|
|
10
10
|
module ClassMethods
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
|
12
|
+
def clauses
|
13
|
+
@@clauses ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
def clause klass_or_symbol, options={}
|
17
|
+
$klass = guess_entity_class klass_or_symbol
|
18
|
+
has_many $klass.name.tableize.to_sym, {:class_name=>$klass.name, :foreign_key=>:contract_id}.merge(options)
|
19
|
+
self.clauses << $klass
|
20
|
+
$klass.belongs_to :contract, :class_name => self.name
|
21
|
+
end
|
22
|
+
|
23
|
+
def party name, klass_or_sym, options={}
|
24
|
+
$klass = guess_entity_class(klass_or_sym)
|
25
|
+
attr_accessible :"#{name}_id"
|
26
|
+
belongs_to name, {:class_name=>$klass.name}.merge(options)
|
14
27
|
end
|
15
28
|
end
|
16
29
|
end
|
data/lib/rea/meta_type/entity.rb
CHANGED
@@ -5,38 +5,64 @@ module Rea
|
|
5
5
|
base.class_eval do
|
6
6
|
unless self.ancestors.include? ActiveRecord::Base
|
7
7
|
include ::Rea::Plugins::ActiveModel
|
8
|
-
|
8
|
+
else
|
9
|
+
attr_accessible *self.fields if self.fields
|
10
|
+
end
|
11
|
+
if base.fields
|
12
|
+
validates_presence_of *self.fields
|
9
13
|
end
|
10
|
-
validates_presence_of *self.fields if base.fields
|
11
14
|
end
|
12
15
|
base.extend ClassMethods
|
16
|
+
base.extend ::Rea::AspectType::ClassMethods
|
13
17
|
end
|
14
18
|
|
15
19
|
module ClassMethods
|
16
20
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def setup options=nil
|
22
|
+
options = {:entity_type=>:active_record}.merge(options)
|
23
|
+
class_option_set :entity_type, options
|
24
|
+
|
25
|
+
case
|
26
|
+
when self.entity_type == :simple
|
27
|
+
attr_accessor :id
|
28
|
+
self.class_eval do
|
29
|
+
def self.find id
|
30
|
+
self.items[id]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def groups; @@groups ||= [] ; end
|
37
|
+
|
38
|
+
def grouping *names
|
39
|
+
$options = names.extract_options!
|
40
|
+
names.each do |name|
|
41
|
+
attr_accessible "#{name}_id"
|
42
|
+
belongs_to name, $options
|
24
43
|
end
|
25
|
-
block.call if block_given?
|
26
44
|
end
|
27
45
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
#group_class.entity_classes << self
|
32
|
-
block.call if block_given?
|
46
|
+
def groups_for name
|
47
|
+
klass = Rea.context.symbol_table[name]
|
48
|
+
klass.all
|
33
49
|
end
|
34
50
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
51
|
+
def items
|
52
|
+
@@items ||= {}
|
53
|
+
end
|
54
|
+
|
55
|
+
def item name, options={}, &block
|
56
|
+
if self.entity_type == :simple
|
57
|
+
cattr_reader name
|
58
|
+
$item = self.new
|
59
|
+
options.keys.each do |key|
|
60
|
+
$item.instance_variable_set("@#{key}", options[key])
|
61
|
+
end if options
|
62
|
+
self.class_variable_set "@@#{name}", $item
|
63
|
+
items[$item.id] = $item
|
64
|
+
else
|
65
|
+
raise "not support #{self.entity_type} yet!"
|
40
66
|
end
|
41
67
|
end
|
42
68
|
|
@@ -44,6 +70,21 @@ module Rea
|
|
44
70
|
def specification name, options={}
|
45
71
|
belongs_to name, options
|
46
72
|
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
def guess_entity_class klass_or_symbol
|
76
|
+
$klass = klass_or_symbol.is_a?(Symbol) ? Rea.context.symbol_table[klass_or_symbol] : klass_or_symbol
|
77
|
+
raise "entity not found #{klass_or_symbol}" unless $klass
|
78
|
+
$klass
|
79
|
+
end
|
80
|
+
|
81
|
+
def class_option_set *names
|
82
|
+
$options = names.extract_options!
|
83
|
+
names.each do |name|
|
84
|
+
self.cattr_reader name
|
85
|
+
self.class_variable_set "@@#{name}", $options[name]
|
86
|
+
end
|
87
|
+
end
|
47
88
|
end
|
48
89
|
end
|
49
90
|
end
|