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.
Files changed (75) hide show
  1. data/VERSION +1 -1
  2. data/app/models/rea/category.rb +4 -0
  3. data/app/models/rea/category_member.rb +1 -0
  4. data/app/models/rea/category_type.rb +1 -1
  5. data/app/models/rea/group.rb +17 -6
  6. data/app/models/rea/group_type.rb +7 -0
  7. data/app/models/rea/identifier.rb +12 -3
  8. data/config/locales/en.yml +4 -0
  9. data/config/locales/zh-CN.yml +42 -0
  10. data/db/migrate/20120601074531_create_rea_category_types.rb +1 -1
  11. data/db/migrate/20120601074540_create_rea_categories.rb +1 -1
  12. data/db/migrate/20120605030658_create_rea_groups.rb +14 -3
  13. data/db/migrate/20120605082028_create_rea_identifiers.rb +2 -2
  14. data/db/migrate/20120717080004_create_rea_group_types.rb +7 -0
  15. data/engine-rea.gemspec +31 -14
  16. data/lib/generators/rea/install/install_generator.rb +8 -0
  17. data/lib/rails_patch.rb +26 -0
  18. data/lib/rea.rb +25 -1
  19. data/lib/rea/application.rb +86 -0
  20. data/lib/rea/aspect_type.rb +28 -6
  21. data/lib/rea/aspect_type/base.rb +3 -2
  22. data/lib/rea/aspect_type/classification.rb +142 -0
  23. data/lib/rea/aspect_type/description.rb +3 -2
  24. data/lib/rea/aspect_type/due_date.rb +34 -0
  25. data/lib/rea/aspect_type/identification.rb +38 -0
  26. data/lib/rea/engine.rb +1 -3
  27. data/lib/rea/meta_type.rb +1 -1
  28. data/lib/rea/meta_type/agent.rb +1 -1
  29. data/lib/rea/meta_type/commitment.rb +5 -6
  30. data/lib/rea/meta_type/contract.rb +17 -4
  31. data/lib/rea/meta_type/conversion.rb +6 -0
  32. data/lib/rea/meta_type/entity.rb +61 -20
  33. data/lib/rea/meta_type/event.rb +17 -24
  34. data/lib/rea/meta_type/exchange.rb +6 -0
  35. data/lib/rea/meta_type/group.rb +25 -0
  36. data/lib/rea/meta_type/process.rb +28 -0
  37. data/lib/rea/meta_type/resource.rb +5 -1
  38. data/lib/rea/model.rb +65 -0
  39. data/lib/rea/settings.rb +58 -0
  40. data/spec/dummy/db/schema.rb +1 -56
  41. data/spec/generators/rea/install/install_generator_spec.rb +2 -0
  42. data/spec/models/rea/category_member_spec.rb +5 -1
  43. data/spec/models/rea/category_spec.rb +19 -1
  44. data/spec/models/rea/category_type_spec.rb +24 -1
  45. data/spec/models/rea/group_spec.rb +34 -1
  46. data/spec/models/rea/group_type_spec.rb +8 -0
  47. data/spec/rea/application_spec.rb +8 -0
  48. data/spec/rea/aspect_type/classification_spec.rb +107 -0
  49. data/spec/rea/aspect_type/due_date_spec.rb +75 -0
  50. data/spec/rea/aspect_type/identification_spec.rb +64 -0
  51. data/spec/rea/aspect_type_spec.rb +44 -0
  52. data/spec/rea/engine_spec.rb +0 -3
  53. data/spec/rea/meta_type/agent_spec.rb +28 -0
  54. data/spec/rea/meta_type/commitment_spec.rb +45 -0
  55. data/spec/rea/meta_type/contract_spec.rb +42 -0
  56. data/spec/rea/meta_type/entity_spec.rb +58 -0
  57. data/spec/rea/meta_type/event_spec.rb +21 -0
  58. data/spec/rea/meta_type/group_spec.rb +55 -0
  59. data/spec/rea/meta_type/process_spec.rb +5 -0
  60. data/spec/rea/meta_type/resource_spec.rb +65 -0
  61. data/spec/rea/meta_type_spec.rb +1 -1
  62. data/spec/rea/model_spec.rb +79 -0
  63. metadata +32 -15
  64. data/app/models/rea/group_entity.rb +0 -7
  65. data/db/migrate/20120605030708_create_rea_group_entities.rb +0 -9
  66. data/lib/rea/aspect_type/classification_aspect.rb +0 -75
  67. data/lib/rea/aspect_type/due_date_type.rb +0 -5
  68. data/lib/rea/aspect_type/identifier_setup.rb +0 -7
  69. data/lib/rea/dsl.rb +0 -24
  70. data/lib/rea/dsl/behavioral.rb +0 -50
  71. data/lib/rea/dsl/structural.rb +0 -53
  72. data/spec/models/rea/group_entity_spec.rb +0 -5
  73. data/spec/rea/dsl/behavioral_spec.rb +0 -149
  74. data/spec/rea/dsl/structural_spec.rb +0 -299
  75. data/spec/rea/dsl_spec.rb +0 -11
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -2,8 +2,12 @@ module Rea
2
2
  class Category < ActiveRecord::Base
3
3
  include ::Rea::AspectType::Classification::Category
4
4
  belongs_to :category_type
5
+ has_many :category_members, :class_name=>::Rea::CategoryMember.name
5
6
  belongs_to :parent_category, :class_name=>self.name, :foreign_key=>:category_id
6
7
  has_many :child_categories, :class_name=>self.name
8
+ has_and_belongs_to_many :groups
9
+
7
10
  attr_accessible :name, :category_type_id, :category_id
11
+
8
12
  end
9
13
  end
@@ -1,6 +1,7 @@
1
1
  module Rea
2
2
  class CategoryMember < ActiveRecord::Base
3
3
  # attr_accessible :title, :body
4
+ attr_accessible :category, :entity
4
5
  belongs_to :category
5
6
  belongs_to :entity, :polymorphic=>true
6
7
  end
@@ -1,7 +1,7 @@
1
1
  module Rea
2
2
  class CategoryType < ActiveRecord::Base
3
3
  include ::Rea::AspectType::Classification::CategoryType
4
- has_many :categories
4
+ has_many :categories, :class_name=>::Rea::Category.name
5
5
  attr_accessible :name, :system, :automatic, :multiple
6
6
  end
7
7
  end
@@ -1,11 +1,22 @@
1
1
  module Rea
2
2
  class Group < ActiveRecord::Base
3
- attr_accessible :name, :entity_types
4
- has_many :category_types
5
- has_many :group_entities
3
+ attr_accessor :category_ids_csv
4
+ attr_accessible :name, :group_type_id, :category_ids_csv
5
+ has_and_belongs_to_many :categories
6
+ belongs_to :group_type
7
+ has_many :category_types, :through=>:categories
8
+
9
+ before_validation do
10
+ logger.debug "before validation" + self.category_ids_csv
11
+ return unless self.category_ids_csv
12
+ ids = self.category_ids_csv.split(/,/)
13
+ ids = ids.delete_if { |id| id =~ /T/ }
14
+ self.category_ids = ids
15
+ end
16
+
17
+ def category_ids_csv
18
+ @category_ids_csv ||= category_ids.join ','
19
+ end
6
20
 
7
- scope :groups, proc { |model_klass|
8
- where("entity_types like ?", "%#{model_klass.name}%")
9
- }
10
21
  end
11
22
  end
@@ -0,0 +1,7 @@
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,12 +1,20 @@
1
1
  require 'thread'
2
2
  module Rea
3
3
  class Identifier < ActiveRecord::Base
4
- attr_accessible :name, :value_reset_rule, :id_rule
4
+ attr_accessible :name, :value_reset_rule, :id_rule, :last_value
5
5
  SEM = Mutex.new
6
6
 
7
7
  validates_presence_of :name, :id_rule
8
8
  validate :instance_validations
9
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
+
10
18
  def generate
11
19
  SEM.synchronize do
12
20
  self.class.transaction do
@@ -14,9 +22,10 @@ module Rea
14
22
  self.last_value = 0 if self.instance_eval(value_reset_rule)
15
23
  end
16
24
  self.last_value = (self.last_value) || 0
17
- self.last_value = self.last_value + 1
25
+ id = self.instance_eval "\"#{id_rule}\""
26
+ self.last_value = next_value
18
27
  self.save!
19
- self.instance_eval "\"#{id_rule}\""
28
+ return id
20
29
  end
21
30
  end
22
31
  end
@@ -0,0 +1,4 @@
1
+ en:
2
+ activerecord:
3
+ models:
4
+ rea/category: "Category"
@@ -0,0 +1,42 @@
1
+ zh-CN:
2
+ activerecord:
3
+ models:
4
+ rea/category_type:
5
+ one: "分类类型"
6
+ other: "分类类型"
7
+ rea/category:
8
+ one: "分类"
9
+ other: "分类"
10
+ rea/identifier:
11
+ one: "标识码"
12
+ other: "标识码"
13
+ rea/group:
14
+ one: "分组"
15
+ other: "分组"
16
+ rea/group_type:
17
+ one: "分组类型"
18
+ other: "分组类型"
19
+
20
+ attributes:
21
+ rea/category_type:
22
+ name: "名称"
23
+ categories: "分类"
24
+ rea/category:
25
+ name: "名称"
26
+ category_type: "分类类型"
27
+ parent_category: "上级分类"
28
+ rea/identifier:
29
+ name: "名称"
30
+ value_reset_rule: "值重置规则"
31
+ id_rule: "标识码规则"
32
+ last_value: "最新值"
33
+ next_id: "下一标识"
34
+ created_at: "创建时间"
35
+ updated_at: "更新时间"
36
+
37
+ errors:
38
+ models:
39
+ rea/identifier:
40
+ attributes:
41
+ id_rule:
42
+ malformed: "标识符格式不正确: %{error_message}"
@@ -1,7 +1,7 @@
1
1
  class CreateReaCategoryTypes < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :rea_category_types do |t|
4
- t.string :name
4
+ t.string :name, :null=>false
5
5
  t.boolean :system
6
6
  t.boolean :automatic
7
7
  t.boolean :multiple
@@ -1,7 +1,7 @@
1
1
  class CreateReaCategories < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :rea_categories do |t|
4
- t.string :name
4
+ t.string :name, :null=>false
5
5
  t.references :category_type
6
6
  t.references :category
7
7
  t.timestamps
@@ -1,9 +1,20 @@
1
1
  class CreateReaGroups < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :rea_groups do |t|
4
- t.string :name
5
- t.string :entity_types
6
- t.timestamps
4
+ t.string :name, :null=>false
5
+ t.references :group_type
7
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
+
8
19
  end
9
20
  end
@@ -1,9 +1,9 @@
1
1
  class CreateReaIdentifiers < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :rea_identifiers do |t|
4
- t.string :name
4
+ t.string :name, :null=>false
5
5
  t.string :value_reset_rule
6
- t.string :id_rule
6
+ t.string :id_rule, :null=>false
7
7
  t.integer :last_value, :default=>0
8
8
  t.timestamps
9
9
  end
@@ -0,0 +1,7 @@
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
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "engine-rea"
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ryan Wong"]
12
- s.date = "2012-06-19"
12
+ s.date = "2012-07-18"
13
13
  s.description = "\n follow REA model\n\t"
14
14
  s.email = "lazing@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -32,42 +32,48 @@ Gem::Specification.new do |s|
32
32
  "app/models/rea/category_member.rb",
33
33
  "app/models/rea/category_type.rb",
34
34
  "app/models/rea/group.rb",
35
- "app/models/rea/group_entity.rb",
35
+ "app/models/rea/group_type.rb",
36
36
  "app/models/rea/identifier.rb",
37
37
  "app/views/layouts/rea/application.html.erb",
38
+ "config/locales/en.yml",
39
+ "config/locales/zh-CN.yml",
38
40
  "config/routes.rb",
39
41
  "db/migrate/20120601074531_create_rea_category_types.rb",
40
42
  "db/migrate/20120601074540_create_rea_categories.rb",
41
43
  "db/migrate/20120605023205_create_rea_category_members.rb",
42
44
  "db/migrate/20120605030658_create_rea_groups.rb",
43
- "db/migrate/20120605030708_create_rea_group_entities.rb",
44
45
  "db/migrate/20120605082028_create_rea_identifiers.rb",
46
+ "db/migrate/20120717080004_create_rea_group_types.rb",
45
47
  "engine-rea.gemspec",
46
48
  "lib/engine-rea.rb",
47
49
  "lib/generators/rea/install/USAGE",
48
50
  "lib/generators/rea/install/install_generator.rb",
51
+ "lib/rails_patch.rb",
49
52
  "lib/rea.rb",
53
+ "lib/rea/application.rb",
50
54
  "lib/rea/aspect_type.rb",
51
55
  "lib/rea/aspect_type/base.rb",
52
- "lib/rea/aspect_type/classification_aspect.rb",
56
+ "lib/rea/aspect_type/classification.rb",
53
57
  "lib/rea/aspect_type/description.rb",
54
- "lib/rea/aspect_type/due_date_type.rb",
55
- "lib/rea/aspect_type/identifier_setup.rb",
56
- "lib/rea/dsl.rb",
57
- "lib/rea/dsl/behavioral.rb",
58
- "lib/rea/dsl/structural.rb",
58
+ "lib/rea/aspect_type/due_date.rb",
59
+ "lib/rea/aspect_type/identification.rb",
59
60
  "lib/rea/engine.rb",
60
61
  "lib/rea/meta_type.rb",
61
62
  "lib/rea/meta_type/agent.rb",
62
63
  "lib/rea/meta_type/commitment.rb",
63
64
  "lib/rea/meta_type/contract.rb",
65
+ "lib/rea/meta_type/conversion.rb",
64
66
  "lib/rea/meta_type/entity.rb",
65
67
  "lib/rea/meta_type/event.rb",
68
+ "lib/rea/meta_type/exchange.rb",
66
69
  "lib/rea/meta_type/group.rb",
70
+ "lib/rea/meta_type/process.rb",
67
71
  "lib/rea/meta_type/resource.rb",
68
72
  "lib/rea/meta_type/schedule.rb",
69
73
  "lib/rea/meta_type/type.rb",
74
+ "lib/rea/model.rb",
70
75
  "lib/rea/plugins/active_model.rb",
76
+ "lib/rea/settings.rb",
71
77
  "lib/tasks/cucumber.rake",
72
78
  "lib/tasks/rea_tasks.rake",
73
79
  "lib/tasks/watchr.rake",
@@ -111,14 +117,25 @@ Gem::Specification.new do |s|
111
117
  "spec/models/rea/category_member_spec.rb",
112
118
  "spec/models/rea/category_spec.rb",
113
119
  "spec/models/rea/category_type_spec.rb",
114
- "spec/models/rea/group_entity_spec.rb",
115
120
  "spec/models/rea/group_spec.rb",
121
+ "spec/models/rea/group_type_spec.rb",
116
122
  "spec/models/rea/identifier_spec.rb",
117
- "spec/rea/dsl/behavioral_spec.rb",
118
- "spec/rea/dsl/structural_spec.rb",
119
- "spec/rea/dsl_spec.rb",
123
+ "spec/rea/application_spec.rb",
124
+ "spec/rea/aspect_type/classification_spec.rb",
125
+ "spec/rea/aspect_type/due_date_spec.rb",
126
+ "spec/rea/aspect_type/identification_spec.rb",
127
+ "spec/rea/aspect_type_spec.rb",
120
128
  "spec/rea/engine_spec.rb",
129
+ "spec/rea/meta_type/agent_spec.rb",
130
+ "spec/rea/meta_type/commitment_spec.rb",
131
+ "spec/rea/meta_type/contract_spec.rb",
132
+ "spec/rea/meta_type/entity_spec.rb",
133
+ "spec/rea/meta_type/event_spec.rb",
134
+ "spec/rea/meta_type/group_spec.rb",
135
+ "spec/rea/meta_type/process_spec.rb",
136
+ "spec/rea/meta_type/resource_spec.rb",
121
137
  "spec/rea/meta_type_spec.rb",
138
+ "spec/rea/model_spec.rb",
122
139
  "spec/spec_helper.rb"
123
140
  ]
124
141
  s.homepage = "http://github.com/lazing/engine-rea"
@@ -17,4 +17,12 @@ class Rea::InstallGenerator < Rails::Generators::Base
17
17
  migration_template path, "db/migrate/"+path.gsub(/\d+_([\w\d\.]+)/, '\1')
18
18
  end
19
19
  end
20
+
21
+ def install_rea_initializer
22
+ initializer "rea.rb" do |data|
23
+ data = ""
24
+ data << "Rea.setup do |application|\n"
25
+ data << "end"
26
+ end
27
+ end
20
28
  end
@@ -0,0 +1,26 @@
1
+ module ActiveRecord
2
+ module AutosaveAssociation
3
+ def save_belongs_to_association(reflection)
4
+ association = association_instance_get(reflection.name)
5
+ record = association && association.load_target
6
+ return if record.is_a? Array
7
+ if record && !record.destroyed?
8
+ autosave = reflection.options[:autosave]
9
+
10
+ if autosave && record.marked_for_destruction?
11
+ record.destroy
12
+ elsif autosave != false
13
+ saved = record.save(:validate => !autosave) if record.new_record? || (autosave && record.changed_for_autosave?)
14
+
15
+ if association.updated?
16
+ association_id = record.send(reflection.options[:primary_key] || :id)
17
+ self[reflection.foreign_key] = association_id
18
+ association.loaded!
19
+ end
20
+
21
+ saved if autosave
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/rea.rb CHANGED
@@ -1,13 +1,37 @@
1
1
  require "rea/engine"
2
2
 
3
+ require 'rails_patch'
4
+
3
5
  module Rea
4
- autoload :Dsl, 'rea/dsl'
6
+ autoload :Model, 'rea/model'
5
7
  autoload :InstallGenerator, 'generators/rea/install/install_generator'
6
8
 
7
9
  autoload :AspectType, 'rea/aspect_type'
8
10
  autoload :MetaType, 'rea/meta_type'
9
11
 
12
+ autoload :Settings, 'rea/settings'
13
+ autoload :Application, 'rea/application'
14
+
10
15
  module Plugins
11
16
  autoload :ActiveModel, 'rea/plugins/active_model'
12
17
  end
18
+
19
+ class << self
20
+
21
+ attr_accessor :application
22
+
23
+ def application
24
+ @application ||= ::Rea::Application.new
25
+ end
26
+
27
+ def setup
28
+ puts "Loading Engine-Rea........"
29
+ application.setup!
30
+ yield(application)
31
+ application.prepare!
32
+ end
33
+
34
+ delegate :model, :to=>:application
35
+ delegate :context, :to=>:application
36
+ end
13
37
  end
@@ -0,0 +1,86 @@
1
+ module Rea
2
+ class Application
3
+ include ::Rea::Settings
4
+ include ::Rea::Model
5
+
6
+ setting :load_paths, [File.expand_path('app/rea', Rails.root)]
7
+
8
+ def setup!
9
+ end
10
+
11
+ def prepare!
12
+ remove_active_admin_load_paths_from_rails_autoload_and_eager_load
13
+ attach_reloader
14
+ load!
15
+ end
16
+
17
+ def loaded?
18
+ @@loaded ||= false
19
+ end
20
+
21
+ def load!
22
+ return if loaded?
23
+ # Load files
24
+ files_in_load_path.each{|file| load file }
25
+ @@loaded = true
26
+ end
27
+
28
+ def unload!
29
+ @@loaded = false
30
+ end
31
+
32
+ def files_in_load_path
33
+ load_paths.flatten.compact.uniq.collect{|path| Dir["#{path}/**/*.rb"] }.flatten
34
+ end
35
+
36
+
37
+ private
38
+ # Since we're dealing with all our own file loading, we need
39
+ # # to remove our paths from the ActiveSupport autoload paths.
40
+ # # If not, file naming becomes very important and can cause clashes.
41
+ def remove_active_admin_load_paths_from_rails_autoload_and_eager_load
42
+ ActiveSupport::Dependencies.autoload_paths.reject!{|path|
43
+ load_paths.include?(path) }
44
+ # Don't eagerload our configs, we'll deal with them ourselves
45
+ Rails.application.config.eager_load_paths = Rails.application.config.eager_load_paths.reject do |path|
46
+ load_paths.include?(path)
47
+ end
48
+ end
49
+
50
+ def attach_reloader
51
+ Rails32Reloader.new(Rails.application, Rea.application).attach!
52
+ end
53
+
54
+ class Rails32Reloader
55
+ attr_reader :rea_app, :rails_app, :rails_version
56
+
57
+ def initialize(rails_app, rea_app, rails_version = "3.2")
58
+ @rails_app = rails_app
59
+ @rea_app = rea_app
60
+ @rails_version = rails_version.to_s
61
+ end
62
+
63
+ def attach!
64
+ rea_app.load_paths.each do |path|
65
+ rails_app.config.watchable_dirs[path] = [:rb]
66
+ end
67
+
68
+ reloader = self
69
+
70
+ ActionDispatch::Reloader.to_prepare do
71
+ reloader.reload!
72
+ end
73
+ end
74
+
75
+ def reload!
76
+ rea_app.unload!
77
+ rea_app.load!
78
+ end
79
+
80
+ def major_rails_version
81
+ @rails_version[0..2]
82
+ end
83
+ end
84
+
85
+ end
86
+ end