rang 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +195 -0
  7. data/Rakefile +1 -0
  8. data/TODO.md +43 -0
  9. data/app/controllers/rang/application_controller.rb +4 -0
  10. data/app/controllers/rang/root_controller.rb +7 -0
  11. data/config/routes.rb +3 -0
  12. data/lib/rails/generators/rang/add_root/add_root_generator.rb +12 -0
  13. data/lib/rails/generators/rang/api/configure/configure_generator.rb +70 -0
  14. data/lib/rails/generators/rang/api/configure/templates/active_model_serializer.rb +5 -0
  15. data/lib/rails/generators/rang/assets/init/init_generator.rb +52 -0
  16. data/lib/rails/generators/rang/assets/init/templates/_base.scss +11 -0
  17. data/lib/rails/generators/rang/assets/init/templates/application.js +14 -0
  18. data/lib/rails/generators/rang/assets/init/templates/application.scss +3 -0
  19. data/lib/rails/generators/rang/assets/init/templates/components.js +2 -0
  20. data/lib/rails/generators/rang/bower/add/add_generator.rb +48 -0
  21. data/lib/rails/generators/rang/bower/bower_generator.rb +28 -0
  22. data/lib/rails/generators/rang/bower/init/init_generator.rb +35 -0
  23. data/lib/rails/generators/rang/example/example_generator.rb +17 -0
  24. data/lib/rails/generators/rang/example/templates/frontend/application.js.tt +21 -0
  25. data/lib/rails/generators/rang/example/templates/frontend/application.scss +6 -0
  26. data/lib/rails/generators/rang/example/templates/frontend/components/components.js +2 -0
  27. data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.directive.js +12 -0
  28. data/lib/rails/generators/rang/example/templates/frontend/components/simple_format/simple_format.module.js +4 -0
  29. data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.js.tt +6 -0
  30. data/lib/rails/generators/rang/example/templates/frontend/posts/index.ctrl.spec.js.tt +12 -0
  31. data/lib/rails/generators/rang/example/templates/frontend/posts/index.slim.tt +14 -0
  32. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.module.js.tt +12 -0
  33. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.scss +3 -0
  34. data/lib/rails/generators/rang/example/templates/frontend/posts/posts.service.js.tt +44 -0
  35. data/lib/rails/generators/rang/example/templates/frontend/style/_base.scss +11 -0
  36. data/lib/rails/generators/rang/example/templates/frontend/style/_layout.scss +3 -0
  37. data/lib/rails/generators/rang/install/install_generator.rb +66 -0
  38. data/lib/rails/generators/rang/install/templates/rang.rb +25 -0
  39. data/lib/rails/generators/rang/teaspoon/install/install_generator.rb +75 -0
  40. data/lib/rang.rb +18 -0
  41. data/lib/rang/config.rb +12 -0
  42. data/lib/rang/engine/railtie.rb +5 -0
  43. data/lib/rang/helpers.rb +35 -0
  44. data/lib/rang/patcher.rb +50 -0
  45. data/lib/rang/util.rb +11 -0
  46. data/lib/rang/version.rb +3 -0
  47. data/rang.gemspec +29 -0
  48. data/spec/controllers/root_controller_spec.rb +12 -0
  49. data/spec/generators/add_root_spec.rb +21 -0
  50. data/spec/generators/api_configure_spec.rb +44 -0
  51. data/spec/generators/assets_init_spec.rb +91 -0
  52. data/spec/generators/bower_add_spec.rb +61 -0
  53. data/spec/generators/bower_init_spec.rb +57 -0
  54. data/spec/generators/install_spec.rb +40 -0
  55. data/spec/generators/teaspoon_install_spec.rb +123 -0
  56. data/spec/helpers_spec.rb +64 -0
  57. data/spec/patcher_spec.rb +103 -0
  58. data/spec/rails_app/.gitignore +16 -0
  59. data/spec/rails_app/Gemfile +41 -0
  60. data/spec/rails_app/README.rdoc +28 -0
  61. data/spec/rails_app/Rakefile +6 -0
  62. data/spec/rails_app/app/assets/images/.keep +0 -0
  63. data/spec/rails_app/app/assets/javascripts/application.js +16 -0
  64. data/spec/rails_app/app/assets/stylesheets/application.css +15 -0
  65. data/spec/rails_app/app/controllers/application_controller.rb +5 -0
  66. data/spec/rails_app/app/controllers/concerns/.keep +0 -0
  67. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  68. data/spec/rails_app/app/mailers/.keep +0 -0
  69. data/spec/rails_app/app/models/.keep +0 -0
  70. data/spec/rails_app/app/models/concerns/.keep +0 -0
  71. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  72. data/spec/rails_app/bin/bundle +3 -0
  73. data/spec/rails_app/bin/rails +8 -0
  74. data/spec/rails_app/bin/rake +8 -0
  75. data/spec/rails_app/bin/spring +18 -0
  76. data/spec/rails_app/config.ru +4 -0
  77. data/spec/rails_app/config/application.rb +23 -0
  78. data/spec/rails_app/config/boot.rb +4 -0
  79. data/spec/rails_app/config/database.yml +25 -0
  80. data/spec/rails_app/config/environment.rb +5 -0
  81. data/spec/rails_app/config/environments/development.rb +37 -0
  82. data/spec/rails_app/config/environments/production.rb +82 -0
  83. data/spec/rails_app/config/environments/test.rb +39 -0
  84. data/spec/rails_app/config/initializers/assets.rb +8 -0
  85. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  86. data/spec/rails_app/config/initializers/cookies_serializer.rb +3 -0
  87. data/spec/rails_app/config/initializers/filter_parameter_logging.rb +4 -0
  88. data/spec/rails_app/config/initializers/inflections.rb +16 -0
  89. data/spec/rails_app/config/initializers/mime_types.rb +4 -0
  90. data/spec/rails_app/config/initializers/session_store.rb +3 -0
  91. data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
  92. data/spec/rails_app/config/locales/en.yml +23 -0
  93. data/spec/rails_app/config/routes.rb +56 -0
  94. data/spec/rails_app/config/secrets.yml +22 -0
  95. data/spec/rails_app/db/seeds.rb +7 -0
  96. data/spec/rails_app/lib/assets/.keep +0 -0
  97. data/spec/rails_app/lib/tasks/.keep +0 -0
  98. data/spec/rails_app/log/.keep +0 -0
  99. data/spec/rails_app/public/404.html +67 -0
  100. data/spec/rails_app/public/422.html +67 -0
  101. data/spec/rails_app/public/500.html +66 -0
  102. data/spec/rails_app/public/favicon.ico +0 -0
  103. data/spec/rails_app/public/robots.txt +5 -0
  104. data/spec/rails_app/test/controllers/.keep +0 -0
  105. data/spec/rails_app/test/fixtures/.keep +0 -0
  106. data/spec/rails_app/test/helpers/.keep +0 -0
  107. data/spec/rails_app/test/integration/.keep +0 -0
  108. data/spec/rails_app/test/mailers/.keep +0 -0
  109. data/spec/rails_app/test/models/.keep +0 -0
  110. data/spec/rails_app/test/test_helper.rb +10 -0
  111. data/spec/rails_app/vendor/assets/javascripts/.keep +0 -0
  112. data/spec/rails_app/vendor/assets/stylesheets/.keep +0 -0
  113. data/spec/spec_helper.rb +79 -0
  114. data/spec/util_spec.rb +27 -0
  115. data/spec/version_spec.rb +9 -0
  116. data/vendor/assets/javascripts/angular-templates.js.erb +14 -0
  117. metadata +327 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4b5157225917f1c648bc3240a8f378ec8f0a8a1a
4
+ data.tar.gz: fc62c25421d25039674ddabb1bdb01ad9a0c2269
5
+ SHA512:
6
+ metadata.gz: fb2196731bec62126ca4ac17cc99f0afbff3e3b8b4ef3afc7b2d8c59d7e15f075f61366a5a8e58e89915da2e9304cbfbf6fc09b9e31ca344ccb4c871e5f485ee
7
+ data.tar.gz: 8ecd855626c6e2661a5cf6eccf80020ec802d345a116cabb581d49b5e2af2af5f2d674db54251eeebf0b14d0e90dc082d08ef5c43e08f9cdb81d97a6b79a35ff
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --warnings
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rails-meet-angular.gemspec
4
+ gemspec
5
+
6
+ gem 'byebug'
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Caden Lovelace
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,195 @@
1
+ # Rang
2
+
3
+ __VERY EARLY DAYS — much of this is imagined__
4
+
5
+ This is a gem that makes Rails and Angular play nicely together.
6
+
7
+ It should replace all the strange initializers and bag of angular_* gems you've
8
+ got in your Rails & Angular project.
9
+
10
+ Where existing solutions are effective and well-maintained, they are included.
11
+ Otherwise, we've included our own.
12
+
13
+ ## Installation
14
+
15
+ Add this to your Gemfile:
16
+
17
+ `gem 'rang'`
18
+
19
+ Then:
20
+
21
+ ```bash
22
+ $ bundle install
23
+ ```
24
+
25
+ ## Quickstart
26
+
27
+ ```bash
28
+ # Prompts you to run each of the generators below.
29
+ $ rails g rang:install
30
+ ```
31
+
32
+ ## Features
33
+
34
+ This gem collects quite a few things. Summary:
35
+
36
+ * Facilitates the Angular best practice structure.
37
+ * Serves and precompiles Angular templates.
38
+ * Precompiles Angular with DI annotations.
39
+ * Uses [rails-assets](http://rails-assets.org) to manage Bower dependencies.
40
+ * Gets Angular + Rails working together on CSRF protection.
41
+ * Provides an `ng-view` root route.
42
+ * Provides a generator to install and configure [Teaspoon](https://github.com/modeset/teaspoon) for Angular.
43
+ * Configures slim, if available, to ignore `{` and `}`.
44
+
45
+ ### Frontend structure
46
+
47
+ Instead of using `/assets/javascripts`, `/assets/stylesheets`, etc, this gem
48
+ supports following the best practice structure [recommended by Google](https://docs.google.com/a/cultivatehq.com/document/d/1XXMvReO8-Awi1EZXAXS4PzDzdNvV6pGcuaF4Q9821Es/pub).
49
+ [This very readable post](https://github.com/yeoman/generator-angular/issues/109)
50
+ sets out the rationale and walks through the recommended structure.
51
+
52
+ What this means in practice is that assets in `assets/frontend` are served and
53
+ compiled just like `assets/javascripts` and `assets/stylesheets` would be.
54
+
55
+ To get started:
56
+
57
+ ```bash
58
+ # This should be non-destructive, but it's your assets on the line.
59
+ $ rails g rang:assets:init
60
+ ```
61
+
62
+ This moves your existing `/app/assets` to `/app/assets.removed` and sets up a
63
+ fresh assets directory following the best practice structure.
64
+
65
+ Caveats:
66
+
67
+ * CSS might still need some special treatment.
68
+ * The structure is still under active refinement. However, this gem is flexible
69
+ enough to accept most changes.
70
+
71
+ ### Templates
72
+
73
+ In line with the structure above, Rang also compiles templates into
74
+ Angular's `$templateCache`. You should load them in your routes like this:
75
+
76
+ ```javascript
77
+ angular
78
+ .module('blog.posts', ['ngRoute'])
79
+ .config(function($routeProvider) {
80
+ $routeProvider
81
+ .when('/posts', {
82
+ templateUrl: '/assets/posts/posts.html', // Use .html, not .slim, etc
83
+ controller: 'PostsController'
84
+ });
85
+ });
86
+ ```
87
+
88
+ And then in your `application.js`, follow this structure:
89
+
90
+ ```javascript
91
+ //= require angular
92
+ //= require angular-route
93
+ //= require posts/posts
94
+ //= require angular-templates
95
+
96
+ angular.module('blog', ['blog.posts', 'ngRoute'])
97
+ .config(function($routeProvider){
98
+ $routeProvider.otherwise({
99
+ redirectTo: '/posts'
100
+ });
101
+ })
102
+ .run(AngularTemplates.load);
103
+ ```
104
+
105
+ `AngularTemplates.load` is DI'd with `$templateCache` and includes all the templates
106
+ in your directory tree.
107
+
108
+ [Slim](https://github.com/slim-template/slim-rails) is automatically supported
109
+ for assets if it's in your `Gemfile`.
110
+
111
+ ### Annotation (minification)
112
+
113
+ Rang employs [ng-annotate](https://github.com/olov/ng-annotate) (via
114
+ [ngannotiate-rails](https://github.com/kikonen/ngannotate-rails)) to make sure
115
+ your Angular code is minified properly.
116
+
117
+ ### Bower dependencies
118
+
119
+ Rang uses [rails-assets.org](http://rails-assets.org/) to include
120
+ bower packages. While a little slow sometimes, it's still a better solution than
121
+ requiring npm and bower / having a load of useless stuff in source control. For now.
122
+
123
+ It manages the rails-assets dependencies in an auxilliary gemfile called
124
+ `Gemfile.bower`. This can be created and managed with generators.
125
+
126
+ Usage:
127
+
128
+ ```bash
129
+ # Not strictly necessary, but take a look at what it generates.
130
+ $ rails g rang:bower:init
131
+
132
+ # Adds angular-cookies gem to Gemfile.bower.
133
+ $ rails g rang:bower:add angular-cookies '~ 1.2.0'
134
+
135
+ # As above, but runs bundler after.
136
+ $ rails g rang:bower:add angular@ '~ 1.2.0'
137
+ ```
138
+
139
+ ### Teaspoon
140
+
141
+ ```bash
142
+ $ rails g rang:teaspoon:install
143
+ ```
144
+
145
+ This does the following:
146
+
147
+ * Adds `teaspoon` & `phantomjs` to your Gemfile.
148
+ * Runs the normal `teaspoon:install` generator.
149
+ * Adds `angular-mocks` to your `Gemfile.bower` and includes it in `spec_helper.js`.
150
+ * Preconfigures Teaspoon to fix some issues ([#120](https://github.com/modeset/teaspoon/issues/120), [#197](https://github.com/modeset/teaspoon/issues/197)).
151
+ * Configures Teaspoon to enable putting specs alongside your code (optional).
152
+
153
+ ### API Configuration
154
+
155
+ ```bash
156
+ $ rails g rang:api:configure
157
+ ```
158
+
159
+ This does the following:
160
+
161
+ * Installs and confgures [active_model_serializers](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
162
+ to serve Angular-appropriate JSON out of the box.
163
+ * Installs and requires [angular-restmod](https://github.com/platanus/angular-restmod),
164
+ a Rails-inspired ORM for Angular.
165
+ * Sets up an `api/` route and controller scope for your API controllers.
166
+
167
+ ### CSRF
168
+
169
+ Rang uses [angular_rails_csrf](https://github.com/jsanders/angular_rails_csrf)
170
+ to join up Rails + Angular's CSRF protection.
171
+
172
+ So you don't need to feel bad turning it off anymore!
173
+
174
+ ### Root route
175
+
176
+ To avoid having a controller just to serve 'ng-view' there's a convenience
177
+ action for you to wire your root to.
178
+
179
+ ```bash
180
+ $ rails g rang:add_root
181
+ ```
182
+
183
+ Adds this to `config/routes.rb`:
184
+
185
+ ```ruby
186
+ mount Rang::Engine => "/"
187
+ ```
188
+
189
+ ## Contributing
190
+
191
+ 1. Fork it ( https://github.com/[my-github-username]/rails-meet-angular/fork )
192
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
193
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
194
+ 4. Push to the branch (`git push origin my-new-feature`)
195
+ 5. Create a new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/TODO.md ADDED
@@ -0,0 +1,43 @@
1
+ ## Angular-rails Gem
2
+
3
+ ### Requirements
4
+
5
+ #### Examples
6
+
7
+ #### Other
8
+ * Breakout bundle!
9
+
10
+
11
+ ### Done
12
+ * ~~Docs for teaspoon installer.~~
13
+ * ~~Convenience root route to ng-view.~~
14
+ * ~~Consider where to put Gemfile.bower include.~~
15
+ * ~~Refactor bower:init generator to use bower:add~~
16
+ * ~~Support inline JS tests.~~
17
+ * ~~Neaten up generator when executed multiple times.~~
18
+ * ~~CSRF protection with [angular_rails_csrf](https://github.com/jsanders/angular_rails_csrf)~~
19
+ * ~~Get Asset precompilation working.~~
20
+ * ~~Check if asset precompilation is working.~~
21
+ * ~~Minification using ng-min/ng-annotate~~
22
+ * ~~Support modern structure for AngularJS assets.~~
23
+ * ~~Bower stuff thru [rails-assets](https://rails-assets.org/).~~
24
+ * ~~Rename it to something shorter.~~
25
+ * ~~Stop templates precompiling individually.~~
26
+ * ~~Add initializer for:~~
27
+ * ~~Disabling-disabling precompilation of htm files.~~
28
+ * ~~That one weird trick that sprockets developers don't want you to know!~~
29
+ * ~~Document weird trick.~~
30
+ * ~~Support for angular templates using ERB, Slim~~.
31
+ * ~~Add optional ng-app adjustments.~~
32
+ * ~~__??__ Provide structure for Angular JS assets thru generators.~~
33
+ * ~~Scope API routes~~
34
+ * ~~Smooth out API calls between Rails + Angular~~
35
+ - ~~[Angular restmod](https://github.com/platanus/angular-restmod)~~
36
+ - ~~Active model serializers?~~
37
+ * ~~Check if we can find out whether we're precompiling and stop injecting templates
38
+ in 'development' env.~~
39
+ * ~~Change docs/defaults for template precompilation.~~
40
+ * ~~Add minimal example/starter data.~~
41
+ * ~~Make assets.removed more obvious.~~
42
+ * ~~Add test example.~~
43
+ * ~~Add FDL for wikipedia content.~~
@@ -0,0 +1,4 @@
1
+ module Rang
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Rang
2
+ class RootController < ApplicationController
3
+ def display
4
+ render text: '<div ng-view></div>', layout: 'application'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ Rang::Engine.routes.draw do
2
+ get '/' => 'root#display'
3
+ end
@@ -0,0 +1,12 @@
1
+ module Rang
2
+ module Generators
3
+ class AddRootGenerator < Rails::Generators::Base
4
+ desc "Adds a root route that is just ng-view."
5
+
6
+ def add_route
7
+ route "mount Rang::Engine => \"/\"\n"
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,70 @@
1
+ module Rang
2
+ module Api
3
+ module Generators
4
+ class ConfigureGenerator < Rails::Generators::Base
5
+ desc "Configures a sensible default API interface using active_model_serializers and angular-restmod."
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ def add_angular_restmod_to_gemfile
9
+ generate "rang:bower:add", "angular-restmod '~> 0.16' quiet"
10
+ end
11
+
12
+ def add_active_model_serializers_to_gemfile
13
+ gem "active_model_serializers", "~> 0.9.0"
14
+ end
15
+
16
+ def bundle_install
17
+ bundle!
18
+ end
19
+
20
+ def add_ams_initializer
21
+ template "active_model_serializer.rb", "config/initializers/active_model_serializer.rb"
22
+ end
23
+
24
+ def add_route_api_scope
25
+ route "scope 'api(/:version)', :module => :api, :version => /v\d+?/, :defaults => {format: :json} do\n # API routes go here\n end\n"
26
+ end
27
+
28
+ def add_controller_api_namespace
29
+ empty_directory "app/controllers/api"
30
+ end
31
+
32
+ def add_example_serializer
33
+ generate "serializer", "example title:string body:string"
34
+ end
35
+
36
+ def add_to_application_js
37
+ application_js_path = Rails.application.assets.find_asset("application.js").pathname.to_s
38
+
39
+ if !no? "\n\nAdd angular-restmod to application.js? [Yn]", :cyan
40
+ inject_into_file application_js_path, after: /^\/\/= require angular$/ do
41
+ "\n//= require angular-restmod/angular-restmod-bundle"
42
+ end
43
+ end
44
+ rescue
45
+ say "Application.js not found, not adding require for angular-restmod.", :red
46
+ end
47
+
48
+ def inform_of_actions
49
+ say "\n\n ****** \n\n"
50
+ say "\nAPI Configured, using:\n\n", :green
51
+ say "## Active_model_serializers", :bold
52
+ say "An example serializer has been written in app/serializers/example_serializer.rb", :cyan
53
+ say "You can (and should) read the full docs here: https://github.com/rails-api/active_model_serializers/tree/0-9-stable\n\n", :cyan
54
+ say "## Angular-restmod", :bold
55
+ say "A Rails-inspired ORM for Angular.", :cyan
56
+ say "Full docs here: https://github.com/platanus/angular-restmod", :cyan
57
+ say "You will need to include 'restmod' in the angular.module calls where you want to use it.\n\n", :cyan
58
+ end
59
+
60
+ private
61
+
62
+ def bundle!
63
+ Bundler.with_clean_env do
64
+ run "bundle install"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ # Disable for all serializers (except ArraySerializer)
2
+ ActiveModel::Serializer.root = false
3
+
4
+ # Disable for ArraySerializer
5
+ ActiveModel::ArraySerializer.root = false
@@ -0,0 +1,52 @@
1
+ module Rang
2
+ module Assets
3
+ module Generators
4
+ class InitGenerator < Rails::Generators::Base
5
+ desc "Sets up assets for recommended Angular structure."
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ def deprecate_old_assets!
9
+ empty_directory 'app/assets.removed'
10
+
11
+ ["javascripts", "stylesheets"].each do |dir|
12
+ if File.exist? "app/assets/#{dir}"
13
+ say_status :move, "app/assets/#{dir} -> app/assets.removed/#{dir}"
14
+ run "mv app/assets/#{dir} app/assets.removed/#{dir}", verbose: false
15
+ end
16
+ remove_dir "app/assets/#{dir}"
17
+ end
18
+ end
19
+
20
+ def create_assets!
21
+ template 'application.js', 'app/assets/frontend/application.js'
22
+ template 'application.scss', 'app/assets/frontend/application.scss'
23
+ template '_base.scss', 'app/assets/frontend/style/_base.scss'
24
+ template 'components.js', 'app/assets/frontend/components/components.js'
25
+ end
26
+
27
+ def add_html_attribute
28
+ if !no? "\n\nAdd ng-app='#{Rang::Util.application_name}' to application.html? [Yn]", :cyan
29
+ in_root do
30
+ if layout_handler == "ActionView::Template::Handlers::ERB"
31
+ gsub_file layout_file, "<html>", "<html ng-app='#{Rang::Util.application_name}'>"
32
+ elsif layout_handler == "Slim::RailsTemplate"
33
+ gsub_file layout_file, /^html$/, "html ng-app='#{Rang::Util.application_name}'"
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def layout_file
42
+ ::ApplicationController.new.send(:_layout).identifier
43
+ end
44
+
45
+ def layout_handler
46
+ ::ApplicationController.new.send(:_layout).handler.class.to_s
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end