tripper 0.0.3d

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/TODO +26 -0
  8. data/lib/generators/USAGE +8 -0
  9. data/lib/generators/tripper.rb +51 -0
  10. data/lib/generators/tripper/commonalities/commonalities.rb +226 -0
  11. data/lib/generators/tripper/detect_changes/detect_changes_generator.rb +173 -0
  12. data/lib/generators/tripper/detect_changes/model.rb +226 -0
  13. data/lib/generators/tripper/detect_changes/templates/migration.rb +7 -0
  14. data/lib/generators/tripper/detect_changes/templates/model/belongs_to.rb +1 -0
  15. data/lib/generators/tripper/detect_changes/templates/model/has_one.rb +1 -0
  16. data/lib/generators/tripper/detect_changes/templates/model/validates.rb +2 -0
  17. data/lib/generators/tripper/from_community/from_community_generator.rb +95 -0
  18. data/lib/generators/tripper/from_community/templates/actions/create.rb +8 -0
  19. data/lib/generators/tripper/from_community/templates/actions/destroy.rb +5 -0
  20. data/lib/generators/tripper/from_community/templates/actions/edit.rb +3 -0
  21. data/lib/generators/tripper/from_community/templates/actions/index.rb +3 -0
  22. data/lib/generators/tripper/from_community/templates/actions/new.rb +3 -0
  23. data/lib/generators/tripper/from_community/templates/actions/show.rb +3 -0
  24. data/lib/generators/tripper/from_community/templates/actions/update.rb +8 -0
  25. data/lib/generators/tripper/from_community/templates/controller.rb +3 -0
  26. data/lib/generators/tripper/from_community/templates/fixtures.yml +9 -0
  27. data/lib/generators/tripper/from_community/templates/helper.rb +2 -0
  28. data/lib/generators/tripper/from_community/templates/migration.rb +30 -0
  29. data/lib/generators/tripper/from_community/templates/model.rb +54 -0
  30. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/create.rb +11 -0
  31. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/destroy.rb +6 -0
  32. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/edit.rb +4 -0
  33. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/index.rb +4 -0
  34. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/new.rb +4 -0
  35. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/show.rb +4 -0
  36. data/lib/generators/tripper/from_community/templates/tests/rspec/actions/update.rb +11 -0
  37. data/lib/generators/tripper/from_community/templates/tests/rspec/controller.rb +8 -0
  38. data/lib/generators/tripper/from_community/templates/tests/rspec/model.rb +7 -0
  39. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/create.rb +13 -0
  40. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/destroy.rb +8 -0
  41. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/edit.rb +6 -0
  42. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/index.rb +6 -0
  43. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/new.rb +6 -0
  44. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/show.rb +6 -0
  45. data/lib/generators/tripper/from_community/templates/tests/shoulda/actions/update.rb +13 -0
  46. data/lib/generators/tripper/from_community/templates/tests/shoulda/controller.rb +5 -0
  47. data/lib/generators/tripper/from_community/templates/tests/shoulda/model.rb +7 -0
  48. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/create.rb +11 -0
  49. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/destroy.rb +6 -0
  50. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/edit.rb +4 -0
  51. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/index.rb +4 -0
  52. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/new.rb +4 -0
  53. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/show.rb +4 -0
  54. data/lib/generators/tripper/from_community/templates/tests/testunit/actions/update.rb +11 -0
  55. data/lib/generators/tripper/from_community/templates/tests/testunit/controller.rb +5 -0
  56. data/lib/generators/tripper/from_community/templates/tests/testunit/model.rb +7 -0
  57. data/lib/generators/tripper/from_community/templates/views/erb/_form.html.erb +16 -0
  58. data/lib/generators/tripper/from_community/templates/views/erb/edit.html.erb +14 -0
  59. data/lib/generators/tripper/from_community/templates/views/erb/index.html.erb +29 -0
  60. data/lib/generators/tripper/from_community/templates/views/erb/new.html.erb +7 -0
  61. data/lib/generators/tripper/from_community/templates/views/erb/show.html.erb +25 -0
  62. data/lib/generators/tripper/from_community/templates/views/haml/_form.html.haml +9 -0
  63. data/lib/generators/tripper/from_community/templates/views/haml/edit.html.haml +14 -0
  64. data/lib/generators/tripper/from_community/templates/views/haml/index.html.haml +25 -0
  65. data/lib/generators/tripper/from_community/templates/views/haml/new.html.haml +7 -0
  66. data/lib/generators/tripper/from_community/templates/views/haml/show.html.haml +20 -0
  67. data/lib/generators/tripper/layout/USAGE +18 -0
  68. data/lib/generators/tripper/layout/layout_generator.rb +29 -0
  69. data/lib/generators/tripper/layout/templates/error_messages_helper.rb +23 -0
  70. data/lib/generators/tripper/layout/templates/layout.html.erb +19 -0
  71. data/lib/generators/tripper/layout/templates/layout.html.haml +21 -0
  72. data/lib/generators/tripper/layout/templates/layout_helper.rb +22 -0
  73. data/lib/generators/tripper/layout/templates/stylesheet.css +83 -0
  74. data/lib/generators/tripper/layout/templates/stylesheet.sass +73 -0
  75. data/lib/generators/tripper/obj_constraint.rb +23 -0
  76. data/lib/generators/tripper/predicate.rb +12 -0
  77. data/lib/generators/tripper/sync_with_community/model.rb +260 -0
  78. data/lib/generators/tripper/sync_with_community/sync_with_community_generator.rb +310 -0
  79. data/lib/generators/tripper/sync_with_community/templates/migration.rb +7 -0
  80. data/lib/generators/tripper/sync_with_community/templates/model/belongs_to.rb +1 -0
  81. data/lib/generators/tripper/sync_with_community/templates/model/has_one.rb +1 -0
  82. data/lib/generators/tripper/sync_with_community/templates/model/validates.rb +2 -0
  83. data/lib/generators/tripper/templates/actions/create.rb +8 -0
  84. data/lib/generators/tripper/templates/actions/destroy.rb +5 -0
  85. data/lib/generators/tripper/templates/actions/edit.rb +3 -0
  86. data/lib/generators/tripper/templates/actions/index.rb +3 -0
  87. data/lib/generators/tripper/templates/actions/new.rb +3 -0
  88. data/lib/generators/tripper/templates/actions/show.rb +3 -0
  89. data/lib/generators/tripper/templates/actions/update.rb +8 -0
  90. data/lib/generators/tripper/templates/controller.rb +3 -0
  91. data/lib/generators/tripper/templates/fixtures.yml +9 -0
  92. data/lib/generators/tripper/templates/helper.rb +2 -0
  93. data/lib/generators/tripper/templates/migration.rb +30 -0
  94. data/lib/generators/tripper/templates/model.rb +54 -0
  95. data/lib/generators/tripper/templates/tests/rspec/actions/create.rb +11 -0
  96. data/lib/generators/tripper/templates/tests/rspec/actions/destroy.rb +6 -0
  97. data/lib/generators/tripper/templates/tests/rspec/actions/edit.rb +4 -0
  98. data/lib/generators/tripper/templates/tests/rspec/actions/index.rb +4 -0
  99. data/lib/generators/tripper/templates/tests/rspec/actions/new.rb +4 -0
  100. data/lib/generators/tripper/templates/tests/rspec/actions/show.rb +4 -0
  101. data/lib/generators/tripper/templates/tests/rspec/actions/update.rb +11 -0
  102. data/lib/generators/tripper/templates/tests/rspec/controller.rb +8 -0
  103. data/lib/generators/tripper/templates/tests/rspec/model.rb +7 -0
  104. data/lib/generators/tripper/templates/tests/shoulda/actions/create.rb +13 -0
  105. data/lib/generators/tripper/templates/tests/shoulda/actions/destroy.rb +8 -0
  106. data/lib/generators/tripper/templates/tests/shoulda/actions/edit.rb +6 -0
  107. data/lib/generators/tripper/templates/tests/shoulda/actions/index.rb +6 -0
  108. data/lib/generators/tripper/templates/tests/shoulda/actions/new.rb +6 -0
  109. data/lib/generators/tripper/templates/tests/shoulda/actions/show.rb +6 -0
  110. data/lib/generators/tripper/templates/tests/shoulda/actions/update.rb +13 -0
  111. data/lib/generators/tripper/templates/tests/shoulda/controller.rb +5 -0
  112. data/lib/generators/tripper/templates/tests/shoulda/model.rb +7 -0
  113. data/lib/generators/tripper/templates/tests/testunit/actions/create.rb +11 -0
  114. data/lib/generators/tripper/templates/tests/testunit/actions/destroy.rb +6 -0
  115. data/lib/generators/tripper/templates/tests/testunit/actions/edit.rb +4 -0
  116. data/lib/generators/tripper/templates/tests/testunit/actions/index.rb +4 -0
  117. data/lib/generators/tripper/templates/tests/testunit/actions/new.rb +4 -0
  118. data/lib/generators/tripper/templates/tests/testunit/actions/show.rb +4 -0
  119. data/lib/generators/tripper/templates/tests/testunit/actions/update.rb +11 -0
  120. data/lib/generators/tripper/templates/tests/testunit/controller.rb +5 -0
  121. data/lib/generators/tripper/templates/tests/testunit/model.rb +7 -0
  122. data/lib/generators/tripper/templates/views/erb/_form.html.erb +16 -0
  123. data/lib/generators/tripper/templates/views/erb/edit.html.erb +14 -0
  124. data/lib/generators/tripper/templates/views/erb/index.html.erb +29 -0
  125. data/lib/generators/tripper/templates/views/erb/new.html.erb +7 -0
  126. data/lib/generators/tripper/templates/views/erb/show.html.erb +25 -0
  127. data/lib/generators/tripper/templates/views/haml/_form.html.haml +9 -0
  128. data/lib/generators/tripper/templates/views/haml/edit.html.haml +14 -0
  129. data/lib/generators/tripper/templates/views/haml/index.html.haml +25 -0
  130. data/lib/generators/tripper/templates/views/haml/new.html.haml +7 -0
  131. data/lib/generators/tripper/templates/views/haml/show.html.haml +20 -0
  132. data/lib/tripper.rb +1 -0
  133. data/lib/tripper/GOSPLDB/config/database.yml +6 -0
  134. data/lib/tripper/GOSPLDB/config_db.rb +9 -0
  135. data/lib/tripper/GOSPLDB/console +2 -0
  136. data/lib/tripper/GOSPLDB/gospl_db_classes.rb +343 -0
  137. data/lib/tripper/GOSPLDB/play_around.rb +4 -0
  138. data/lib/tripper/GOSPLDB/rakefile.rb +88 -0
  139. data/lib/tripper/GOSPLDBToORMDB/gospl_db_to_orm_db.rb +88 -0
  140. data/lib/tripper/ORMDB/config/database.yml +6 -0
  141. data/lib/tripper/ORMDB/config_db.rb +9 -0
  142. data/lib/tripper/ORMDB/console +2 -0
  143. data/lib/tripper/ORMDB/db/migrations/0_create_orm_object_table.rb +17 -0
  144. data/lib/tripper/ORMDB/db/migrations/10_create_no_lot_constraint_table.rb +17 -0
  145. data/lib/tripper/ORMDB/db/migrations/11_create_value_constraint_table.rb +14 -0
  146. data/lib/tripper/ORMDB/db/migrations/12_create_value_constraint_value_table.rb +16 -0
  147. data/lib/tripper/ORMDB/db/migrations/13_create_value_range_table.rb +15 -0
  148. data/lib/tripper/ORMDB/db/migrations/14_create_frequency_constraint_table.rb +16 -0
  149. data/lib/tripper/ORMDB/db/migrations/15_create_value_table.rb +15 -0
  150. data/lib/tripper/ORMDB/db/migrations/16_create_ring_constraint_table.rb +14 -0
  151. data/lib/tripper/ORMDB/db/migrations/17_create_orm_schema_table.rb +21 -0
  152. data/lib/tripper/ORMDB/db/migrations/18_create_uniqueness_constraint_table.rb +15 -0
  153. data/lib/tripper/ORMDB/db/migrations/1_create_no_lot_table.rb +18 -0
  154. data/lib/tripper/ORMDB/db/migrations/2_create_lot_table.rb +18 -0
  155. data/lib/tripper/ORMDB/db/migrations/3_create_object_role_table.rb +18 -0
  156. data/lib/tripper/ORMDB/db/migrations/4_create_reference_table.rb +17 -0
  157. data/lib/tripper/ORMDB/db/migrations/5_create_predicate_table.rb +18 -0
  158. data/lib/tripper/ORMDB/db/migrations/6_create_object_role_constraint_table.rb +18 -0
  159. data/lib/tripper/ORMDB/db/migrations/7_create_subtype_table.rb +17 -0
  160. data/lib/tripper/ORMDB/db/migrations/8_create_mandatory_constraint_table.rb +15 -0
  161. data/lib/tripper/ORMDB/db/migrations/9_create_constraint_table.rb +15 -0
  162. data/lib/tripper/ORMDB/db/orm_ml.sqlite3 +0 -0
  163. data/lib/tripper/ORMDB/db/orm_ml.sqlite3.backup +0 -0
  164. data/lib/tripper/ORMDB/db/orm_ml.sqlite3.juli28-2013 +0 -0
  165. data/lib/tripper/ORMDB/db/orm_ml.sqlite3.old +0 -0
  166. data/lib/tripper/ORMDB/db/schema.rb +58 -0
  167. data/lib/tripper/ORMDB/erd.pdf +0 -0
  168. data/lib/tripper/ORMDB/migrate_db.rb +21 -0
  169. data/lib/tripper/ORMDB/orm_db_classes.rb +423 -0
  170. data/lib/tripper/ORMDB/populate.rb +4 -0
  171. data/lib/tripper/ORMDB/rakefile.rb +88 -0
  172. data/lib/tripper/model_parsers/attribute_parser/AttributeParser.g +50 -0
  173. data/lib/tripper/model_parsers/attribute_parser/AttributeParser.tokens +13 -0
  174. data/lib/tripper/model_parsers/attribute_parser/AttributeParserLexer.rb +538 -0
  175. data/lib/tripper/model_parsers/attribute_parser/AttributeParserParser.rb +412 -0
  176. data/lib/tripper/model_parsers/attribute_parser/playing_around.rb +14 -0
  177. data/lib/tripper/model_parsers/belongs_to/BelongsToParser.g +63 -0
  178. data/lib/tripper/model_parsers/belongs_to/BelongsToParser.tokens +21 -0
  179. data/lib/tripper/model_parsers/belongs_to/BelongsToParserLexer.rb +667 -0
  180. data/lib/tripper/model_parsers/belongs_to/BelongsToParserParser.rb +552 -0
  181. data/lib/tripper/model_parsers/belongs_to/playing_around.rb +9 -0
  182. data/lib/tripper/model_parsers/database_fields_parser/DatabaseFieldsParser.g +47 -0
  183. data/lib/tripper/model_parsers/database_fields_parser/DatabaseFieldsParser.tokens +14 -0
  184. data/lib/tripper/model_parsers/database_fields_parser/DatabaseFieldsParserLexer.rb +513 -0
  185. data/lib/tripper/model_parsers/database_fields_parser/DatabaseFieldsParserParser.rb +279 -0
  186. data/lib/tripper/model_parsers/database_fields_parser/playing_around.rb +14 -0
  187. data/lib/tripper/model_parsers/has_and_belongs_to_many/HasAndBelongsToManyParser.g +92 -0
  188. data/lib/tripper/model_parsers/has_and_belongs_to_many/HasAndBelongsToManyParser.tokens +25 -0
  189. data/lib/tripper/model_parsers/has_and_belongs_to_many/HasAndBelongsToManyParserLexer.rb +787 -0
  190. data/lib/tripper/model_parsers/has_and_belongs_to_many/HasAndBelongsToManyParserParser.rb +1024 -0
  191. data/lib/tripper/model_parsers/has_and_belongs_to_many/playing_around.rb +9 -0
  192. data/lib/tripper/model_parsers/has_many/HasManyParser.g +77 -0
  193. data/lib/tripper/model_parsers/has_many/HasManyParser.tokens +23 -0
  194. data/lib/tripper/model_parsers/has_many/HasManyParserLexer.rb +710 -0
  195. data/lib/tripper/model_parsers/has_many/HasManyParserParser.rb +788 -0
  196. data/lib/tripper/model_parsers/has_many/playing_around.rb +9 -0
  197. data/lib/tripper/model_parsers/has_one/HasOneParser.g +63 -0
  198. data/lib/tripper/model_parsers/has_one/HasOneParser.tokens +21 -0
  199. data/lib/tripper/model_parsers/has_one/HasOneParserLexer.rb +664 -0
  200. data/lib/tripper/model_parsers/has_one/HasOneParserParser.rb +552 -0
  201. data/lib/tripper/model_parsers/has_one/playing_around.rb +9 -0
  202. data/lib/tripper/model_parsers/validates/ValidatesParser.g +68 -0
  203. data/lib/tripper/model_parsers/validates/ValidatesParser.tokens +35 -0
  204. data/lib/tripper/model_parsers/validates/ValidatesParserLexer.rb +899 -0
  205. data/lib/tripper/model_parsers/validates/ValidatesParserParser.rb +869 -0
  206. data/lib/tripper/model_parsers/validates/playing_around.rb +9 -0
  207. data/lib/tripper/rails.rb +8 -0
  208. data/lib/tripper/version.rb +3 -0
  209. data/tripper.gemspec +33 -0
  210. metadata +408 -0
@@ -0,0 +1,226 @@
1
+ require 'generators/tripper'
2
+
3
+ require 'tripper/GOSPLDB/gospl_db_classes'
4
+ require 'tripper/ORMDB/orm_db_classes'
5
+ require 'tripper/model_parsers/attribute_parser/AttributeParserParser'
6
+ require 'tripper/model_parsers/belongs_to/BelongsToParserParser'
7
+ require 'tripper/model_parsers/validates/ValidatesParserParser'
8
+ require 'tripper/model_parsers/has_one/HasOneParserParser'
9
+ require 'tripper/model_parsers/database_fields_parser/DatabaseFieldsParserParser'
10
+ require 'tripper/model_parsers/has_and_belongs_to_many/HasAndBelongsToManyParserParser'
11
+ require 'tripper/model_parsers/has_many/HasManyParserParser'
12
+
13
+ require "highline/import"
14
+
15
+ module Tripper
16
+ module Generators
17
+ class Model
18
+ include Comparable
19
+ attr_accessor :path, :class_name, :attributes, :belongs_tos, :has_ones, :has_manies, :has_and_belongs_to_manies, :validations
20
+
21
+ def initialize(path)
22
+ @path = path
23
+ @class_name = File.basename(path, ".rb").camelize
24
+ @attributes = []
25
+ @belongs_tos = []
26
+ @has_ones = []
27
+ @has_manies = []
28
+ @has_and_belongs_to_manies = []
29
+ @validations = Validations.new
30
+ # puts "parsing file"+path
31
+ unless path.include? "app/tripper/models"
32
+ @attributes = Kernel.const_get(@class_name).column_names - ["id", "created_at", "updated_at"]
33
+ end
34
+ File.foreach(path) do |line|
35
+ if line.include?("# database_fields:") && path.include?("app/tripper/models")
36
+ parser = DatabaseFieldsParser::Parser.new(line)
37
+ res = parser.database_fields
38
+ @attributes = res
39
+ elsif line.include? "has_one"
40
+ # puts "parsing has_one"
41
+ parser = HasOneParser::Parser.new(line)
42
+ res = parser.has_one
43
+ @has_ones << HasOne.new(res[:attribute], res[:class_name]) if res
44
+ elsif line.include? "has_many"
45
+ # puts "parsing has_many"
46
+ parser = HasManyParser::Parser.new(line)
47
+ res = parser.has_many
48
+ @has_manies << HasMany.new(res[:attribute], res[:class_name]) if res
49
+ elsif line.include? "has_and_belongs_to_many"
50
+ #puts "parsing has_and_belongs_to_many"
51
+ parser = HasAndBelongsToManyParser::Parser.new(line)
52
+ res = parser.has_and_belongs_to_many
53
+ @has_and_belongs_to_manies << HasAndBelongsToMany.new(res[:attribute], res[:class_name]) if res
54
+ elsif line.include? "belongs_to"
55
+ # puts "parsing belongs_to"
56
+ parser = BelongsToParser::Parser.new(line)
57
+ res = parser.belongs_to
58
+ @belongs_tos << BelongsTo.new(res[:attribute], res[:class_name]) if res
59
+ elsif line.include?("validates") && (line.include?("uniqueness") || line.include?("presence"))
60
+ # puts "parsing validates"
61
+ parser = ValidatesParser::Parser.new(line)
62
+ res = parser.validates
63
+ @validations << Validation.new(res[:type], res[:attribute], res[:on]) if res
64
+ end
65
+ end
66
+ end
67
+
68
+ # we need to uniqueify and sort the validations list, to allow symetric constraints
69
+ # e.g validates :my_time_id, :uniqueness => {:scope => :my_date_id}
70
+ # and validates :my_date_id, :uniqueness => {:scope => :my_time_id}
71
+ def <=> other
72
+ [self.class_name, self.attributes.sort, self.belongs_tos.sort, self.has_ones.sort, self.has_manies.sort, self.has_and_belongs_to_manies.sort, self.validations.uniq{|v| v.comparable_object}.sort] <=> [other.class_name, other.attributes.sort, other.belongs_tos.sort, other.has_ones.sort, other.has_manies.sort, other.has_and_belongs_to_manies.sort, other.validations.uniq{|v| v.comparable_object}.sort]
73
+ end
74
+
75
+ def to_s
76
+ self.class_name + " " + self.attributes.to_s + " " + self.belongs_tos.to_s + " " + self.validations.to_s
77
+ end
78
+
79
+ def differences other
80
+ ModelDiff.new(self, other)
81
+ end
82
+
83
+ end
84
+
85
+ # compaires model1 with model2. The result is in the point of view of model1.
86
+ # e.g. if it has: :lacking=>[time], it means that model1 did not have time, while model2 did.
87
+ class ModelDiff
88
+ attr_accessor :model1, :model2, :attributes_diff, :belongs_tos_diff, :has_ones_diff, :has_manies_diff, :has_and_belongs_to_manies_diff, :validations_diff
89
+
90
+ def initialize model1, model2
91
+ @model1 = model1
92
+ @model2 = model2
93
+ @attributes_diff = difference_in_field :attributes
94
+ @belongs_tos_diff = difference_in_field :belongs_tos
95
+ @has_ones_diff = difference_in_field :has_ones
96
+ @has_manies_diff = difference_in_field :has_manies
97
+ @has_and_belongs_to_manies_diff = difference_in_field :has_and_belongs_to_manies
98
+ @validations_diff = difference_in_field :validations
99
+ end
100
+
101
+ def inspect
102
+ res = {model1: @model1.class_name, model2: @model2.class_name}
103
+ res[:attributes_diff] = @attributes_diff unless @attributes_diff.empty?
104
+ res[:belongs_tos_diff] = @belongs_tos_diff unless @belongs_tos_diff.empty?
105
+ res[:has_ones_diff] = @has_ones_diff unless @has_ones_diff.empty?
106
+ res[:has_manies_diff] = @has_manies_diff unless @has_manies_diff.empty?
107
+ res[:has_and_belongs_to_manies_diff] = @has_and_belongs_to_manies_diff unless @has_and_belongs_to_manies_diff.empty?
108
+ res[:validations_diff] = @validations_diff unless @validations_diff.empty?
109
+ res
110
+ end
111
+
112
+ private
113
+
114
+ def difference_in_field field
115
+ extra = @model1.send(field).reject { |att| @model2.send(field).include? att }
116
+ lacking = @model2.send(field).reject { |att| @model1.send(field).include? att }
117
+ FieldDiff.new extra: extra, lacking: lacking
118
+ end
119
+
120
+ class FieldDiff
121
+ attr_accessor :extra, :lacking
122
+ def initialize params={}
123
+ @extra = (params[:extra] ? params[:extra] : [])
124
+ @lacking = (params[:lacking] ? params[:lacking] : [])
125
+ end
126
+
127
+ def inspect
128
+ {extra: @extra, lacking: @lacking}
129
+ end
130
+
131
+ def empty?
132
+ @extra.empty? && @lacking.empty?
133
+ end
134
+ end
135
+ end
136
+
137
+ class Relation
138
+ include Comparable
139
+ attr_accessor :name, :class_name, :type
140
+
141
+ def initialize (type, name, class_name=nil)
142
+ @type = @type
143
+ @name = name
144
+ @class_name = class_name
145
+ end
146
+
147
+ def to_s
148
+ self.name + " " + (self.class_name ? self.class_name : "")
149
+ end
150
+
151
+ def <=> other
152
+ [self.name, self.class_name, self.type] <=> [self.name, other.class_name, self.type]
153
+ end
154
+
155
+ def == other
156
+ self.name == other.name && self.class_name == other.class_name && self.type == other.type
157
+ end
158
+ end
159
+
160
+ class BelongsTo < Relation
161
+ def initialize (name, class_name=nil)
162
+ super("belongs_to", name, class_name)
163
+ end
164
+ end
165
+
166
+ class HasOne < Relation
167
+ def initialize (name, class_name=nil)
168
+ super("has_one", name, class_name)
169
+ end
170
+ end
171
+
172
+ class HasMany < Relation
173
+ def initialize (name, class_name=nil)
174
+ super("has_many", name, class_name)
175
+ end
176
+ end
177
+
178
+ class HasAndBelongsToMany < Relation
179
+ def initialize (name, class_name=nil)
180
+ super("has_and_belongs_to_many", name, class_name)
181
+ end
182
+ end
183
+
184
+ class Validations < Array
185
+ def presence
186
+ self.select do |obj|
187
+ obj.type == "presence"
188
+ end
189
+ end
190
+ def uniqueness
191
+ self.select do |obj|
192
+ obj.type == "uniqueness"
193
+ end
194
+ end
195
+ end
196
+
197
+ class Validation
198
+ include Comparable
199
+ attr_accessor :type, :attribute, :scope
200
+
201
+ def initialize (type, attribute, scope)
202
+ @type = type; @attribute = attribute; @scope = scope
203
+ @combined = [scope, attribute].flatten.uniq.sort
204
+ end
205
+
206
+ def to_s
207
+ self.type + " " + @combined.to_s#.sort.to_s
208
+ end
209
+ def <=> other
210
+ self.comparable_object <=> other.comparable_object
211
+ end
212
+
213
+ def == other
214
+ self.comparable_object == other.comparable_object
215
+ end
216
+
217
+ def comparable_object
218
+ [self.type, @combined]
219
+ end
220
+
221
+ private
222
+
223
+ attr_accessor :combined
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,7 @@
1
+ class <%= @migration_action.camelize %><%= @diff_string_list %>To<%= @migration_name %> < ActiveRecord::Migration
2
+ def change
3
+ <%- @differences.attributes_diff.lacking.each do |att| -%>
4
+ <%= @migration_action.downcase %>_column :<%= @migration_name.underscore %>, :<%= att.underscore %>, :string
5
+ <%- end %>
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ belongs_to :<%= @belongs_to_obj.name %>
@@ -0,0 +1 @@
1
+ has_one :<%= @has_one_obj.name %>
@@ -0,0 +1,2 @@
1
+
2
+ validates :<%= @validation.attribute %>, :<%= @validation.type %> => <%= create_validation_scope @validation.scope %>
@@ -0,0 +1,95 @@
1
+ require 'generators/tripper'
2
+ require 'generators/tripper/obj_constraint'
3
+ require 'generators/tripper/predicate'
4
+ require 'generators/tripper/commonalities/commonalities'
5
+
6
+
7
+ require 'rails/generators'
8
+ require 'rails/generators/migration'
9
+ require 'rails/generators/generated_attribute'
10
+ require 'tripper/GOSPLDB/gospl_db_classes'
11
+ require 'tripper/ORMDB/orm_db_classes'
12
+ require 'tripper/GOSPLDBToORMDB/gospl_db_to_orm_db'
13
+
14
+ module Tripper
15
+ module Generators
16
+ class FromCommunityGenerator < Base
17
+ include Rails::Generators::Migration
18
+ include Tripper::Generators::Commonalities
19
+
20
+ attr_accessor :nolot, :name, :class_name, :no_lot_relations, :lot_relations, :timestamp, :model_attributes
21
+
22
+ desc "Create code that corresponds with a GOSPL Community"
23
+
24
+ argument :community_name, :type => :string
25
+
26
+ # Commandline options can be defined here using Thor-like options:
27
+ class_option :haml, :desc => 'Generate HAML views instead of ERB.', :type => :boolean
28
+
29
+ #class varialbe for timestamps
30
+ @@timestamp = Time.now.utc
31
+
32
+
33
+ def initialize (*args, &block)
34
+ super
35
+ #@model_attributes = []
36
+ end
37
+
38
+ def test
39
+ puts "hello world of generators! your community is #{community_name} #{Rails.root} #{destroying?}"
40
+ end
41
+
42
+ def check_nolots
43
+ community = Tripper::ORMDB::OrmSchema.find_by_title community_name
44
+ unless community
45
+ Tripper::GOSPLDBToORMDB.import community_name
46
+ community = Tripper::ORMDB::OrmSchema.find_by_title community_name
47
+ end
48
+ if community
49
+ community.no_lots.each do |nolot|
50
+ @nolot = nolot
51
+ @name = nolot.name
52
+ #also check for inheritance of ActiveRecord::Base, because some words are already ruby classes (e.g. Time)
53
+ if !(class_exists?(name) && (get_class < ActiveRecord::Base)) || destroying?
54
+ puts "still have to create this class"
55
+ create_new_class
56
+ end
57
+ end
58
+ puts community.inspect
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def create_new_class
65
+ @class_name = get_class_name @nolot
66
+ @model_attributes = []
67
+ @nolot.identifying_constraint_objects.lots.each do |lot|
68
+ @model_attributes << Rails::Generators::GeneratedAttribute.new(lot_attribute_name(lot), "String")
69
+ end
70
+ create_migration
71
+ create_model
72
+ create_controller
73
+ end
74
+
75
+ def class_exists? name
76
+ begin
77
+ true if Kernel.const_get(name)
78
+ rescue NameError
79
+ false
80
+ end
81
+ end
82
+
83
+
84
+
85
+ def self.next_migration_number(dirname) #:nodoc:
86
+ if ActiveRecord::Base.timestamped_migrations
87
+ @@timestamp = @@timestamp + 1.seconds
88
+ @@timestamp.strftime("%Y%m%d%H%M%S")
89
+ else
90
+ "%.3d" % (current_migration_number(dirname) + 1)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,8 @@
1
+ def create
2
+ @<%= instance_name %> = <%= class_name %>.new(params[:<%= instance_name %>])
3
+ if @<%= instance_name %>.save
4
+ redirect_to <%= item_url %>, :notice => "Successfully created <%= class_name.underscore.humanize.downcase %>."
5
+ else
6
+ render :new
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ def destroy
2
+ @<%= instance_name %> = <%= class_name %>.find(params[:id])
3
+ @<%= instance_name %>.destroy
4
+ redirect_to <%= items_url %>, :notice => "Successfully destroyed <%= class_name.underscore.humanize.downcase %>."
5
+ end
@@ -0,0 +1,3 @@
1
+ def edit
2
+ @<%= instance_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,3 @@
1
+ def index
2
+ @<%= instances_name %> = <%= class_name %>.all
3
+ end
@@ -0,0 +1,3 @@
1
+ def new
2
+ @<%= instance_name %> = <%= class_name %>.new
3
+ end
@@ -0,0 +1,3 @@
1
+ def show
2
+ @<%= instance_name %> = <%= class_name %>.find(params[:id])
3
+ end
@@ -0,0 +1,8 @@
1
+ def update
2
+ @<%= instance_name %> = <%= class_name %>.find(params[:id])
3
+ if @<%= instance_name %>.update_attributes(params[:<%= instance_name %>])
4
+ redirect_to <%= item_url %>, :notice => "Successfully updated <%= class_name.underscore.humanize.downcase %>."
5
+ else
6
+ render :edit
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ class <%= plural_class_name %>Controller < ApplicationController
2
+ <%= controller_methods :actions %>
3
+ end
@@ -0,0 +1,9 @@
1
+ one:
2
+ <%- for attribute in model_attributes -%>
3
+ <%= attribute.name %>: <%= attribute.default %>
4
+ <%- end -%>
5
+
6
+ two:
7
+ <%- for attribute in model_attributes -%>
8
+ <%= attribute.name %>: <%= attribute.default %>
9
+ <%- end -%>
@@ -0,0 +1,2 @@
1
+ module <%= plural_class_name %>Helper
2
+ end
@@ -0,0 +1,30 @@
1
+ class Create<%= class_name.pluralize.delete('::') %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= plural_name.split('/').last %> do |t|
4
+ <%- for attribute in model_attributes -%>
5
+ t.<%= attribute.type.downcase %> :<%= attribute.name %>
6
+ <%- end -%>
7
+ <%- for nolot in @nolot.identifying_constraint_objects.no_lots -%>
8
+ t.references :<%= attribute_nameify get_class_name(nolot) %>
9
+ <%- end -%>
10
+ t.timestamps
11
+ end
12
+ <%- for nolot in @nolot.has_many_many -%>
13
+ <%- if @nolot.name < nolot.name -%>
14
+ create_table :<%= plural_name.split('/').last %>_<%= get_class_name(nolot).underscore.pluralize %> do |t|
15
+ t.belongs_to :<%=attribute_nameify get_class_name(@nolot)%>
16
+ t.belongs_to :<%=attribute_nameify get_class_name(nolot)%>
17
+ end
18
+ <%- end -%>
19
+ <%- end -%>
20
+ end
21
+
22
+ def self.down
23
+ drop_table :<%= plural_name.split('/').last %>
24
+ <%- for nolot in @nolot.has_many_many -%>
25
+ <%- if @nolot.name < nolot.name -%>
26
+ drop_table :<%= plural_name.split('/').last %>_<%= get_class_name(nolot).underscore.pluralize %>
27
+ <%- end -%>
28
+ <%- end -%>
29
+ end
30
+ end
@@ -0,0 +1,54 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ <%- db_model_attr = model_attributes.map { |attribute| attribute.name }.join(", ") -%>
3
+ <%- db_foreign_keys = @nolot.identifying_constraint_objects.no_lots.map {|nolot| "#{attribute_nameify get_class_name(nolot)}_id" if @nolot.contains_identifying_constraint?}.join(", ") -%>
4
+ <%- db_attributes = db_model_attr + ((db_model_attr == "" || db_foreign_keys == "") ? db_foreign_keys : (", " + db_foreign_keys)) -%>
5
+ <%- model_attr = model_attributes.map { |attribute| ":#{attribute.name}" }.join(", ") -%>
6
+ <%- foreign_keys = @nolot.identifying_constraint_objects.no_lots.map {|nolot| ":#{attribute_nameify get_class_name(nolot)}_id" if @nolot.contains_identifying_constraint?}.join(", ") -%>
7
+ <%- attributes = model_attr + ((model_attr == "" || foreign_keys == "") ? foreign_keys : (", " + foreign_keys)) -%>
8
+ # database_fields: <%= db_attributes %>
9
+ attr_accessible <%= attributes %>
10
+
11
+ <%- for nolot in @nolot.identifying_constraint_objects.no_lots -%>
12
+ belongs_to :<%= attribute_nameify get_class_name(nolot) %>
13
+ <%- end -%>
14
+ <%- for nolot in @nolot.object_types_identified_by_me.no_lots -%>
15
+ has_one :<%= attribute_nameify get_class_name(nolot) %>
16
+ <%- end -%>
17
+ <%- for nolot in @nolot.has_many -%>
18
+ has_many :<%= (attribute_nameify get_class_name(nolot)).pluralize %>
19
+ <%- end -%>
20
+ <%- for nolot in @nolot.has_many_many -%>
21
+ has_and_belongs_to_many :<%= (attribute_nameify get_class_name(nolot)).pluralize %>
22
+ <%- end -%>
23
+
24
+ <%- # Set external uniqueness uniqueness constraints -%>
25
+ <%- for orm_array in @nolot.exernal_uniqueness_constraint_object_types -%>
26
+ <%- if orm_array.no_lots.empty? -%>
27
+ <%- head, *tail = orm_array.lots -%>
28
+ validates :<%= lot_attribute_name(head) %>, :uniqueness => {:scope => <%= tail.size == 1 ? ":#{lot_attribute_name(tail.first)}" : "[" + tail.map {|lot| ":#{lot_attribute_name(lot)}"}.join(", ") + "]" %>}
29
+ <%- elsif orm_array.lots.empty? -%>
30
+ <%- head, *tail = orm_array.no_lots -%>
31
+ validates :<%= "#{attribute_nameify get_class_name(head)}_id" %>, :uniqueness => {:scope => <%= tail.size == 1 ? ":#{attribute_nameify get_class_name(tail.first)}_id" : "[" + tail.map {|nolot| ":#{attribute_nameify get_class_name(nolot)}_id"}.join(", ") + "]" %>}
32
+ <%- elsif !orm_array.lots.empty? && !orm_array.no_lots.empty? -%>
33
+ <%- head, *tail = orm_array.no_lots -%>
34
+ <%- lots = orm_array.lots -%>
35
+ validates :<%= "#{attribute_nameify get_class_name(head)}_id" %>, :uniqueness => {:scope => <%= (tail.size + lots.size) == 1 ? ":#{lot_attribute_name(lots.first)}" : "[" + tail.map {|nolot| ":#{attribute_nameify get_class_name(nolot)}_id"}.join(", ") + lots.map {|lot| ":#{lot_attribute_name(lot)}"}.join(", ") + "]" %>}
36
+ <%- end -%>
37
+ <%- end -%>
38
+
39
+ <%- # Set mandatory constraints -%>
40
+ <%- for nolot in @nolot.mandatory_constraint_objects.no_lots -%>
41
+ validates :<%= "#{attribute_nameify get_class_name(nolot)}_id" %>, :presence => true
42
+ <%- end -%>
43
+ <%- for lot in @nolot.mandatory_constraint_objects.lots -%>
44
+ validates :<%= lot_attribute_name(lot) %>, :presence => true
45
+ <%- end -%>
46
+
47
+ def textualize
48
+ text = ""
49
+ attributes.each do |attr_name, attr_val|
50
+ text += "#{attr_name}: #{attr_val}, " unless attr_val=="" || %w[created_at updated_at].include?(attr_name)
51
+ end
52
+ text.chomp(", ")
53
+ end
54
+ end