lti_template_builder 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 114b7c3effaf50ca1f87c8f47a40c320a07e03dd
4
+ data.tar.gz: 4ff676cee26f2c9dda9c2e764a03469b91f92bb1
5
+ SHA512:
6
+ metadata.gz: 74257ed2c94edea6770a58533e97ba28aaba92959fe35f93a80777adbcb9854a2843891185897b39b36800d875c4f473b8fd6aab985b244f4a9efe05abbca2df
7
+ data.tar.gz: 79d95cd1355e711557efb0ad4a650a5a2ca4c5f27933074db6f7e1aa1290fa61b900cc45017bd4dbf7efb39b16ea0098736269a7c3e12c32a30a56bd59fa1fe8
@@ -0,0 +1,17 @@
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
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.0.0"
4
+ - "2.1.0"
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in lti_template_builder.gemspec
4
+ gemspec
5
+
6
+ gem 'jazz_hands', group: [:development, :test]
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Instructure
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,55 @@
1
+ # LTI Template Builder
2
+
3
+ [![Build Status](https://travis-ci.org/instructure/lti_template_builder.png?branch=master)](https://travis-ci.org/instructure/lti_template_builder)
4
+ [![Code Climate](https://codeclimate.com/github/instructure/lti_template_builder.png)](https://codeclimate.com/github/instructure/lti_template_builder)
5
+ [![Gem Version](https://badge.fury.io/rb/lti_template_builder.png)](http://badge.fury.io/rb/lti_template_builder)
6
+
7
+ Template generator for building LTI apps quickly on top of Rails
8
+ mountable engines.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'lti_template_builder'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install lti_template_builder
23
+
24
+ ## Usage
25
+
26
+ To build a Rails template, you need to instanciate the builder and then
27
+ add recipes to it.
28
+
29
+ Example:
30
+
31
+ ```ruby
32
+ require 'lti_template_builder'
33
+ builder = LtiTemplateBuilder::Builder.new
34
+
35
+ # Add recipes
36
+ builder.add :bootstrap_sass
37
+ builder.add :cors_support
38
+ builder.add :rspec
39
+ builder.add :lti_extension, { enabled_extensions: [:editor_button, :resource_selection] }
40
+ builder.add :extra
41
+
42
+ # Print out the generated template.rb
43
+ puts builder.to_script
44
+
45
+ # Write builder to file
46
+ builder.save_to_file("path/to/template.rb")
47
+ ```
48
+
49
+ ## Contributing
50
+
51
+ 1. Fork it ( http://github.com/<my-github-username>/lti_template_builder/fork )
52
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
53
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
54
+ 4. Push to the branch (`git push origin my-new-feature`)
55
+ 5. Create new Pull Request
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,2 @@
1
+ require './web/server'
2
+ run Server
@@ -0,0 +1,13 @@
1
+ require "active_support/inflector"
2
+
3
+ require "lti_template_builder/builder"
4
+ require "lti_template_builder/recipe"
5
+
6
+ project_root = File.dirname(File.absolute_path(__FILE__))
7
+ Dir.glob(project_root + '/lti_template_builder/recipes/**/*.rb') {|file| require file}
8
+
9
+ require "lti_template_builder/version"
10
+
11
+ module LtiTemplateBuilder
12
+ # Your code goes here...
13
+ end
@@ -0,0 +1,51 @@
1
+ module LtiTemplateBuilder
2
+ class Builder
3
+ attr_accessor :recipes, :gem_dependencies, :gem_dev_dependencies, :after_bundle_commands
4
+
5
+ def initialize
6
+ @gem_dependencies = []
7
+ @gem_dev_dependencies = []
8
+ @after_bundle_commands = []
9
+ @recipes = []
10
+ end
11
+
12
+ def add_gem_recipe
13
+ recipe = LtiTemplateBuilder::Gems.new
14
+ recipe.setup({
15
+ gem_dependencies: @gem_dependencies.uniq,
16
+ gem_dev_dependencies: @gem_dev_dependencies.uniq,
17
+ after_bundle_commands: @after_bundle_commands.uniq
18
+ })
19
+ @recipes.unshift({ name: :gems, recipe: recipe.render })
20
+ end
21
+
22
+ def add(name, args={})
23
+ klass_name = "LtiTemplateBuilder::#{name.to_s.classify}"
24
+ recipe_klass = klass_name.constantize
25
+ recipe = recipe_klass.new
26
+ recipe.setup(args)
27
+ recipe.gem_dependencies.each { |dep| @gem_dependencies << dep }
28
+ recipe.gem_dev_dependencies.each { |dep| @gem_dev_dependencies << dep }
29
+ recipe.after_bundle_commands.each { |cmd| @after_bundle_commands << cmd }
30
+ @recipes << { name: name.to_sym, recipe: recipe.render }
31
+ end
32
+
33
+ def to_script
34
+ add_gem_recipe
35
+ ret = []
36
+ @recipes.each do |item|
37
+ ret << "\n# ---------------------------- Recipe: #{item[:name]} ---------------------------\n\n"
38
+ ret << item[:recipe]
39
+ end
40
+ ret.join("\n\n")
41
+ end
42
+
43
+ def render_to_screen
44
+ puts self.to_script
45
+ end
46
+
47
+ def save_to_file(path)
48
+ File.open(path, "w") { |file| file.write(self.to_script) }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,36 @@
1
+ require 'erb'
2
+
3
+ module LtiTemplateBuilder
4
+ class Recipe
5
+ attr_accessor :gem_dependencies, :gem_dev_dependencies, :after_bundle_commands
6
+
7
+ def initialize
8
+ @gem_dependencies = []
9
+ @gem_dev_dependencies = []
10
+ @after_bundle_commands = []
11
+ end
12
+
13
+ def setup(args={})
14
+ raise "Please override this method!!!"
15
+ end
16
+
17
+ def template(template_name)
18
+ erb = ERB.new(File.read(File.expand_path("../recipes/#{recipe_name}/#{template_name}.erb", __FILE__)))
19
+ erb.result(self.instance_eval { binding })
20
+ end
21
+
22
+ def render
23
+ puts "CLASS: #{self.class.name}"
24
+ erb = ERB.new(File.read(File.expand_path("../recipes/#{recipe_name}/template.erb", __FILE__)))
25
+ erb.result(self.instance_eval { binding })
26
+ end
27
+
28
+ protected
29
+
30
+ def recipe_name
31
+ class_name = self.class.name
32
+ class_name.split("::").last.underscore
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,8 @@
1
+ module LtiTemplateBuilder
2
+ class BootstrapSass < Recipe
3
+ def setup(args={})
4
+ @gem_dependencies << ["sass-rails", ">= 3.2"]
5
+ @gem_dependencies << ["bootstrap-sass", "~> 3.1.0"]
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # TODO: This should be done differently!!!!
2
+
3
+ remove_file "app/assets/stylesheets/#{name}/application.css"
4
+ create_file "app/assets/stylesheets/#{name}/application.scss" do <<-'RUBY'
5
+ @import "bootstrap";
6
+ RUBY
7
+ end
8
+
9
+ inject_into_file "lib/#{name}.rb", before: "module" do <<-'RUBY'
10
+ require "bootstrap-sass"
11
+
12
+ RUBY
13
+ end
@@ -0,0 +1,6 @@
1
+ module LtiTemplateBuilder
2
+ class CorsSupport < Recipe
3
+ def setup(args={})
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,32 @@
1
+ inject_into_file "app/controllers/#{name}/application_controller.rb", after: "ActionController::Base\n" do <<-'RUBY'
2
+ before_action :set_default_headers
3
+ before_filter :cors_preflight_check
4
+ after_filter :cors_set_access_control_headers
5
+
6
+ def set_default_headers
7
+ response.headers['X-Frame-Options'] = 'ALLOWALL'
8
+ end
9
+
10
+ # For all responses in this controller, return the CORS access control headers.
11
+ def cors_set_access_control_headers
12
+ headers['Access-Control-Allow-Origin'] = '*'
13
+ headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
14
+ headers['Access-Control-Request-Method'] = '*'
15
+ headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
16
+ headers['Access-Control-Max-Age'] = "1728000"
17
+ end
18
+
19
+ # If this is a preflight OPTIONS request, then short-circuit the
20
+ # request, return only the necessary headers and return an empty
21
+ # text/plain.
22
+ def cors_preflight_check
23
+ if request.method == :options
24
+ headers['Access-Control-Allow-Origin'] = '*'
25
+ headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
26
+ headers['Access-Control-Allow-Headers'] = '*'
27
+ headers['Access-Control-Max-Age'] = '1728000'
28
+ render :text => '', :content_type => 'text/plain'
29
+ end
30
+ end
31
+ RUBY
32
+ end
@@ -0,0 +1,6 @@
1
+ module LtiTemplateBuilder
2
+ class Extra < Recipe
3
+ def setup(args={})
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ append_file "Rakefile" do <<-'RUBY'
2
+
3
+ desc 'Run the test dummy rails app'
4
+ task :run_engine do
5
+ exec 'cd spec/test_app && bundle exec rails s'
6
+ end
7
+ RUBY
8
+ end
9
+
10
+ gem_group :development, :test do
11
+ gem "jazz_hands"
12
+ end
@@ -0,0 +1,9 @@
1
+ module LtiTemplateBuilder
2
+ class Gems < Recipe
3
+ def setup(args={})
4
+ @gem_dependencies = args[:gem_dependencies]
5
+ @gem_dev_dependencies = args[:gem_dev_dependencies]
6
+ @after_bundle_commands = args[:after_bundle_commands]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ inject_into_file "#{name}.gemspec", after: "s.add_development_dependency \"sqlite3\"\n" do <<-'RUBY'
2
+ <% @gem_dependencies.each do |dep| %>
3
+ s.add_dependency <%= dep.map { |str| "\"#{str}\"" }.join(", ") %>
4
+ <% end %>
5
+ <% @gem_dev_dependencies.each do |dep| %>
6
+ s.add_development_dependency <%= dep.map { |str| "\"#{str}\"" }.join(", ") %>
7
+ <% end %>
8
+ RUBY
9
+ end
10
+
11
+ run "bundle install"
12
+
13
+ <% @after_bundle_commands.each do |cmd| %>
14
+ <%= cmd %>
15
+ <% end %>
@@ -0,0 +1,25 @@
1
+ module LtiTemplateBuilder
2
+ class LtiExtension < Recipe
3
+ def setup(args)
4
+ @gem_dependencies << ["ims-lti"]
5
+ @enabled_extensions = args[:enabled_extensions] || []
6
+ @after_bundle_commands << "generate 'controller lti index'"
7
+
8
+ @additional_configs = []
9
+ @additional_configs << " tc.canvas_homework_submission!(enabled: true)" if @enabled_extensions.include? :homework_submission
10
+ @additional_configs << " tc.canvas_editor_button!(enabled: true)" if @enabled_extensions.include? :editor_button
11
+ @additional_configs << " tc.canvas_resource_selection!(enabled: true)" if @enabled_extensions.include? :resource_selection
12
+ @additional_configs << " tc.canvas_account_navigation!(enabled: true)" if @enabled_extensions.include? :account_navigation
13
+ @additional_configs << " tc.canvas_course_navigation!(enabled: true)" if @enabled_extensions.include? :course_navigation
14
+ @additional_configs << " tc.canvas_user_navigation!(enabled: true)" if @enabled_extensions.include? :user_navigation
15
+
16
+ @extra_expects = ["\n"]
17
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"homework_submission\">')" if @enabled_extensions.include? :homework_submission
18
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"editor_button\">')" if @enabled_extensions.include? :editor_button
19
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"resource_selection\">')" if @enabled_extensions.include? :resource_selection
20
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"account_navigation\">')" if @enabled_extensions.include? :account_navigation
21
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"course_navigation\">')" if @enabled_extensions.include? :course_navigation
22
+ @extra_expects << " expect(response.body).to include('<lticm:options name=\"user_navigation\">')" if @enabled_extensions.include? :user_navigation
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,164 @@
1
+ inject_into_file "app/controllers/#{name}/lti_controller.rb", after: "def index\n" do <<-"RUBY"
2
+ @launch_params = params.reject!{ |k,v| ['controller','action'].include? k }
3
+ end
4
+
5
+ def embed
6
+ launch_params = JSON.parse(params[:launch_params] || "{}")
7
+
8
+ tp = IMS::LTI::ToolProvider.new(nil, nil, launch_params)
9
+ tp.extend IMS::LTI::Extensions::Content::ToolProvider
10
+
11
+ # The following code is used as an example of content being returned.
12
+ # This should be replaced by actual logic.
13
+ embed_type = params[:embed_type]
14
+ if embed_type =~ /Video/
15
+ @title = "Getting Started in Canvas Network"
16
+ @url = "//player.vimeo.com/video/79702646"
17
+ @width = "500"
18
+ @height = "284"
19
+ elsif embed_type =~ /Picture/
20
+ @title = "Laughing Dog"
21
+ @url = "https://dl.dropboxusercontent.com/u/2176587/laughing_dog.jpeg"
22
+ @width = "284"
23
+ @height = "177"
24
+ else
25
+ @title = "My Lti App"
26
+ @url = "\#{root_url}" # <-- build return URL
27
+ @width = 500 # <-- modal width (if applicable)
28
+ @height = 530 # <-- modal height (if applicable)
29
+ end
30
+
31
+ redirect_url = build_url(tp, @title, @url, @width, @height)
32
+
33
+ if redirect_url.present?
34
+ redirect_to redirect_url
35
+ end
36
+ end
37
+
38
+ def xml_config
39
+ host = "\#{request.protocol}\#{request.host_with_port}"
40
+ url = "\#{host}\#{root_path}"
41
+ title = "#{name.humanize.titleize}"
42
+ tool_id = "#{name}"
43
+ tc = IMS::LTI::ToolConfig.new(:title => title, :launch_url => url)
44
+ tc.extend IMS::LTI::Extensions::Canvas::ToolConfig
45
+ tc.description = "[description goes here]"
46
+ tc.canvas_privacy_anonymous!
47
+ tc.canvas_domain!(request.host)
48
+ tc.canvas_icon_url!("\#{host}/assets/#{name}/icon.png")
49
+ tc.canvas_text!(title)
50
+ tc.set_ext_param('canvas.instructure.com', :tool_id, tool_id)
51
+ <%= @additional_configs.join("\n") %>
52
+ render xml: tc.to_xml
53
+ end
54
+
55
+ def health_check
56
+ head 200
57
+ end
58
+
59
+ private
60
+
61
+ def build_url(tp, title, url, width, height)
62
+ if tp.accepts_content?
63
+ if tp.accepts_iframe?
64
+ redirect_url = tp.iframe_content_return_url(url, width, height, title)
65
+ elsif tp.accepts_url?
66
+ redirect_url = tp.url_content_return_url(url, title)
67
+ elsif tp.accepts_lti_launch_url?
68
+ redirect_url = tp.lti_launch_content_return_url(url, title, title)
69
+ end
70
+ return redirect_url
71
+ end
72
+ RUBY
73
+ end
74
+
75
+ route 'root "lti#index"'
76
+ route 'match "/" => "lti#index", via: [:get, :post]'
77
+ route 'get "health_check" => "lti#health_check"'
78
+ route 'get "config(.xml)" => "lti#xml_config", as: :lti_xml_config'
79
+
80
+ remove_file "app/views/#{name}/lti/index.html.erb"
81
+ create_file "app/views/#{name}/lti/index.html.erb" do <<-'RUBY'
82
+ <div class="container">
83
+ <h4 class="page-header">
84
+ <%%= link_to "config.xml", lti_xml_config_path, class: "btn btn-xs btn-primary pull-right" %>
85
+ <%%= image_tag "NAME/icon.png" %> My LTI App
86
+ </h4>
87
+
88
+ <p>
89
+ This is an example of how you can select a resource and have it be embedded via LTI.
90
+ </p>
91
+
92
+ <%%= form_tag lti_embed_path do %>
93
+ <input type="hidden" name="launch_params" value="<%%= @launch_params.to_json %>" />
94
+ <div class="row">
95
+ <div class="col-xs-6">
96
+ <input type="submit" name="embed_type" class="btn btn-large btn-info btn-block"
97
+ value="Embed a Video" />
98
+ </div>
99
+ <div class="col-xs-6">
100
+ <input type="submit" name="embed_type" class="btn btn-large btn-success btn-block"
101
+ value="Embed a Picture" />
102
+ </div>
103
+ </div>
104
+ <%% end %>
105
+ </div>
106
+ RUBY
107
+ end
108
+
109
+ gsub_file "app/views/#{name}/lti/index.html.erb", "NAME", name
110
+
111
+ create_file "app/views/#{name}/lti/embed.html.erb" do <<-'RUBY'
112
+ <div class="container">
113
+ <h4 class="page-header">Embed Code Generated</h4>
114
+ <p>
115
+ You're not in a system that supports auto-inserting content,
116
+ so you'll need to copy and past the following code by hand
117
+ in order to insert it into your content.
118
+ </p>
119
+
120
+ <textarea class="form-control" rows="4"><iframe title="<%%= @title %>" width="<%%= @width %>" height="<%%= @height %>" src="<%%= @url %>" /></textarea>
121
+ </div>
122
+ RUBY
123
+ end
124
+
125
+ inject_into_file "app/controllers/#{name}/lti_controller.rb", after: "require_dependency \"#{name}/application_controller\"\n" do <<-"RUBY"
126
+
127
+ require "ims/lti"
128
+ RUBY
129
+ end
130
+
131
+ gsub_file "spec/controllers/#{name}/lti_controller_spec.rb", "get 'index'\n", "get 'index', use_route: :#{name}\n"
132
+
133
+ route 'post "embed" => "lti#embed", as: :lti_embed'
134
+
135
+ inject_into_file "spec/controllers/#{name}/lti_controller_spec.rb", after: "response.should be_success\n end\n" do <<-"RUBY"
136
+ describe "GET config" do
137
+ it "should generate a valid xml cartridge" do
138
+ request.stub(:env).and_return({
139
+ "SCRIPT_NAME" => "/#{name}",
140
+ "rack.url_scheme" => "http",
141
+ "HTTP_HOST" => "test.host",
142
+ "PATH_INFO" => "/#{name}"
143
+ })
144
+ get 'xml_config', use_route: :#{name}
145
+ expect(response.body).to include('<blti:title>#{name.humanize.titleize}</blti:title>')
146
+ expect(response.body).to include('<blti:description>[description goes here]</blti:description>')
147
+ expect(response.body).to include('<lticm:property name="text">#{name.humanize.titleize}</lticm:property>')
148
+ expect(response.body).to include('<lticm:property name="tool_id">#{name}</lticm:property>')
149
+ expect(response.body).to include('<lticm:property name=\"icon_url\">http://test.host/assets/#{name}/icon.png</lticm:property>')
150
+ end
151
+ end
152
+ RUBY
153
+ end
154
+
155
+ inject_into_file "spec/controllers/#{name}/lti_controller_spec.rb", after: "icon.png</lticm:property>')" do <<-"RUBY"
156
+
157
+ <%= @extra_expects.join("\n") %>
158
+ RUBY
159
+ end
160
+
161
+ inside("app/assets/images/#{name}") do
162
+ run "curl -O https://dl.dropboxusercontent.com/u/2176587/icon.png"
163
+ end
164
+
@@ -0,0 +1,7 @@
1
+ inject_into_file "lib/#{name}/engine.rb", after: "isolate_namespace #{name.classify}\n" do <<-"RUBY"
2
+
3
+ config.generators do |g|
4
+ g.test_framework :rspec
5
+ end
6
+ RUBY
7
+ end
@@ -0,0 +1,12 @@
1
+ module LtiTemplateBuilder
2
+ class Rspec < Recipe
3
+ def setup(args={})
4
+ @gem_dev_dependencies << ["rspec-rails"]
5
+ @gem_dev_dependencies << ["capybara"]
6
+ @gem_dev_dependencies << ["poltergeist"]
7
+ @after_bundle_commands << "generate 'rspec:install'"
8
+ @after_bundle_commands << template("add_rspec_to_engine_config")
9
+ @after_bundle_commands << "generate 'controller test backdoor'"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,61 @@
1
+ # append_file ".gitignore" do <<-'RUBY'
2
+ # spec/test_app/db/*.sqlite3
3
+ # spec/test_app/db/*.sqlite3-journal
4
+ # spec/test_app/log/*.log
5
+ # spec/test_app/tmp/
6
+ # spec/test_app/.sass-cache
7
+ # spec/test_app/config/lti_public_resources_config.yml
8
+ # spec/test_app/config/*.yml
9
+ # RUBY
10
+ # end
11
+
12
+ append_file "Rakefile" do <<-'RUBY'
13
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
14
+ require 'rspec/core/rake_task'
15
+ RSpec::Core::RakeTask.new(:spec)
16
+ task :default => :spec
17
+ RUBY
18
+ end
19
+
20
+ inject_into_file "lib/#{name}/engine.rb", after: "isolate_namespace #{name.classify}\n" do <<-"RUBY"
21
+
22
+ config.generators do |g|
23
+ g.test_framework :rspec
24
+ end
25
+ RUBY
26
+ end
27
+
28
+ gsub_file "spec/spec_helper.rb", "../../config/environment", "../test_app/config/environment"
29
+
30
+ inject_into_file "spec/spec_helper.rb", after: "require 'rspec/autorun'\n" do <<-"RUBY"
31
+ require 'capybara/rspec'
32
+ require 'capybara/rails'
33
+ require 'capybara/poltergeist'
34
+
35
+ Capybara.javascript_driver = :poltergeist
36
+ RUBY
37
+ end
38
+
39
+ remove_file "app/views/#{name}/test/backdoor.html.erb"
40
+ create_file "app/views/#{name}/test/backdoor.html.erb" do <<-"RUBY"
41
+ <p>Form to access root page via POST. Used for tests.</p>
42
+ <%%= form_tag root_path do %>
43
+ <button type="submit" id="submit">Submit</button>
44
+ <%% end %>
45
+ RUBY
46
+ end
47
+
48
+ gsub_file "spec/controllers/#{name}/test_controller_spec.rb", "get 'backdoor'\n", "get 'backdoor', use_route: :#{name}\n"
49
+
50
+ create_file "spec/features/#{name}/workflow_spec.rb" do <<-"RUBY"
51
+ require 'spec_helper'
52
+
53
+ describe 'Workflow', type: :request, js: true do
54
+ it 'app should be accessible via POST' do
55
+ visit '/#{name}/test/backdoor'
56
+ click_button('Submit')
57
+ expect(page).to have_content 'My LTI App'
58
+ end
59
+ end
60
+ RUBY
61
+ end
@@ -0,0 +1,3 @@
1
+ module LtiTemplateBuilder
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lti_template_builder/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "lti_template_builder"
8
+ spec.version = LtiTemplateBuilder::VERSION
9
+ spec.authors = ["Eric Berry"]
10
+ spec.email = ["cavneb@gmail.com"]
11
+ spec.summary = %q{Rails mountable engine templates for LTI development}
12
+ spec.description = %q{Rails mountable engine templates for LTI development}
13
+ spec.homepage = "https://github.com/instructure/lti_template_builder"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "activesupport", ">= 3.2.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.5"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "sinatra"
27
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ module LtiTemplateBuilder
4
+ describe Builder do
5
+ it "should build a template" do
6
+ builder = Builder.new
7
+
8
+ builder.add :cors_support
9
+ builder.add :rspec
10
+ builder.add :lti_extension, { enabled_extensions: [:editor_button, :resource_selection] }
11
+
12
+ builder.render_to_screen
13
+
14
+ builder.gem_dependencies.count.should eq(1)
15
+ builder.gem_dev_dependencies.count.should eq(3)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'lti_template_builder'
5
+
6
+ RSpec.configure do |config|
7
+ # some (optional) config here
8
+ end
@@ -0,0 +1,21 @@
1
+ require 'sinatra/base'
2
+ require File.expand_path('../../lib/lti_template_builder', __FILE__)
3
+
4
+ class Server < Sinatra::Base
5
+
6
+ get '/' do
7
+ "rails plugin new my_lti_app -T --mountable --dummy-path=spec/test_app -m http://localhost:9292/template"
8
+ end
9
+
10
+ get '/template' do
11
+ content_type :text
12
+ builder = LtiTemplateBuilder::Builder.new
13
+ builder.add :bootstrap_sass
14
+ builder.add :cors_support
15
+ builder.add :rspec
16
+ builder.add :lti_extension, { enabled_extensions: [:editor_button, :resource_selection] }
17
+ builder.add :extra
18
+ builder.to_script
19
+ end
20
+
21
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lti_template_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Eric Berry
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Rails mountable engine templates for LTI development
84
+ email:
85
+ - cavneb@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - .rspec
92
+ - .travis.yml
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - config.ru
98
+ - lib/lti_template_builder.rb
99
+ - lib/lti_template_builder/builder.rb
100
+ - lib/lti_template_builder/recipe.rb
101
+ - lib/lti_template_builder/recipes/bootstrap_sass/bootstrap_sass.rb
102
+ - lib/lti_template_builder/recipes/bootstrap_sass/template.erb
103
+ - lib/lti_template_builder/recipes/cors_support/cors_support.rb
104
+ - lib/lti_template_builder/recipes/cors_support/template.erb
105
+ - lib/lti_template_builder/recipes/extra/extra.rb
106
+ - lib/lti_template_builder/recipes/extra/template.erb
107
+ - lib/lti_template_builder/recipes/gems/gems.rb
108
+ - lib/lti_template_builder/recipes/gems/template.erb
109
+ - lib/lti_template_builder/recipes/lti_extension/lti_extension.rb
110
+ - lib/lti_template_builder/recipes/lti_extension/template.erb
111
+ - lib/lti_template_builder/recipes/rspec/add_rspec_to_engine_config.erb
112
+ - lib/lti_template_builder/recipes/rspec/rspec.rb
113
+ - lib/lti_template_builder/recipes/rspec/template.erb
114
+ - lib/lti_template_builder/version.rb
115
+ - lti_template_builder.gemspec
116
+ - spec/lib/builder_spec.rb
117
+ - spec/spec_helper.rb
118
+ - web/server.rb
119
+ homepage: https://github.com/instructure/lti_template_builder
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project:
139
+ rubygems_version: 2.2.1
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Rails mountable engine templates for LTI development
143
+ test_files:
144
+ - spec/lib/builder_spec.rb
145
+ - spec/spec_helper.rb
146
+ has_rdoc: