diff --git a/README.md b/README.md index 66d37e5..62e125b 100644 --- a/README.md +++ b/README.md @@ -297,6 +297,21 @@ You can add optional interpolation modifiers using the `%{variable:modifiers}` s - `h`: humanize (for instance, `user_name` becomes `User name`) - `p`: format phone (for instance, `48111222333` becomes `+48 111 222 333`) +### URL Defaults + +Textris uses `ActionController::Renderer` behind the scenes. Add or modify `config/initializers/application_controller_renderer.rb` in your Rails to change the default settings: + +``` +# Be sure to restart your server when you modify this file. + +ActiveSupport::Reloader.to_prepare do + ApplicationController.renderer.defaults.merge!( + http_host: ENV['CANONICAL_HOST'], # or ActionMailer::Base.default_url_options[:host] to use the same host as ActionMailer + https: Rails.env.production? + ) +end +``` + ## Example project [Here](https://github.com/visualitypl/textris/tree/master/example/rails-4.2) you can find a simple example project that demonstrates **textris** usage with Rails 4.2. In order to see how it works or experiment with it, just go to project's directory and invoke: diff --git a/lib/textris/base.rb b/lib/textris/base.rb index 92c0070..6ef3dec 100644 --- a/lib/textris/base.rb +++ b/lib/textris/base.rb @@ -1,16 +1,5 @@ -require 'render_anywhere' - module Textris class Base - class RenderingController < RenderAnywhere::RenderingController - layout false - - def default_url_options - ActionMailer::Base.default_url_options || {} - end - end - - include RenderAnywhere extend Textris::Delay::Sidekiq class << self @@ -53,9 +42,15 @@ def call_action end def render_content - set_instance_variables_for_rendering - - render(:template => template_name, :formats => ['text'], :locale => @locale) + renderer = ActionController::Base.renderer.new + + renderer.render( + template: template_name, + layout: false, + formats: [:text], + locale: @locale, + assigns: set_instance_variables_for_rendering + ) end protected @@ -84,9 +79,9 @@ def template_name end def set_instance_variables_for_rendering - instance_variables.each do |var| - set_instance_variable(var.to_s.sub('@', ''), instance_variable_get(var)) - end + instance_variables.map do |var| + [var.to_s.sub('@', ''), instance_variable_get(var)] + end.to_h end end end diff --git a/lib/textris/delivery/mail.rb b/lib/textris/delivery/mail.rb index 6c71255..1779002 100644 --- a/lib/textris/delivery/mail.rb +++ b/lib/textris/delivery/mail.rb @@ -79,7 +79,11 @@ def get_template_interpolation(key, variables) def get_rails_variable(var) case var when 'app' - Rails.application.class.parent_name + if Rails.application.class.respond_to?(:module_parent_name) + Rails.application.class.module_parent_name + else + Rails.application.class.parent_name + end when 'env' Rails.env end diff --git a/lib/textris/delivery/twilio.rb b/lib/textris/delivery/twilio.rb index c51e0b8..172ad91 100644 --- a/lib/textris/delivery/twilio.rb +++ b/lib/textris/delivery/twilio.rb @@ -17,7 +17,7 @@ def deliver(to) options[:media_url] = message.media_urls end - client.messages.create(options) + client.messages.create(**options) end private diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b3d6efe..5a72840 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,6 +5,7 @@ require "sidekiq/testing" require 'textris/delay/active_job/missing' require 'textris/delay/sidekiq/missing' +require 'active_support/testing/time_helpers' CodeClimate::TestReporter.configuration.logger = Logger.new("/dev/null") @@ -32,6 +33,8 @@ require_relative '../lib/textris' RSpec.configure do |config| + config.include ActiveSupport::Testing::TimeHelpers + config.expect_with :rspec do |expectations| expectations.include_chain_clauses_in_custom_matcher_descriptions = true end diff --git a/spec/textris/base_spec.rb b/spec/textris/base_spec.rb index 651591b..3580200 100644 --- a/spec/textris/base_spec.rb +++ b/spec/textris/base_spec.rb @@ -116,7 +116,7 @@ def set_instance_variable(key, value) it 'defers template rendering when :body not provided' do render_options = {} - expect_any_instance_of(MyTexter).not_to receive(:render) + expect_any_instance_of(MyTexter).not_to receive(:render_content) MyTexter.action_with_template end @@ -151,25 +151,4 @@ def my_action(p) expect(MyTexter.respond_to?(:fake_action)).to eq false end end - - describe Textris::Base::RenderingController do - before do - class Textris::Base::RenderingController - def initialize(*args) - end - end - - class ActionMailer::Base - def self.default_url_options - 'x' - end - end - end - - it 'maps default_url_options to ActionMailer configuration' do - rendering_controller = Textris::Base::RenderingController.new - - expect(rendering_controller.default_url_options).to eq 'x' - end - end end diff --git a/spec/textris/delay/sidekiq_spec.rb b/spec/textris/delay/sidekiq_spec.rb index ab454ac..6cc8dc3 100644 --- a/spec/textris/delay/sidekiq_spec.rb +++ b/spec/textris/delay/sidekiq_spec.rb @@ -154,18 +154,20 @@ class XRelation < ActiveRecord::Relation; end describe '#delay_until' do it 'schedules action with proper params and execution time' do - MyTexter.delay_until(Time.new(2020, 1, 1)).delayed_action( - '48111222333', 'Hi') + travel_to(Date.new(2019,1,1)) do + MyTexter.delay_until(Time.new(2020, 1, 1)).delayed_action( + '48111222333', 'Hi') - expect_any_instance_of(MyTexter).to receive(:text).with( - :to => "48111222333", :body => "Hi").and_call_original - expect_any_instance_of(Textris::Message).to receive(:deliver) + expect_any_instance_of(MyTexter).to receive(:text).with( + :to => "48111222333", :body => "Hi").and_call_original + expect_any_instance_of(Textris::Message).to receive(:deliver) - scheduled_at = Time.at(Textris::Delay::Sidekiq::Worker.jobs.last['at']) + scheduled_at = Time.at(Textris::Delay::Sidekiq::Worker.jobs.last['at']) - expect(scheduled_at).to eq Time.new(2020, 1, 1) + expect(scheduled_at).to eq Time.new(2020, 1, 1) - Textris::Delay::Sidekiq::Worker.drain + Textris::Delay::Sidekiq::Worker.drain + end end it 'raises with wrong timestamp' do diff --git a/spec/textris/message_spec.rb b/spec/textris/message_spec.rb index b44ef1a..4ea86d1 100644 --- a/spec/textris/message_spec.rb +++ b/spec/textris/message_spec.rb @@ -186,11 +186,6 @@ class SomeSampleTexter; end describe '#content' do before do - class Textris::Base::RenderingController - def initialize(*args) - end - end - class RenderingTexter < Textris::Base def action_with_template text :to => '48 600 700 800' diff --git a/textris.gemspec b/textris.gemspec index ab8d4f3..3dbf371 100644 --- a/textris.gemspec +++ b/textris.gemspec @@ -16,14 +16,14 @@ Gem::Specification.new do |spec| spec.description = "Implement texter classes for sending SMS messages in similar way to how e-mails are sent with ActionMailer-based mailers. Take advantage of e-mail proxying and enhanced phone number parsing, among others." spec.files = Dir["lib/**/*.rb"] - spec.has_rdoc = false spec.extra_rdoc_files = ["README.md"] spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] - spec.add_development_dependency 'bundler', '~> 1.6' + spec.add_development_dependency "rails", ">= 4.2" + spec.add_development_dependency 'bundler', '~> 2.0' spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4' - spec.add_development_dependency 'rake', '~> 10.0' + spec.add_development_dependency 'rake', '~> 12' spec.add_development_dependency 'rspec', '~> 3.1' spec.add_development_dependency 'rspec-sidekiq', '~> 2.0' spec.add_development_dependency 'scrutinizer-ocular', '~> 1.0' @@ -37,5 +37,5 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency 'activesupport', '>= 4.2' spec.add_runtime_dependency 'phony', '~> 2.8' spec.add_runtime_dependency 'render_anywhere', '~> 0.0' - spec.add_runtime_dependency 'nokogiri', '~> 1.10.4' + spec.add_runtime_dependency 'nokogiri', '>= 1.10.4' end