engine-rea 0.2.2 → 0.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.
Files changed (83) hide show
  1. data/.rspec +1 -0
  2. data/Gemfile +3 -2
  3. data/Gemfile.lock +40 -35
  4. data/VERSION +1 -1
  5. data/app/models/rea/categories_entity.rb +7 -0
  6. data/app/models/rea/category.rb +18 -7
  7. data/app/models/rea/classification.rb +7 -0
  8. data/app/models/rea/entities_group.rb +7 -0
  9. data/app/models/rea/group.rb +5 -17
  10. data/app/models/rea/rea.rb +7 -0
  11. data/config/locales/en.yml +2 -0
  12. data/config/locales/zh-CN.yml +16 -17
  13. data/db/migrate/20121129100245_create_rea_groups.rb +18 -0
  14. data/db/migrate/20121129100748_create_rea_categories.rb +19 -0
  15. data/db/migrate/20121129101744_create_rea_classifications.rb +29 -0
  16. data/db/migrate/20121130051633_create_rea_entities_groups.rb +13 -0
  17. data/db/migrate/20121130100600_create_rea_categories_entities.rb +13 -0
  18. data/engine-rea.gemspec +27 -59
  19. data/lib/generators/rea/install/install_generator.rb +4 -4
  20. data/lib/rea/active_record_ext.rb +82 -0
  21. data/lib/rea/application.rb +55 -21
  22. data/lib/rea/engine.rb +8 -2
  23. data/lib/rea.rb +5 -10
  24. data/spec/dummy/db/schema.rb +61 -1
  25. data/spec/models/rea/categories_entity_spec.rb +7 -0
  26. data/spec/models/rea/category_spec.rb +10 -19
  27. data/spec/models/rea/classification_spec.rb +6 -0
  28. data/spec/models/rea/entities_group_spec.rb +7 -0
  29. data/spec/models/rea/group_spec.rb +3 -35
  30. data/spec/rea/active_record_ext_spec.rb +35 -0
  31. data/spec/rea/application_spec.rb +17 -0
  32. data/spec/spec_helper.rb +3 -0
  33. metadata +40 -59
  34. data/app/models/rea/category_member.rb +0 -8
  35. data/app/models/rea/category_type.rb +0 -7
  36. data/app/models/rea/group_type.rb +0 -7
  37. data/app/models/rea/identifier.rb +0 -51
  38. data/app/views/layouts/rea/application.html.erb +0 -14
  39. data/db/migrate/20120601074531_create_rea_category_types.rb +0 -11
  40. data/db/migrate/20120601074540_create_rea_categories.rb +0 -12
  41. data/db/migrate/20120605023205_create_rea_category_members.rb +0 -12
  42. data/db/migrate/20120605030658_create_rea_groups.rb +0 -20
  43. data/db/migrate/20120605082028_create_rea_identifiers.rb +0 -11
  44. data/db/migrate/20120717080004_create_rea_group_types.rb +0 -7
  45. data/lib/rea/aspect_type/base.rb +0 -10
  46. data/lib/rea/aspect_type/classification.rb +0 -142
  47. data/lib/rea/aspect_type/description.rb +0 -8
  48. data/lib/rea/aspect_type/due_date.rb +0 -34
  49. data/lib/rea/aspect_type/identification.rb +0 -38
  50. data/lib/rea/aspect_type.rb +0 -33
  51. data/lib/rea/meta_type/agent.rb +0 -10
  52. data/lib/rea/meta_type/commitment.rb +0 -26
  53. data/lib/rea/meta_type/contract.rb +0 -32
  54. data/lib/rea/meta_type/conversion.rb +0 -6
  55. data/lib/rea/meta_type/entity.rb +0 -91
  56. data/lib/rea/meta_type/event.rb +0 -39
  57. data/lib/rea/meta_type/exchange.rb +0 -6
  58. data/lib/rea/meta_type/group.rb +0 -25
  59. data/lib/rea/meta_type/process.rb +0 -28
  60. data/lib/rea/meta_type/resource.rb +0 -14
  61. data/lib/rea/meta_type/schedule.rb +0 -0
  62. data/lib/rea/meta_type/type.rb +0 -0
  63. data/lib/rea/meta_type.rb +0 -8
  64. data/lib/rea/model.rb +0 -65
  65. data/lib/rea/plugins/active_model.rb +0 -18
  66. data/spec/models/rea/category_member_spec.rb +0 -9
  67. data/spec/models/rea/category_type_spec.rb +0 -28
  68. data/spec/models/rea/group_type_spec.rb +0 -8
  69. data/spec/models/rea/identifier_spec.rb +0 -48
  70. data/spec/rea/aspect_type/classification_spec.rb +0 -107
  71. data/spec/rea/aspect_type/due_date_spec.rb +0 -75
  72. data/spec/rea/aspect_type/identification_spec.rb +0 -64
  73. data/spec/rea/aspect_type_spec.rb +0 -44
  74. data/spec/rea/meta_type/agent_spec.rb +0 -28
  75. data/spec/rea/meta_type/commitment_spec.rb +0 -45
  76. data/spec/rea/meta_type/contract_spec.rb +0 -42
  77. data/spec/rea/meta_type/entity_spec.rb +0 -58
  78. data/spec/rea/meta_type/event_spec.rb +0 -21
  79. data/spec/rea/meta_type/group_spec.rb +0 -55
  80. data/spec/rea/meta_type/process_spec.rb +0 -5
  81. data/spec/rea/meta_type/resource_spec.rb +0 -65
  82. data/spec/rea/meta_type_spec.rb +0 -11
  83. data/spec/rea/model_spec.rb +0 -79
@@ -1,8 +0,0 @@
1
- module Rea
2
- class CategoryMember < ActiveRecord::Base
3
- # attr_accessible :title, :body
4
- attr_accessible :category, :entity
5
- belongs_to :category
6
- belongs_to :entity, :polymorphic=>true
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- module Rea
2
- class CategoryType < ActiveRecord::Base
3
- include ::Rea::AspectType::Classification::CategoryType
4
- has_many :categories, :class_name=>::Rea::Category.name
5
- attr_accessible :name, :system, :automatic, :multiple
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Rea
2
- class GroupType < ActiveRecord::Base
3
- attr_accessible :name
4
- has_many :groups
5
- accepts_nested_attributes_for :groups
6
- end
7
- end
@@ -1,51 +0,0 @@
1
- require 'thread'
2
- module Rea
3
- class Identifier < ActiveRecord::Base
4
- attr_accessible :name, :value_reset_rule, :id_rule, :last_value
5
- SEM = Mutex.new
6
-
7
- validates_presence_of :name, :id_rule
8
- validate :instance_validations
9
-
10
- def next_id
11
- self.instance_eval "\"#{id_rule}\"" if id_rule
12
- end
13
-
14
- def next_value
15
- last_value + 1
16
- end
17
-
18
- def generate
19
- SEM.synchronize do
20
- self.class.transaction do
21
- if value_reset_rule
22
- self.last_value = 0 if self.instance_eval(value_reset_rule)
23
- end
24
- self.last_value = (self.last_value) || 0
25
- id = self.instance_eval "\"#{id_rule}\""
26
- self.last_value = next_value
27
- self.save!
28
- return id
29
- end
30
- end
31
- end
32
-
33
- protected
34
- def instance_validations
35
- if id_rule
36
- begin
37
- self.instance_eval "\"#{id_rule}\""
38
- rescue Exception => e
39
- errors.add :id_rule, :malformed, :error_message=> e.message
40
- end
41
- end
42
- if value_reset_rule
43
- begin
44
- self.instance_eval value_reset_rule
45
- rescue Exception => e
46
- errors.add :value_reset_rule, :malformed, :error_message=> e.message
47
- end
48
- end
49
- end
50
- end
51
- end
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Rea</title>
5
- <%= stylesheet_link_tag "rea/application", :media => "all" %>
6
- <%= javascript_include_tag "rea/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,11 +0,0 @@
1
- class CreateReaCategoryTypes < ActiveRecord::Migration
2
- def change
3
- create_table :rea_category_types do |t|
4
- t.string :name, :null=>false
5
- t.boolean :system
6
- t.boolean :automatic
7
- t.boolean :multiple
8
- end
9
- add_index :rea_category_types, :name
10
- end
11
- end
@@ -1,12 +0,0 @@
1
- class CreateReaCategories < ActiveRecord::Migration
2
- def change
3
- create_table :rea_categories do |t|
4
- t.string :name, :null=>false
5
- t.references :category_type
6
- t.references :category
7
- t.timestamps
8
- end
9
- add_index :rea_categories, :category_type_id
10
- add_index :rea_categories, :category_id
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- class CreateReaCategoryMembers < ActiveRecord::Migration
2
- def change
3
- create_table :rea_category_members do |t|
4
- t.references :entity
5
- t.string :entity_type
6
- t.references :category
7
- t.timestamps
8
- end
9
- add_index :rea_category_members, [:entity_id, :entity_type]
10
- add_index :rea_category_members, :category_id
11
- end
12
- end
@@ -1,20 +0,0 @@
1
- class CreateReaGroups < ActiveRecord::Migration
2
- def change
3
- create_table :rea_groups do |t|
4
- t.string :name, :null=>false
5
- t.references :group_type
6
- end
7
-
8
- add_index :rea_groups, :group_type_id
9
-
10
- create_table :categories_groups do |t|
11
- t.references :category
12
- t.references :group
13
- end
14
-
15
- add_index :categories_groups, :group_id
16
- add_index :categories_groups, :category_id
17
-
18
-
19
- end
20
- end
@@ -1,11 +0,0 @@
1
- class CreateReaIdentifiers < ActiveRecord::Migration
2
- def change
3
- create_table :rea_identifiers do |t|
4
- t.string :name, :null=>false
5
- t.string :value_reset_rule
6
- t.string :id_rule, :null=>false
7
- t.integer :last_value, :default=>0
8
- t.timestamps
9
- end
10
- end
11
- end
@@ -1,7 +0,0 @@
1
- class CreateReaGroupTypes < ActiveRecord::Migration
2
- def change
3
- create_table :rea_group_types do |t|
4
- t.string :name, :null=>false
5
- end
6
- end
7
- end
@@ -1,10 +0,0 @@
1
- module Rea
2
- module AspectType
3
- class Base
4
- attr_reader :base
5
- def initialize options = {}
6
- @base = options.delete(:base)
7
- end
8
- end
9
- end
10
- end
@@ -1,142 +0,0 @@
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
@@ -1,8 +0,0 @@
1
- module Rea
2
- module AspectType
3
- module Description
4
- class Aspect < Base
5
- end
6
- end
7
- end
8
- end
@@ -1,34 +0,0 @@
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
@@ -1,38 +0,0 @@
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
@@ -1,33 +0,0 @@
1
- module Rea
2
- module AspectType
3
-
4
- autoload :Base, 'rea/aspect_type/base'
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
32
- end
33
- end
@@ -1,10 +0,0 @@
1
- module Rea
2
- module MetaType
3
- module Agent
4
- def self.included base
5
- base.fields = [:name]
6
- base.send :include, Entity
7
- end
8
- end
9
- end
10
- end
@@ -1,26 +0,0 @@
1
- module Rea
2
- module MetaType
3
- module Commitment
4
- def self.included base
5
- base.fields = [:amount]
6
- Entity.included base
7
- base.extend ::Rea::MetaType::Event::ClassMethods
8
- base.extend ClassMethods
9
- base.cattr_accessor :event_handler
10
- base.after_save :after_save_commitment
11
- end
12
-
13
- def after_save_commitment
14
- if self.respond_to?(:fulfilled_changed?) && fulfilled_changed?
15
- self.instance_exec &self.class.event_handler if self.class.event_handler
16
- end
17
- end
18
-
19
- module ClassMethods
20
- def event_creator &block
21
- self.event_handler = block
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,32 +0,0 @@
1
- module Rea
2
- module MetaType
3
- module Contract
4
- def self.included base
5
- base.fields = nil
6
- base.send :include, Entity
7
- base.extend ClassMethods
8
- end
9
-
10
- module ClassMethods
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)
27
- end
28
- end
29
- end
30
-
31
- end
32
- end
@@ -1,6 +0,0 @@
1
- module Rea
2
- module MetaType
3
- class Conversion < Process
4
- end
5
- end
6
- end
@@ -1,91 +0,0 @@
1
- module Rea
2
- module MetaType
3
- module Entity
4
- def self.included base
5
- base.class_eval do
6
- unless self.ancestors.include? ActiveRecord::Base
7
- include ::Rea::Plugins::ActiveModel
8
- else
9
- attr_accessible *self.fields if self.fields
10
- end
11
- if base.fields
12
- validates_presence_of *self.fields
13
- end
14
- end
15
- base.extend ClassMethods
16
- base.extend ::Rea::AspectType::ClassMethods
17
- end
18
-
19
- module ClassMethods
20
-
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
43
- end
44
- end
45
-
46
- def groups_for name
47
- klass = Rea.context.symbol_table[name]
48
- klass.all
49
- end
50
-
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!"
66
- end
67
- end
68
-
69
-
70
- def specification name, options={}
71
- belongs_to name, options
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
88
- end
89
- end
90
- end
91
- end
@@ -1,39 +0,0 @@
1
- module Rea
2
- module MetaType
3
- module Event
4
- def self.included base
5
- base.fields = [:amount]
6
- base.send :include, Entity
7
- base.extend ClassMethods
8
- end
9
-
10
-
11
- module ClassMethods
12
- def provider klass_or_symbol, options={}
13
- define_belongs_to_relation :provider, klass_or_symbol, options
14
- end
15
-
16
- def recipient klass_or_symbol, options={}
17
- define_belongs_to_relation :recipient, klass_or_symbol, options
18
- end
19
-
20
- def resource klass_or_symbol, options={}
21
- define_belongs_to_relation :resource, klass_or_symbol, options
22
- end
23
-
24
- def setup options
25
- class_option_set :type, options
26
- end
27
-
28
- protected
29
- def define_belongs_to_relation name, klass_or_symbol, options
30
- $klass = klass_or_symbol.is_a?(Symbol) ? klass_or_symbol.to_s.camelize.constantize : klass_or_symbol
31
- attr_accessible :"#{name}_id"
32
- belongs_to name, {:class_name=>$klass.name}.merge(options)
33
- validates_presence_of "#{name}_id".to_sym
34
- end
35
-
36
- end
37
- end
38
- end
39
- end
@@ -1,6 +0,0 @@
1
- module Rea
2
- module MetaType
3
- class Exchange < Process
4
- end
5
- end
6
- end