tripper 0.0.3d

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 (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