diff --git a/lib/generators/bad_news.rb b/lib/generators/bad_news.rb new file mode 100644 index 0000000..67f65ad --- /dev/null +++ b/lib/generators/bad_news.rb @@ -0,0 +1,13 @@ +module Newsletter + module Generators + class BadNews < Base + def header_content + 'BAD' + end + + def body_content + 'NEWS' + end + end + end +end diff --git a/lib/generators/base.rb b/lib/generators/base.rb index f59d513..dfa581a 100644 --- a/lib/generators/base.rb +++ b/lib/generators/base.rb @@ -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 diff --git a/lib/generators/good_news.rb b/lib/generators/good_news.rb new file mode 100644 index 0000000..ef1a9dd --- /dev/null +++ b/lib/generators/good_news.rb @@ -0,0 +1,13 @@ +module Newsletter + module Generators + class GoodNews < Base + def header_content + 'GOOD' + end + + def body_content + 'NEWS' + end + end + end +end diff --git a/lib/generators/html.rb b/lib/generators/html.rb deleted file mode 100644 index d052549..0000000 --- a/lib/generators/html.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Newsletter - module Generators - class Html < Base - def header - '
body
' - end - end - end -end diff --git a/lib/generators/markdown.rb b/lib/generators/markdown.rb deleted file mode 100644 index 90dc5c2..0000000 --- a/lib/generators/markdown.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Newsletter - module Generators - class Markdown < Base - def header - '# Header' - end - - def body - 'body' - end - end - end -end diff --git a/lib/strategies/html.rb b/lib/strategies/html.rb new file mode 100644 index 0000000..3bd115d --- /dev/null +++ b/lib/strategies/html.rb @@ -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 +#{body_content}
+ HTMLORMARKDOWN + end + end + end +end diff --git a/lib/strategies/markdown.rb b/lib/strategies/markdown.rb new file mode 100644 index 0000000..64f72fa --- /dev/null +++ b/lib/strategies/markdown.rb @@ -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 diff --git a/spec/anything_spec.rb b/spec/anything_spec.rb index e9ce9ff..7d914a4 100644 --- a/spec/anything_spec.rb +++ b/spec/anything_spec.rb @@ -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 diff --git a/spec/fixtures/bad_news.html b/spec/fixtures/bad_news.html new file mode 100644 index 0000000..2e6cbfe --- /dev/null +++ b/spec/fixtures/bad_news.html @@ -0,0 +1,3 @@ +NEWS
diff --git a/spec/fixtures/bad_news.markdown b/spec/fixtures/bad_news.markdown new file mode 100644 index 0000000..deafb6f --- /dev/null +++ b/spec/fixtures/bad_news.markdown @@ -0,0 +1,5 @@ +********** +# BAD +********** +NEWS +********** diff --git a/spec/fixtures/good_news.html b/spec/fixtures/good_news.html new file mode 100644 index 0000000..b9af215 --- /dev/null +++ b/spec/fixtures/good_news.html @@ -0,0 +1,3 @@ +NEWS
diff --git a/spec/fixtures/good_news.markdown b/spec/fixtures/good_news.markdown new file mode 100644 index 0000000..791e3a1 --- /dev/null +++ b/spec/fixtures/good_news.markdown @@ -0,0 +1,5 @@ +********** +# GOOD +********** +NEWS +********** diff --git a/spec/fixtures/newsletter.html b/spec/fixtures/newsletter.html deleted file mode 100644 index 3e6942d..0000000 --- a/spec/fixtures/newsletter.html +++ /dev/null @@ -1,3 +0,0 @@ -body
diff --git a/spec/fixtures/newsletter.markdown b/spec/fixtures/newsletter.markdown deleted file mode 100644 index 9bc635d..0000000 --- a/spec/fixtures/newsletter.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Header - -body