Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions lib/generators/bad_news.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Newsletter
module Generators
class BadNews < Base
def header_content
'BAD'
end

def body_content
'NEWS'
end
end
end
end
19 changes: 8 additions & 11 deletions lib/generators/base.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
module Newsletter
module Generators
class Base
def render
<<~HTMLORMARKDOWN
#{header}

#{body}
HTMLORMARKDOWN
end
attr_reader :strategy

def header
raise NotImplementedError
def initialize(strategy:)
@strategy = strategy
end

def body
raise NotImplementedError
def render
Newsletter::Strategies
.const_get(strategy)
.new(self)
.execute
end
end
end
Expand Down
13 changes: 13 additions & 0 deletions lib/generators/good_news.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Newsletter
module Generators
class GoodNews < Base
def header_content
'GOOD'
end

def body_content
'NEWS'
end
end
end
end
13 changes: 0 additions & 13 deletions lib/generators/html.rb

This file was deleted.

13 changes: 0 additions & 13 deletions lib/generators/markdown.rb

This file was deleted.

23 changes: 23 additions & 0 deletions lib/strategies/html.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require 'forwardable'

module Newsletter
module Strategies
class Html
extend Forwardable

def_delegators :@context, :header_content, :body_content

def initialize(context)
@context = context
end

def execute
<<~HTMLORMARKDOWN
<h1>#{header_content}</h1>

<p>#{body_content}</p>
HTMLORMARKDOWN
end
end
end
end
25 changes: 25 additions & 0 deletions lib/strategies/markdown.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
require 'forwardable'

module Newsletter
module Strategies
class Markdown
extend Forwardable

def_delegators :@context, :header_content, :body_content

def initialize(context)
@context = context
end

def execute
<<~HTMLORMARKDOWN
**********
# #{header_content}
**********
#{body_content}
**********
HTMLORMARKDOWN
end
end
end
end
64 changes: 43 additions & 21 deletions spec/anything_spec.rb
Original file line number Diff line number Diff line change
@@ -1,39 +1,61 @@
require 'spec_hepler'
require_relative '../lib/strategies/markdown'
require_relative '../lib/strategies/html'
require_relative '../lib/generators/base'
require_relative '../lib/generators/html'
require_relative '../lib/generators/markdown'
require_relative '../lib/generators/good_news'
require_relative '../lib/generators/bad_news'

module Newsletter
describe Generators::Base do
context 'when HTML' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/newsletter.html', File.dirname(__FILE__))
)
context 'when news are good' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/good_news.html', File.dirname(__FILE__))
)
end

it 'generates HTML' do
expect(Generators::GoodNews.new(strategy: :Html).render).to include(newsletter)
end
end

it 'generates HTML' do
expect(Generators::Html.new.render).to include(newsletter)
context 'when news are bad' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/bad_news.html', File.dirname(__FILE__))
)
end

it 'generates HTML' do
expect(Generators::BadNews.new(strategy: :Html).render).to include(newsletter)
end
end
end

context 'when markdown' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/newsletter.markdown', File.dirname(__FILE__))
)
end
context 'when news are good' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/good_news.markdown', File.dirname(__FILE__))
)
end

it 'generates markdown' do
expect(Newsletter::Generators::Markdown.new.render).to include(newsletter)
it 'generates markdown' do
expect(Generators::GoodNews.new(strategy: :Markdown).render).to include(newsletter)
end
end
end

context 'when we calling the base class' do
it 'Template method requires base class to ba abstract!!!' do
expect{ Generators::Base.new.render }.to raise_error(NotImplementedError)
expect{ Generators::Base.new.header }.to raise_error(NotImplementedError)
expect{ Generators::Base.new.body }.to raise_error(NotImplementedError)
context 'when news are bad' do
let(:newsletter) do
File.read(
File.expand_path('fixtures/bad_news.markdown', File.dirname(__FILE__))
)
end

it 'generates markdown' do
expect(Generators::BadNews.new(strategy: :Markdown).render).to include(newsletter)
end
end
end
end
Expand Down
3 changes: 3 additions & 0 deletions spec/fixtures/bad_news.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<h1>BAD</h1>

<p>NEWS</p>
5 changes: 5 additions & 0 deletions spec/fixtures/bad_news.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
**********
# BAD
**********
NEWS
**********
3 changes: 3 additions & 0 deletions spec/fixtures/good_news.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<h1>GOOD</h1>

<p>NEWS</p>
5 changes: 5 additions & 0 deletions spec/fixtures/good_news.markdown
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
**********
# GOOD
**********
NEWS
**********
3 changes: 0 additions & 3 deletions spec/fixtures/newsletter.html

This file was deleted.

3 changes: 0 additions & 3 deletions spec/fixtures/newsletter.markdown

This file was deleted.