ixtlan 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 (29) hide show
  1. data/Manifest.txt +11 -1
  2. data/Rakefile +20 -3
  3. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb +157 -0
  4. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java +13 -0
  5. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java +43 -0
  6. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/GwtTestSuite.java +14 -0
  7. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java +103 -0
  8. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java +50 -0
  9. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java +60 -0
  10. data/generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java +110 -0
  11. data/generators/ixtlan_datamapper_model/templates/model.rb +9 -0
  12. data/lib/dm-serializer/to_xml.rb +3 -1
  13. data/lib/ixtlan/child_path.rb +18 -0
  14. data/lib/ixtlan/controllers/phrases_controller.rb +149 -0
  15. data/lib/ixtlan/controllers/texts_controller.rb +10 -2
  16. data/lib/ixtlan/guard.rb +17 -1
  17. data/lib/ixtlan/logger_config.rb +1 -0
  18. data/lib/ixtlan/models/{text.rb → i18n_text.rb} +5 -4
  19. data/lib/ixtlan/models/phrase.rb +2 -2
  20. data/lib/ixtlan/models/translation.rb +2 -2
  21. data/lib/ixtlan/models/user.rb +1 -1
  22. data/lib/ixtlan/models/word.rb +1 -1
  23. data/lib/ixtlan/models.rb +1 -1
  24. data/lib/ixtlan/rails/error_handling.rb +2 -1
  25. data/lib/ixtlan/rails/unrestful_authentication.rb +1 -1
  26. data/lib/ixtlan/version.rb +1 -1
  27. data/lib/models.rb +5 -0
  28. data/spec/spec_helper.rb +1 -1
  29. metadata +13 -3
data/Manifest.txt CHANGED
@@ -7,6 +7,14 @@ generators/ixtlan_datamapper_rspec_scaffold/templates/controller.rb
7
7
  generators/ixtlan_datamapper_rspec_scaffold/templates/controller_spec.rb
8
8
  generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb
9
9
  generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb
10
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb
11
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java
12
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java
13
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java
14
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java
15
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java
16
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/GwtTestSuite.java
17
+ generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java
10
18
  lib/models.rb
11
19
  lib/ixtlan.rb
12
20
  lib/dm-serializer.rb
@@ -27,11 +35,12 @@ lib/ixtlan/models/configuration_locale.rb
27
35
  lib/ixtlan/models/word.rb
28
36
  lib/ixtlan/models/configuration.rb
29
37
  lib/ixtlan/models/authentication.rb
30
- lib/ixtlan/models/text.rb
38
+ lib/ixtlan/models/i18n_text.rb
31
39
  lib/ixtlan/models/group_user.rb
32
40
  lib/ixtlan/models/group.rb
33
41
  lib/ixtlan/rolling_file.rb
34
42
  lib/ixtlan/cms_script.rb
43
+ lib/ixtlan/child_path.rb
35
44
  lib/ixtlan/logger_config.rb
36
45
  lib/ixtlan/models.rb
37
46
  lib/ixtlan/audit_config.rb
@@ -43,6 +52,7 @@ lib/ixtlan/optimistic_persistence_module.rb
43
52
  lib/ixtlan/optimistic_persistence_validation.rb
44
53
  lib/ixtlan/error_notifier/error_notification.rhtml
45
54
  lib/ixtlan/controllers/texts_controller.rb
55
+ lib/ixtlan/controllers/phrases_controller.rb
46
56
  lib/ixtlan/controllers/permissions_controller.rb
47
57
  lib/ixtlan/controllers/authentications_controller.rb
48
58
  lib/ixtlan/controllers/configurations_controller.rb
data/Rakefile CHANGED
@@ -24,15 +24,32 @@ end
24
24
  desc 'generate rails using all generators and run the specs'
25
25
  task :integration_tests => [:spec, :install] do
26
26
  require 'datamapper4rails/integration_test'
27
- Datamapper4Rails::IntegrationTest.new do |t|
27
+ tests = Datamapper4Rails::IntegrationTest.new do |t|
28
28
  t.directory = 'temp'
29
+ ENV['GWT'] = "true"
29
30
  t.rails_template = 'ixtlan_rails_templates.rb'
30
31
  t.generate "ixtlan_datamapper_model name name:string"
31
32
  t.generate "ixtlan_datamapper_rspec_model domain name:string"
32
- t.generate "ixtlan_datamapper_rspec_scaffold word name:string"
33
- end
33
+ t.generate "ixtlan_datamapper_rspec_scaffold player name:string"
34
+ t.generate "gwt_ixtlan_datamapper_rspec_scaffold word name:string"
35
+ end
36
+ tests.command("mvn clean integration-test")
34
37
  end
35
38
 
36
39
  YARD::Rake::YardocTask.new
37
40
 
41
+ module Datamapper4Rails
42
+ class IntegrationTest
43
+ def command(command)
44
+ FileUtils.cd(@directory) do
45
+ unless system("#{command}")
46
+ puts
47
+ puts "error in: #{command}"
48
+ exit 1
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
38
55
  # vim: syntax=Ruby
@@ -0,0 +1,157 @@
1
+ require 'datamapper4rails/overlay'
2
+ require 'datamapper4rails/rspec_default_values'
3
+
4
+ class String
5
+ def javanize
6
+ s = camelize
7
+ s[0,1].downcase! + s[1,1000]
8
+ end
9
+ end
10
+
11
+ class GwtIxtlanDatamapperRspecScaffoldGenerator < IxtlanDatamapperRspecScaffoldGenerator
12
+
13
+ attr_reader :package
14
+
15
+ def find_client_dir(dir)
16
+ dir.entries.each do |entry|
17
+ path = File.join(dir.path, entry)
18
+ if File.directory? path
19
+ if entry == "client"
20
+ return path
21
+ elsif entry != ".." && entry != "."
22
+ return find_client_dir(Dir.new(path))
23
+ end
24
+ end
25
+ end
26
+ nil
27
+ end
28
+
29
+ def manifest
30
+ overlay_dirs.add_generator("ixtlan_datamapper_rspec_scaffold")
31
+
32
+ m = super
33
+
34
+ base = "src/main/java/"
35
+
36
+ basedir = find_client_dir(Dir.new(base))
37
+ basedir_test = basedir.sub(/main/, 'test')
38
+
39
+ @package = basedir.sub(/#{base}/, "").gsub(/\//, ".")
40
+
41
+ m.directory(File.join(basedir, 'models', controller_class_path))
42
+ m.template 'Model.java', File.join(basedir, 'models', controller_class_path, "#{class_name}.java")
43
+ m.template 'ModelFactory.java', File.join(basedir, 'models', controller_class_path, "#{class_name}Factory.java")
44
+
45
+ m.directory(File.join(basedir, 'views', controller_class_path, controller_file_name))
46
+
47
+ m.template 'Fields.java', File.join(basedir, 'views', controller_class_path, controller_file_name, "#{class_name}Fields.java")
48
+ m.template 'Screen.java', File.join(basedir, 'views', controller_class_path, controller_file_name, "#{class_name}Screen.java")
49
+
50
+ m.directory(File.join(basedir_test, 'models', controller_class_path))
51
+ m.template 'AbstractApplicationResourceTestGwt.java', File.join(basedir_test, 'models', controller_class_path, "AbstractApplicationResourceTestGwt.java")
52
+ m.template 'TestGwt.java', File.join(basedir_test, 'models', controller_class_path, "#{class_name}TestGwt.java")
53
+ suiteFile = File.join(basedir_test, controller_class_path, "GwtTestSuite.java")
54
+ unless File.exists?(suiteFile)
55
+ m.template 'GwtTestSuite.java', suiteFile
56
+ end
57
+ m.add_testcase @package, suiteFile, class_name
58
+ m.add_screen File.join(basedir, "Application.java"), @package, class_name, singular_name, plural_name
59
+
60
+ m
61
+ end
62
+
63
+ end
64
+
65
+ module Rails
66
+ module Generator
67
+ module Commands
68
+ class Create < Base
69
+
70
+ def route_resources(*resources)
71
+ unless options[:pretend]
72
+ resource_list = resources.map { |r| r.to_sym.inspect }.join(', ')
73
+ skip_route = false
74
+ gsub_file 'config/routes.rb', /(map.resources #{resource_list})/mi do |match|
75
+ skip_route = true
76
+ "#{match}"
77
+ end
78
+ sentinel = 'ActionController::Routing::Routes.draw do |map|'
79
+
80
+ logger.route "map.resources #{resource_list}" + (skip_route ? " - skipped" : " - added")
81
+ unless skip_route
82
+ gsub_file 'config/routes.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
83
+ "#{match}\n map.resources #{resource_list}\n"
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def add_testcase(package, suite_file, class_name)
90
+ unless options[:pretend]
91
+ skip_testcase = false
92
+ gsub_file suite_file, /(import #{package}.models.#{class_name}TestGwt;)/mi do |match|
93
+ skip_testcase = true
94
+ "#{match}"
95
+ end
96
+ logger.testcase(class_name + "TestGwt" + (skip_testcase ? " - skipped" : " - added"))
97
+ unless skip_testcase
98
+ gsub_file suite_file, /(^package\s+[a-z.]*;)/mi do |match|
99
+ "#{match}\n\nimport #{package}.models.#{class_name}TestGwt;"
100
+ end
101
+ gsub_file suite_file, /(^\s+return suite;)/mi do |match|
102
+ " suite.addTestSuite(#{class_name}TestGwt.class);\n#{match}"
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def add_screen(application_file, java_package, class_name, singular_name, plural_name)
109
+ unless options[:pretend]
110
+ variable = "#{class_name[0,1].downcase}#{class_name[1,100]}"
111
+ skip_screen = false
112
+ gsub_file application_file, /(import #{java_package}.models.#{class_name}Factory;)/mi do |match|
113
+ skip_screen = true
114
+ "#{match}"
115
+ end
116
+ logger.screen(class_name + "Screen" + (skip_screen ? " - skipped" : " - added"))
117
+ unless skip_screen
118
+ skip_binding = false
119
+ gsub_file application_file, /(import de.saumya.gwt.translation.common.client.widget.ResourceBindings;)/mi do |match|
120
+ skip_binding = true
121
+ "#{match}"
122
+ end
123
+ unless skip_binding
124
+ gsub_file application_file, /(^package\s+[a-z.]*;)/mi do |match|
125
+ "#{match}\n\nimport de.saumya.gwt.translation.common.client.widget.ResourceBindings;"
126
+ end
127
+ end
128
+ gsub_file application_file, /(^package\s+[a-z.]*;)/mi do |match|
129
+ "#{match}\n\nimport #{java_package}.models.#{class_name}Factory;\nimport #{java_package}.models.#{class_name};\nimport #{java_package}.views.#{plural_name}.#{class_name}Screen;"
130
+ end
131
+ gsub_file application_file, /(screenController = [a-zA-Z.]+;)/mi do |match|
132
+ "#{match}\n\n #{class_name}Factory #{variable}Factory = new #{class_name}Factory(container.repository,\n container.notifications,\n container.userFactory);\n #{class_name}Screen #{variable}Screen = new #{class_name}Screen(container.loadingNotice,\n container.getTextController,\n #{variable}Factory,\n container.session,\n new ResourceBindings<#{class_name}>(),\n container.notifications);\n screenController.addScreen(#{variable}Screen, \"#{plural_name}\");"
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ class GeneratedAttribute
140
+ def sample_value(first = true)
141
+ value = (first ? @first_value : @second_value)
142
+ value ||= case type
143
+ when :int, :integer then first ? "1" : "2"
144
+ when :float then first ? "1.5" : "2.5"
145
+ when :decimal, :big_decimal then first ? "9.99" : "3.33"
146
+ when :date_time, :datetime,
147
+ :timestamp, :time then first ? "2009-09-09 09:09:09.0" : "2010-10-10 10:10:10.0"
148
+ when :date then first ? "2009-09-09" : "2010-10-10"
149
+ when :string, :text then first ? "first valule of #{@name}" : "second value of #{name}"
150
+ when :boolean then first ? "false" : "true"
151
+ else
152
+ ""
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,13 @@
1
+ package <%= package %>.models;
2
+
3
+ import de.saumya.gwt.persistence.client.Resource;
4
+ import de.saumya.gwt.session.client.AbstractUserResourceTestGwt;
5
+
6
+ abstract class AbstractApplicationResourceTestGwt<E extends Resource<E>>
7
+ extends AbstractUserResourceTestGwt<E> {
8
+
9
+ @Override
10
+ public String getModuleName() {
11
+ return "<%= package.sub(/\.client/, '') %>.Application";
12
+ }
13
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ *
3
+ */
4
+ package <%= package %>.views.<%= plural_name %>;
5
+
6
+ import <%= package %>.models.<%= class_name %>;
7
+
8
+ import de.saumya.gwt.translation.common.client.GetTextController;
9
+ import de.saumya.gwt.translation.common.client.widget.ResourceBindings;
10
+ import de.saumya.gwt.translation.common.client.widget.ResourceFields;
11
+ import de.saumya.gwt.translation.gui.client.bindings.CheckBoxBinding;
12
+ import de.saumya.gwt.translation.gui.client.bindings.IntegerTextBoxBinding;
13
+ import de.saumya.gwt.translation.gui.client.bindings.TextBoxBinding;
14
+
15
+ public class <%= class_name %>Fields extends ResourceFields<<%= class_name %>> {
16
+
17
+ public <%= class_name %>Fields(final GetTextController getTextController,
18
+ final ResourceBindings<<%= class_name %>> bindings) {
19
+ super(getTextController, bindings);
20
+ <% Array(attributes).each do |attribute| -%>
21
+ add("<%= attribute.name %>", new <% if attribute.type == :integer %>IntegerText<% elsif attribute.type == :boolean %>Check<% else %>Text<% end -%>BoxBinding<<%= class_name %>>() {
22
+
23
+ @Override
24
+ public void pullFrom(final <%= class_name %> resource) {
25
+ <% if attribute.type == :boolean -%>
26
+ setValue(resource.<%= attribute.name.javanize %>);
27
+ <% else -%>
28
+ setText(resource.<%= attribute.name.javanize %>);
29
+ <% end -%>
30
+ }
31
+
32
+ @Override
33
+ public void pushInto(final <%= class_name %> resource) {
34
+ <% if attribute.type == :boolean -%>
35
+ resource.<%= attribute.name.javanize %> = getValue();
36
+ <% else -%>
37
+ resource.<%= attribute.name.javanize %> = getText<% if attribute.type == :integer %>AsInt<% end -%>();
38
+ <% end -%>
39
+ }
40
+ }<% if attribute.type == :integer %>, 0, 123456<% elsif attribute.type == :boolean %><% else %>, true, 64<% end -%>);
41
+ <% end -%>
42
+ }
43
+ }
@@ -0,0 +1,14 @@
1
+ package <%= package %>;
2
+
3
+ import junit.framework.Test;
4
+ import junit.framework.TestSuite;
5
+
6
+ import com.google.gwt.junit.tools.GWTTestSuite;
7
+
8
+ public class GwtTestSuite extends GWTTestSuite {
9
+
10
+ public static Test suite() {
11
+ final TestSuite suite = new TestSuite("Test for GWT Application");
12
+ return suite;
13
+ }
14
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ *
3
+ */
4
+ package <%= package %>.models;
5
+
6
+ <% if Array(attributes).find { |attr| attr.type == :date } -%>
7
+ import java.sql.Date;
8
+ <% end -%>
9
+ <% if Array(attributes).find { |attr| attr.type == :timestamp } || ! options[:skip_timestamps] -%>
10
+ import java.sql.Timestamp;
11
+ <% end -%>
12
+
13
+ import com.google.gwt.xml.client.Element;
14
+
15
+ import de.saumya.gwt.persistence.client.Repository;
16
+ import de.saumya.gwt.persistence.client.ResourceWithID;
17
+ <% unless options[:skip_modified_by] -%>
18
+ import de.saumya.gwt.session.client.models.User;
19
+ import de.saumya.gwt.session.client.models.UserFactory;
20
+ <% end -%>
21
+
22
+ public class <%= class_name %> extends ResourceWithID<<%= class_name %>> {
23
+
24
+ <% unless options[:skip_modified_by] -%>
25
+ private final UserFactory userFactory;
26
+
27
+ <% end -%>
28
+ protected <%= class_name %>(final Repository repository, final <%= class_name %>Factory factory<% unless options[:skip_modified_by] -%>,
29
+ final UserFactory userFactory<% end -%>) {
30
+ super(repository, factory);
31
+ <% unless options[:skip_modified_by] -%>
32
+ this.userFactory = userFactory;
33
+ <% end -%>
34
+ }
35
+
36
+ <% Array(attributes).each do |attribute| -%>
37
+ public <% if attribute.type == :date %>Date <% elsif attribute.type == :integer %>int <% elsif attribute.type == :boolean %>boolean <% else %>String <% end -%> <%= attribute.name.javanize %>;
38
+ <% end -%>
39
+ <% unless options[:skip_timestamps] -%>
40
+ public Timestamp createdAt;
41
+ public Timestamp updatedAt;
42
+ <% end -%>
43
+ <% unless options[:skip_modified_by] -%>
44
+ public User createdBy;
45
+ public User updatedBy;
46
+ <% end -%>
47
+
48
+ @Override
49
+ protected void appendXml(final StringBuilder buf) {
50
+ super.appendXml(buf);
51
+ <% Array(attributes).each do |attribute| -%>
52
+ appendXml(buf, "<%= attribute.name %>", this.<%= attribute.name.javanize %>);
53
+ <% end -%>
54
+ <% unless options[:skip_timestamps] -%>
55
+ appendXml(buf, "created_at", this.createdAt);
56
+ appendXml(buf, "updated_at", this.updatedAt);
57
+ <% end -%>
58
+ <% unless options[:skip_modified_by] -%>
59
+ appendXml(buf, "created_by", this.createdBy);
60
+ appendXml(buf, "updated_by", this.updatedBy);
61
+ <% end -%>
62
+ }
63
+
64
+ @Override
65
+ protected void fromXml(final Element root) {
66
+ super.fromXml(root);
67
+ <% Array(attributes).each do |attribute| -%>
68
+ this.<%= attribute.name.javanize %> = get<% if attribute.type == :date %>Date<% elsif attribute.type == :integer %>Int<% elsif attribute.type == :boolean %>Boolean<% else %>String<% end -%>(root, "<%= attribute.name %>");
69
+ <% end -%>
70
+ <% unless options[:skip_timestamps] -%>
71
+ this.createdAt = getTimestamp(root, "created_at");
72
+ this.updatedAt = getTimestamp(root, "updated_at");
73
+ <% end -%>
74
+ <% unless options[:skip_modified_by] -%>
75
+ this.createdBy = this.userFactory.getChildResource(root, "created_by");
76
+ this.updatedBy = this.userFactory.getChildResource(root, "updated_by");
77
+ <% end -%>
78
+ }
79
+
80
+ @Override
81
+ public void toString(final StringBuilder buf) {
82
+ super.toString(buf);
83
+ <% Array(attributes).each do |attribute| -%>
84
+ toString(buf, "<%= attribute.name %>", this.<%= attribute.name.javanize %>);
85
+ <% end -%>
86
+ <% unless options[:skip_timestamps] -%>
87
+ toString(buf, "created_at", this.createdAt);
88
+ toString(buf, "updated_at", this.updatedAt);
89
+ <% end -%>
90
+ <% unless options[:skip_modified_by] -%>
91
+ toString(buf, "created_by", this.createdBy);
92
+ toString(buf, "updated_by", this.updatedBy);
93
+ <% end -%>
94
+ }
95
+
96
+ @Override
97
+ public String display() {
98
+ final StringBuilder builder = new StringBuilder("<%= class_name %>");
99
+ builder.append("(").append(this.id).append(")");
100
+ return builder.toString();
101
+ }
102
+
103
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ *
3
+ */
4
+ package <%= package %>.models;
5
+
6
+
7
+ import de.saumya.gwt.persistence.client.Repository;
8
+ import de.saumya.gwt.persistence.client.ResourceFactory;
9
+ import de.saumya.gwt.persistence.client.ResourceNotifications;
10
+
11
+ <% unless options[:skip_modified_by] -%>
12
+ import de.saumya.gwt.session.client.models.UserFactory;
13
+ <% end -%>
14
+
15
+ public class <%= class_name %>Factory extends ResourceFactory<<%= class_name %>> {
16
+
17
+ <% unless options[:skip_modified_by] -%>
18
+ private final UserFactory userFactory;
19
+
20
+ <% end -%>
21
+ public <%= class_name %>Factory(final Repository repository,
22
+ final ResourceNotifications notifications<% unless options[:skip_modified_by] -%>,
23
+ final UserFactory userFactory<% end -%>) {
24
+ super(repository, notifications);
25
+ <% unless options[:skip_modified_by] -%>
26
+ this.userFactory = userFactory;
27
+ <% end -%>
28
+ }
29
+
30
+ @Override
31
+ public String keyName() {
32
+ return "id";
33
+ }
34
+
35
+ @Override
36
+ public <%= class_name %> newResource() {
37
+ return new <%= class_name %>(this.repository, this<% unless options[:skip_modified_by] -%>, this.userFactory<% end -%>);
38
+ }
39
+
40
+ @Override
41
+ public String storageName() {
42
+ return "<%= singular_name %>";
43
+ }
44
+
45
+ @Override
46
+ public String defaultSearchParameterName() {
47
+ return null;
48
+ }
49
+
50
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ *
3
+ */
4
+ package <%= package %>.views.<%= plural_name %>;
5
+
6
+ import <%= package %>.models.<%= class_name %>;
7
+ import <%= package %>.models.<%= class_name %>Factory;
8
+
9
+ import de.saumya.gwt.persistence.client.ResourceNotifications;
10
+ import de.saumya.gwt.session.client.Session;
11
+ import de.saumya.gwt.translation.common.client.GetTextController;
12
+ import de.saumya.gwt.translation.common.client.widget.DefaultResourceActionPanel;
13
+ import de.saumya.gwt.translation.common.client.widget.LoadingNotice;
14
+ import de.saumya.gwt.translation.common.client.widget.ResourceBindings;
15
+ import de.saumya.gwt.translation.common.client.widget.ResourceCollectionListing;
16
+ import de.saumya.gwt.translation.common.client.widget.ResourceCollectionNavigation;
17
+ import de.saumya.gwt.translation.common.client.widget.ResourceCollectionPanel;
18
+ import de.saumya.gwt.translation.common.client.widget.ResourceHeaderPanel;
19
+ import de.saumya.gwt.translation.common.client.widget.ResourcePanel;
20
+ import de.saumya.gwt.translation.common.client.widget.ResourceScreen;
21
+
22
+ public class <%= class_name %>Screen extends ResourceScreen<<%= class_name %>> {
23
+
24
+ private static class <%= class_name %>Headers extends ResourceHeaderPanel<<%= class_name %>> {
25
+
26
+ public <%= class_name %>Headers(final GetTextController getTextController) {
27
+ super(getTextController);
28
+ }
29
+
30
+ public void reset(final <%= class_name %> resource) {
31
+ reset(resource, <% if options[:skip_timestamps] %>null<% else %>resource.updatedAt<% end -%>, <% if options[:skip_modified_by] %>null<% else %>resource.updatedBy<% end -%>);
32
+ }
33
+ }
34
+
35
+ public <%= class_name %>Screen(final LoadingNotice loadingNotice,
36
+ final GetTextController getTextController,
37
+ final <%= class_name %>Factory factory, final Session session,
38
+ final ResourceBindings<<%= class_name %>> bindings,
39
+ final ResourceNotifications notifications) {
40
+ super(loadingNotice,
41
+ factory,
42
+ session,
43
+ new ResourcePanel<<%= class_name %>>(new <%= class_name %>Headers(getTextController),
44
+ new <%= class_name %>Fields(getTextController, bindings)),
45
+ new ResourceCollectionPanel<<%= class_name %>>(loadingNotice,
46
+ new ResourceCollectionNavigation<<%= class_name %>>(loadingNotice,
47
+ factory,
48
+ getTextController),
49
+ new ResourceCollectionListing<<%= class_name %>>(session,
50
+ factory,
51
+ getTextController)),
52
+ new DefaultResourceActionPanel<<%= class_name %>>(getTextController,
53
+ bindings,
54
+ session,
55
+ factory,
56
+ notifications),
57
+ notifications);
58
+ }
59
+
60
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ *
3
+ */
4
+ package <%= package %>.models;
5
+
6
+ import de.saumya.gwt.persistence.client.Resource;
7
+ import de.saumya.gwt.persistence.client.ResourceFactory;
8
+
9
+ /**
10
+ * GWT JUnit tests must extend GWTTestCase.
11
+ */
12
+ public class <%= class_name %>TestGwt extends AbstractApplicationResourceTestGwt<<%= class_name %>> {
13
+
14
+
15
+ private <%= class_name %> resource;
16
+
17
+ private static final String RESOURCE_XML = "<<%= singular_name%>>"
18
+ + "<id>1</id>"
19
+ <% Array(attributes).each do |attribute| -%>
20
+ + "<<%= attribute.name %>><%= attribute.sample_value %></<%= attribute.name %>>"
21
+ <% end -%>
22
+ <% unless options[:skip_timestamps] -%>
23
+ + "<created_at>2009-07-09 17:14:48.0</created_at>"
24
+ + "<updated_at>2009-07-09 17:14:48.0</updated_at>"
25
+ <% end -%>
26
+ + "</<%= singular_name%>>";
27
+
28
+ @Override
29
+ protected String resourceNewXml() {
30
+ return RESOURCE_XML<% unless options[:skip_timestamps] -%>.replaceFirst("<created_at>[0-9-:. ]*</created_at>", "").replaceFirst("<updated_at>[0-9-:. ]*</updated_at>", "")<% end -%>.replace("<id>1</id>", "");
31
+ }
32
+
33
+ @Override
34
+ protected String resource1Xml() {
35
+ return RESOURCE_XML;
36
+ }
37
+
38
+ @Override
39
+ protected String resource2Xml() {
40
+ return RESOURCE_XML.replace(">1<", ">2<");
41
+ }
42
+
43
+ @Override
44
+ protected String resourcesXml() {
45
+ return "<<%= plural_name %>>" + resource1Xml() + resource2Xml() + "</<%= plural_name %>>";
46
+ }
47
+
48
+ @Override
49
+ protected ResourceFactory<<%= class_name %>> factorySetUp() {
50
+ return new <%= class_name %>Factory(this.repository,
51
+ this.notifications<% unless options[:skip_modified_by] -%>, this.userFactory<% end -%>);
52
+ }
53
+
54
+ @Override
55
+ protected Resource<<%= class_name %>> resourceSetUp() {
56
+ this.resource = this.factory.newResource();
57
+
58
+ this.resource.id = 1;
59
+ this.resource.<%= attributes.first.name.javanize %> = <% if [:date, :time, :date_time].member? attributes.first.type %>new de.saumya.gwt.persistence.client.TimestampFactory("<%= attributes.first.sample_value %>").toDate()<% else %>"<%= attributes.first.sample_value %>"<% end -%>;
60
+
61
+ this.repository.addXmlResponse(RESOURCE_XML);
62
+
63
+ this.resource.save();
64
+
65
+ return this.resource;
66
+ }
67
+
68
+ @Override
69
+ public void doTestCreate() {
70
+ assertEquals("<%= attributes.first.sample_value %>", this.resource.<%= attributes.first.name.javanize %><% if [:date, :time, :date_time].member? attributes.first.type %>.toString()<% end -%>);
71
+ }
72
+
73
+ @Override
74
+ public void doTestUpdate() {
75
+ this.resource.<%= attributes.first.name.javanize %> = <% if [:date, :time, :date_time].member? attributes.first.type %>new de.saumya.gwt.persistence.client.TimestampFactory(changedValue()).toDate()<% else %>changedValue()<% end -%>;
76
+ this.resource.save();
77
+ assertEquals(this.resource.<%= attributes.first.name.javanize %><% if [:date, :time, :date_time].member? attributes.first.type %>.toString()<% end -%>, changedValue());
78
+ }
79
+
80
+ private final static String XML = "<<%= singular_name%>>"
81
+ + "<id>1</id>"
82
+ <% Array(attributes).each do |attribute| -%>
83
+ + "<<%= attribute.name %>><%= attribute.sample_value %></<%= attribute.name %>>"
84
+ <% end -%>
85
+ <% unless options[:skip_timestamps] -%>
86
+ + "<created_at>2009-07-09 17:14:48.0</created_at>"
87
+ + "<updated_at>2007-07-09 17:14:48.0</updated_at>"
88
+ <% end -%>
89
+ + "</<%= singular_name%>>";
90
+
91
+ @Override
92
+ protected String changedValue() {
93
+ return "<%= attributes.first.sample_value(false) %>";
94
+ }
95
+
96
+ @Override
97
+ protected String keyValue() {
98
+ return "1";
99
+ }
100
+
101
+ @Override
102
+ protected String marshallingXml() {
103
+ return XML;
104
+ }
105
+
106
+ @Override
107
+ protected String value() {
108
+ return "<%= attributes.first.sample_value %>";
109
+ }
110
+ }
@@ -12,6 +12,15 @@ class <%= class_name %>
12
12
 
13
13
  <% unless options[:skip_modified_by] -%>
14
14
  modified_by "Ixtlan::Models::User"
15
+
16
+ require 'dm-serializer'
17
+ alias :to_x :to_xml_document
18
+ def to_xml_document(opts = {}, doc = nil)
19
+ unless(opts[:methods])
20
+ opts.merge!({:methods => [:updated_by], :updated_by => {:methods => [], :exclude => [:created_at, :updated_at]}})
21
+ end
22
+ to_x(opts, doc)
23
+ end
15
24
  <% end -%>
16
25
 
17
26
  end
@@ -37,7 +37,9 @@ module DataMapper
37
37
  value = __send__(meth)
38
38
  unless value.nil?
39
39
  if value.respond_to?(:to_xml_document)
40
- xml.add_xml(root, value.__send__(:to_xml_document, value.is_a?(DataMapper::Collection) ? {:collection_element_name => xml_name} : {:element_name => xml_name}))
40
+ options = value.is_a?(DataMapper::Collection) ? {:collection_element_name => xml_name} : {:element_name => xml_name}
41
+ options.merge!(opts[meth] || {})
42
+ xml.add_xml(root, value.__send__(:to_xml_document, options))
41
43
  else
42
44
  xml.add_node(root, xml_name, value.to_s)
43
45
  end
@@ -0,0 +1,18 @@
1
+ module Ixtlan
2
+ class ChildPath
3
+ def initialize(app, rootpath)
4
+ @app = app
5
+ @rootpath = rootpath
6
+ end
7
+
8
+ def call(env)
9
+ ['REQUEST_PATH','PATH_INFO','REQUEST_URI','SCRIPT_NAME'].each do |key|
10
+ if(env[key] =~ /[.]xml$/)
11
+ env[key].gsub!(/^\/#{@rootpath}/, "")
12
+ end
13
+ end
14
+ @app.call(env)
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,149 @@
1
+ module Ixtlan
2
+ module Controllers
3
+ module PhrasesController
4
+
5
+ LOCALE = Object.full_const_get(::Ixtlan::Models::LOCALE)
6
+ TEXT = Object.full_const_get(::Ixtlan::Models::TEXT)
7
+
8
+ def index
9
+ version = params[:version]
10
+
11
+ locale = if params[:locale]
12
+ LOCALE.get!(params[:locale])
13
+ else
14
+ LOCALE.default
15
+ end
16
+
17
+ phraseMap = {}
18
+ Ixtlan::Models::Word.not_approved(:locale => Locale.default).each do |word|
19
+ phraseMap[word.code] = word_to_phrase(word, :text)
20
+ end
21
+ Ixtlan::Models::Word.latest_approved(:locale => Locale.default).each do |word|
22
+ phrase = phraseMap[word.code]
23
+ if phrase
24
+ merge_word_into_phrase(word, phrase)
25
+ else
26
+ phraseMap[word.code] = word_to_phrase(word, :current_text)
27
+ end
28
+ end
29
+ phrases = ::DataMapper::Collection.new(::DataMapper::Query.new(repository, ::Ixtlan::Models::Phrase), [])
30
+ phraseMap.each { |k,v| phrases << v }
31
+ render :xml => phrases.to_xml
32
+ end
33
+
34
+
35
+ def show
36
+ word = Ixtlan::Models::Word.not_approved(:locale => Locale.default, :code => params[:id]).first
37
+ if word
38
+ phrase = word_to_phrase(word, :text)
39
+ word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
40
+ merge_word_into_phrase(word, phrase) if word
41
+ else
42
+ word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
43
+ phrase = word_to_phrase(word, :current_text)
44
+ end
45
+ render :xml => phrase.to_xml
46
+ end
47
+
48
+ def create
49
+ phrase = params[:phrase]
50
+
51
+ # load the locale and delete the locale parameter array
52
+ locale = LOCALE.get!(phrase.delete(:locale)[:code])
53
+
54
+ if(TEXT.count(:version => nil, :code => phrase[:code], :locale => locale) == 1)
55
+ logger.warn "precondition failed: " + phrase.inspect
56
+ # mimic created action by just loading it
57
+ render :xml => TEXT.first(:version => nil, :code => phrase[:code], :locale => locale).to_xml, :status => :created
58
+ return
59
+ end
60
+
61
+ phrase[:text] ||= phrase.delete(:current_text)
62
+
63
+ @text = TEXT.new(phrase)
64
+ if(TEXT.count(:code => phrase[:code], :locale => locale) == 0)
65
+ approve_it = true
66
+ end
67
+
68
+ # set the missing attributes
69
+ @text.locale = locale
70
+ @text.current_user = current_user
71
+
72
+ respond_to do |format|
73
+ success = @text.save
74
+ if success && approve_it
75
+ @text.current_user = current_user
76
+ success = @text.approve
77
+ end
78
+ if success
79
+ flash[:notice] = 'Text was successfully created.'
80
+ format.html { redirect_to(text_url(@text.id)) }
81
+ format.xml { render :xml => @text, :status => :created }
82
+ else
83
+ format.html { render :action => "new" }
84
+ format.xml { render :xml => @text.errors, :status => :unprocessable_entity }
85
+ end
86
+ end
87
+ end
88
+
89
+ def update
90
+ new_text = params[:phrase][:text]
91
+ word = Ixtlan::Models::Text.not_approved(:locale => Locale.default, :code => params[:id]).first
92
+ if word
93
+ phrase = word_to_phrase(word, :text)
94
+ word_approved = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
95
+ merge_word_into_phrase(word_approved, phrase) if word_approved
96
+ else
97
+ # take the latest approved text for the given code and create a new
98
+ # text without version (!= not_approved text) for the given code
99
+ word = Ixtlan::Models::Text.latest_approved(:locale => Locale.default, :code => params[:id]).first
100
+ phrase = word_to_phrase(word, :current_text)
101
+ word = Ixtlan::Models::Text.new(:code => params[:id], :locale => Locale.default)
102
+ end
103
+
104
+ phrase.text = new_text
105
+
106
+ word.text = new_text
107
+ word.current_user = current_user
108
+ if word.save
109
+ render :xml => phrase, :status => :ok
110
+ else
111
+ render :xml => word.errors, :status => :unprocessable_entity
112
+ end
113
+
114
+ end
115
+
116
+ def approve
117
+ word = Ixtlan::Models::Text.not_approved(:locale => Locale.default, :code => params[:id]).first
118
+ if word
119
+ word.current_user = current_user
120
+ if word.approve
121
+ word = nil
122
+ else
123
+ render :xml => word.errors, :status => :unprocessable_entity
124
+ end
125
+ end
126
+
127
+ # if there was no unapproved word or approval succeeded render
128
+ # the latest approved word
129
+ unless word
130
+ word = Ixtlan::Models::Word.latest_approved(:locale => Locale.default, :code => params[:id]).first
131
+ phrase = word_to_phrase(word, :current_text)
132
+ render :xml => phrase.to_xml, :status => :ok
133
+ end
134
+ end
135
+
136
+ private
137
+
138
+ def merge_word_into_phrase(word, phrase)
139
+ phrase.current_text = word.text
140
+ # phrase.approved_by = word.updated_by
141
+ # phrase.approved_at = word.updated_at
142
+ end
143
+
144
+ def word_to_phrase(word, text_field)
145
+ Ixtlan::Models::Phrase.new(:code => word.code, text_field => word.text, :updated_by => word.updated_by, :updated_at => word.updated_at, :locale => LOCALE.default)
146
+ end
147
+ end
148
+ end
149
+ end
@@ -27,7 +27,7 @@ module Ixtlan
27
27
 
28
28
  if(TEXT.count(:version => nil, :code => phrase[:code], :locale => locale) == 1)
29
29
  logger.warn "precondition failed: " + phrase.inspect
30
- # mimic created action
30
+ # mimic created action by just loading it
31
31
  render :xml => TEXT.first(:version => nil, :code => phrase[:code], :locale => locale).to_xml, :status => :created
32
32
  return
33
33
  end
@@ -35,13 +35,21 @@ module Ixtlan
35
35
  phrase[:text] ||= phrase.delete(:current_text)
36
36
 
37
37
  @text = TEXT.new(phrase)
38
+ if(TEXT.count(:code => phrase[:code], :locale => locale) == 0)
39
+ approve_it = true
40
+ end
38
41
 
39
42
  # set the missing attributes
40
43
  @text.locale = locale
41
44
  @text.current_user = current_user
42
45
 
43
46
  respond_to do |format|
44
- if @text.save
47
+ success = @text.save
48
+ if success && approve_it
49
+ @text.current_user = current_user
50
+ success = @text.approve
51
+ end
52
+ if success
45
53
  flash[:notice] = 'Text was successfully created.'
46
54
  format.html { redirect_to(text_url(@text.id)) }
47
55
  format.xml { render :xml => @text, :status => :created }
data/lib/ixtlan/guard.rb CHANGED
@@ -63,11 +63,27 @@ module Ixtlan
63
63
  logger.warn("guard directory #{guard_dir} not found, skip loading")
64
64
  end
65
65
  end
66
+
67
+ def self.symbolize(h)
68
+ result = {}
69
+
70
+ h.each do |k, v|
71
+ if v.is_a?(Hash)
72
+ result[k.to_sym] = symbolize_keys(v) unless v.size == 0
73
+ elsif v.is_a?(Array)
74
+ val = []
75
+ v.each {|vv| val << vv.to_sym }
76
+ result[k.to_sym] = val
77
+ end
78
+ end
79
+
80
+ result
81
+ end
66
82
 
67
83
  def self.initialize(controller, map)
68
84
  msg = map.collect{ |k,v| "\n\t#{k} => [#{v.join(',')}]"}
69
85
  @@logger.debug("#{controller} guard: #{msg}")
70
- @@map[controller] = map
86
+ @@map[controller.to_sym] = symbolize(map)
71
87
  end
72
88
 
73
89
  def self.export_xml
@@ -2,6 +2,7 @@
2
2
  require 'slf4r/logging_logger'
3
3
 
4
4
  require 'ixtlan/rolling_file'
5
+ require 'ixtlan/audit_config'
5
6
 
6
7
  module Ixtlan
7
8
  class LoggerConfig
@@ -1,6 +1,6 @@
1
1
  module Ixtlan
2
2
  module Models
3
- class Text
3
+ class I18nText
4
4
  include DataMapper::Resource
5
5
 
6
6
  def self.default_storage_name
@@ -98,14 +98,15 @@ module Ixtlan
98
98
  :locale => locale).first
99
99
  params[:version] = latest.nil? ? 1 : latest.version + 1
100
100
  params[:current] = true
101
+ # TODO approved is not need since after approval the resource is inmutable !!!
101
102
  params[:approved_at] = attribute_get(:updated_at)
102
- params[:approved_by] = params[:current_user]
103
+ params[:approved_by] = params[:current_user] || current_user
103
104
 
104
105
  p = (previous.nil? ? true : previous.update(:previous => false,
105
- :current_user => params[:current_user]))
106
+ :current_user => params[:current_user] || current_user))
106
107
  l = (latest.nil? ? true : latest.update(:current => false,
107
108
  :previous => true,
108
- :current_user => params[:current_user]))
109
+ :current_user => params[:current_user] || current_user))
109
110
  u = update(params)
110
111
 
111
112
  u && l && p
@@ -35,11 +35,11 @@ module Ixtlan
35
35
  phrases = ::DataMapper::Collection.new(::DataMapper::Query.new(self.repository, Ixtlan::Models::Phrase), [])
36
36
  map = {}
37
37
  locale = (args[:locale] ||= Locale.default)
38
- Text.not_approved(args.dup).each do |text|
38
+ I18nText.not_approved(args.dup).each do |text|
39
39
  phrase = Phrase.new(:code => text.code, :text => text.text, :current_text => text.text, :locale => locale, :updated_at => text.updated_at, :updated_by => text.updated_by)
40
40
  map[phrase.code] = phrase
41
41
  end
42
- Text.latest_approved(args.dup).each do |text|
42
+ I18nText.latest_approved(args.dup).each do |text|
43
43
  if (phrase = map[text.code])
44
44
  phrase.current_text = text.text
45
45
  else
@@ -19,10 +19,10 @@ module Ixtlan
19
19
 
20
20
  def self.map_for(args = {})
21
21
  map = {}
22
- Text.latest_approved(args.dup).each do |text|
22
+ I18nText.latest_approved(args.dup).each do |text|
23
23
  map[text.code] = Translation.create(:text => text.text, :approved_at => text.approved_at, :approved_by => text.approved_by)
24
24
  end
25
- Text.second_latest_approved(args.dup).each do |text|
25
+ I18nText.second_latest_approved(args.dup).each do |text|
26
26
  translation = map[text.code]
27
27
  translation.previous_text = text.text
28
28
  end
@@ -1,4 +1,4 @@
1
- require 'digest'
1
+ require 'digest/sha1'
2
2
  require 'base64'
3
3
  require 'ixtlan/modified_by'
4
4
  require 'dm-serializer'
@@ -1,6 +1,6 @@
1
1
  module Ixtlan
2
2
  module Models
3
- class Word < Text
3
+ class Word < Ixtlan::Models::I18nText
4
4
 
5
5
  alias :to_x :to_xml_document
6
6
  def to_xml_document(opts, doc = nil)
data/lib/ixtlan/models.rb CHANGED
@@ -8,6 +8,6 @@ module Ixtlan
8
8
  LOCALE = "::Ixtlan::Models::Locale" unless const_defined? "LOCALE"
9
9
  CONFIGURATION = "::Ixtlan::Models::Configuration" unless const_defined? "CONFIGURATION"
10
10
  TRANSLATION = "::Ixtlan::Models::Translation" unless const_defined? "TRANSLATION"
11
- TEXT = "::Ixtlan::Models::Text" unless const_defined? "TEXT"
11
+ TEXT = "::Ixtlan::Models::I18nText" unless const_defined? "TEXT"
12
12
  end
13
13
  end
@@ -1,9 +1,10 @@
1
+ require 'ixtlan/user_logger'
1
2
  module Ixtlan
2
3
  module Rails
3
4
  module ErrorHandling
4
5
 
5
6
  def log_user_error(exception)
6
- UserLogger.new(Ixtlan::Rails::ErrorHandling).log_action(self, " - #{exception.class} - #{exception.message}")
7
+ Ixtlan::UserLogger.new(Ixtlan::Rails::ErrorHandling).log_action(self, " - #{exception.class} - #{exception.message}")
7
8
  log_error(exception)
8
9
  end
9
10
 
@@ -9,7 +9,7 @@ module Rails
9
9
  AUTHENTICATION = Object.full_const_get(Ixtlan::Models::AUTHENTICATION)
10
10
 
11
11
  def authentication_logger
12
- @authentication_logger ||= UserLogger.new(Ixtlan::Rails::UnrestfulAuthentication)
12
+ @authentication_logger ||= Ixtlan::UserLogger.new(Ixtlan::Rails::UnrestfulAuthentication)
13
13
  end
14
14
 
15
15
  protected
@@ -1,3 +1,3 @@
1
1
  class Ixtlan
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '0.2.2'.freeze
3
3
  end
data/lib/models.rb CHANGED
@@ -3,12 +3,17 @@ require 'dm-timestamps'
3
3
  require 'dm-validations'
4
4
  require 'dm-serializer'
5
5
  require 'ixtlan/models'
6
+ load 'ixtlan/models/authentication.rb'
6
7
  load 'ixtlan/models/user.rb'
7
8
  load 'ixtlan/models/group_locale_user.rb'
8
9
  load 'ixtlan/models/group.rb'
9
10
  load 'ixtlan/models/group_user.rb'
10
11
  load 'ixtlan/models/locale.rb'
11
12
  load 'ixtlan/models/permission.rb'
13
+ load 'ixtlan/models/i18n_text.rb'
14
+ load 'ixtlan/models/word.rb'
15
+ load 'ixtlan/models/phrase.rb'
16
+ load 'ixtlan/models/translation.rb'
12
17
  load 'ixtlan/models/role.rb'
13
18
  load 'ixtlan/models/configuration.rb'
14
19
  load 'ixtlan/models/configuration_locale.rb'
data/spec/spec_helper.rb CHANGED
@@ -20,7 +20,7 @@ require 'ixtlan' / 'models' / 'group_user'
20
20
  require 'ixtlan' / 'models' / 'group_locale_user'
21
21
  require 'ixtlan' / 'models' / 'permission'
22
22
  require 'ixtlan' / 'models' / 'role'
23
- require 'ixtlan' / 'models' / 'text'
23
+ require 'ixtlan' / 'models' / 'i18n_text'
24
24
  require 'ixtlan' / 'passwords'
25
25
  require 'ixtlan' / 'digest'
26
26
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ixtlan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkristian
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-18 00:00:00 +05:30
12
+ date: 2010-02-03 00:00:00 +05:30
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -122,6 +122,14 @@ files:
122
122
  - generators/ixtlan_datamapper_rspec_scaffold/templates/controller_spec.rb
123
123
  - generators/ixtlan_datamapper_rspec_scaffold/templates/guard.rb
124
124
  - generators/ixtlan_datamapper_rspec_scaffold/templates/i18n.rb
125
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/gwt_ixtlan_datamapper_rspec_scaffold_generator.rb
126
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Model.java
127
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/ModelFactory.java
128
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Fields.java
129
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/Screen.java
130
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/TestGwt.java
131
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/GwtTestSuite.java
132
+ - generators/gwt_ixtlan_datamapper_rspec_scaffold/templates/AbstractApplicationResourceTestGwt.java
125
133
  - lib/models.rb
126
134
  - lib/ixtlan.rb
127
135
  - lib/dm-serializer.rb
@@ -142,11 +150,12 @@ files:
142
150
  - lib/ixtlan/models/word.rb
143
151
  - lib/ixtlan/models/configuration.rb
144
152
  - lib/ixtlan/models/authentication.rb
145
- - lib/ixtlan/models/text.rb
153
+ - lib/ixtlan/models/i18n_text.rb
146
154
  - lib/ixtlan/models/group_user.rb
147
155
  - lib/ixtlan/models/group.rb
148
156
  - lib/ixtlan/rolling_file.rb
149
157
  - lib/ixtlan/cms_script.rb
158
+ - lib/ixtlan/child_path.rb
150
159
  - lib/ixtlan/logger_config.rb
151
160
  - lib/ixtlan/models.rb
152
161
  - lib/ixtlan/audit_config.rb
@@ -158,6 +167,7 @@ files:
158
167
  - lib/ixtlan/optimistic_persistence_validation.rb
159
168
  - lib/ixtlan/error_notifier/error_notification.rhtml
160
169
  - lib/ixtlan/controllers/texts_controller.rb
170
+ - lib/ixtlan/controllers/phrases_controller.rb
161
171
  - lib/ixtlan/controllers/permissions_controller.rb
162
172
  - lib/ixtlan/controllers/authentications_controller.rb
163
173
  - lib/ixtlan/controllers/configurations_controller.rb