meetupinator 0.6.2 → 0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5f72cf4935b5c1f80fdc37ade5db1ba1c8840486
4
- data.tar.gz: 1a564878339012b6226f0cfcb07c3071d58e9b2b
3
+ metadata.gz: e41038a73b4ca7867929fba449b8136bf2c37541
4
+ data.tar.gz: 6babc2eb652d6b1777506fb778519066773a5b26
5
5
  SHA512:
6
- metadata.gz: aa1c73dc1f5fc889b50d8b7ed9386e2fcdf6d6191e01ea44e9bb03767d2ddb18916fe32c3369dab060faff3ee2a1d3c2fcb9981efbd4fa695b6f807bac2be1e7
7
- data.tar.gz: 56d78d667841b48cf9e7179d97eaad91fbb4284f17c1991c3e414bb4c169555835958ee6e0ed0c4a1b33d484533407367e56d5b9703233a0083db890b7848214
6
+ metadata.gz: 8ed9720f9f2ca68aabc6d413e50fc4068af0a7ac4c9fc1ddbdded0ae37f2c13659e4651f78986ee0c42aa72bb616eea70541ce4fa24b82cf38ac33ee7aa73648
7
+ data.tar.gz: b44579126afe89cec6001c508c2fe078bde94540dd3d4a2a0b57089c50267becb2aa89d84824a64ea51e2e502b5ebadce87fbfb4271ec9281efcb83e04ffaebd
data/README.md CHANGED
@@ -7,28 +7,42 @@ Give it a list of meetup names you're interested in and then run it and it can t
7
7
  [![Gem Version](https://badge.fury.io/rb/meetupinator.svg)](http://badge.fury.io/rb/meetupinator)
8
8
 
9
9
  # What does it do atm?
10
- Reads in a list of meetups from a file and writes a csv of all the ones that have future events.
10
+ * Reads in a list of meetups from a file and writes a csv of all the ones that have future events.
11
+ * Reads in a list of meetups from a CSV file and uses an ERB template to format that list nicely.
11
12
 
12
13
  # Usage
14
+ ## Retrieving events
15
+ You must specify a input file and key or have your key in your ENV as MEETUP_API_KEY
13
16
  ```
14
- $ meetupinator getevents -i /location/of/input.txt -o /location/of/output.csv
17
+ $ meetupinator -i /location/of/input.txt -o /location/of/output.csv -k your_api_key_1234abcd -w 1
15
18
  ```
16
- or
19
+ or this will get all the up and coming events
17
20
  ```
18
- $ meetupinator getevents -i /location/of/input.txt
21
+ $ meetupinator -i /location/of/input.txt
19
22
  ```
23
+ or for two weeks worth of events
24
+ ```
25
+ $ meetupinator -i /location/of/input.txt -w 2
26
+ ```
27
+
20
28
  This will write a otuput.csv to the current directory.
21
29
 
30
+ ## Formatting
31
+ ```
32
+ $ meetupinator format -i /location/of/input.csv -o /location/of/output.whatever -t /location/of/template.whatever.erb
33
+ ```
34
+
35
+ or, to use the default output location (output.html) and default template:
36
+
37
+ ```
38
+ $ meetupinator format -i /location/of/input.csv -o /location/of/output.whatever -t /location/of/template.whatever.erb
39
+ ```
40
+
22
41
  ## During development
23
42
 
24
43
  ```
25
44
  $ bundle exec ./bin/meetupinator ...
26
45
  ```
27
46
 
28
- # todo
29
- - [x] - given a file input and an output dir write a file
30
- - [ ] - provide options for date range
31
- - [x] - Gem this
32
-
33
47
  # Licence
34
48
  [MIT](https://github.com/joesustaric/meetupinator/blob/master/LICENSE.md)
@@ -0,0 +1,70 @@
1
+ <html>
2
+ <head>
3
+ <style>
4
+ body {
5
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
6
+ font-size: 14px;
7
+ }
8
+
9
+ h1 {
10
+ font-size: 16px;
11
+ margin-top: 25px;
12
+ margin-bottom: 5px;
13
+ }
14
+
15
+ .time {
16
+ float: left;
17
+ }
18
+
19
+ .time-group {
20
+ margin-left: 80px;
21
+ }
22
+
23
+ .event-name {
24
+ margin-bottom: 0;
25
+ }
26
+
27
+ .meetup {
28
+ color: #707070;
29
+ margin-bottom: 10px;
30
+ }
31
+
32
+ a {
33
+ text-decoration: none;
34
+ }
35
+
36
+ a:hover {
37
+ text-decoration: underline;
38
+ }
39
+ </style>
40
+ </head>
41
+ <body>
42
+ <%
43
+ first_meetup = sorted_events.first
44
+ first_day = first_meetup[:date]
45
+ start_of_week = get_start_of_week(first_day)
46
+ days = days_list(start_of_week, 5)
47
+ %>
48
+ <% for day in days %>
49
+ <h1><%= day.strftime('%A %-d/%m/%Y') %></h1>
50
+
51
+ <% day_events = sorted_events.select { |event| event[:date] == day } %>
52
+
53
+ <% if day_events.empty? %>
54
+ <div>(none)</div>
55
+ <% else %>
56
+ <% day_events.group_by { |event| event[:start_time] }.each do |time, time_events| %>
57
+ <div class="time"><%= time.strftime('%-l:%M %P') %></div>
58
+ <div class="time-group">
59
+ <% for event in time_events %>
60
+ <div class="meetup">
61
+ <div class="event-name"><a href="<%= event[:event_url] %>"><%= event[:event_name] %></a></div>
62
+ <div><%= event[:group_name] %></div>
63
+ </div>
64
+ <% end %>
65
+ </div>
66
+ <% end %>
67
+ <% end %>
68
+ <% end %>
69
+ </body>
70
+ </html>
@@ -5,21 +5,33 @@ module Meetupinator
5
5
  'meetupinator v' + Meetupinator::VERSION
6
6
  end
7
7
 
8
- def self.run(args = {})
9
- new.run(args)
8
+ def self.retrieve_events(args = {})
9
+ new.retrieve_events(args)
10
10
  end
11
11
 
12
- def run(args)
13
- init(args)
12
+ def self.format(args = {})
13
+ new.format(args)
14
+ end
15
+
16
+ def retrieve_events(args)
17
+ init_retrieve(args)
14
18
  events = @event_finder.extract_events(@group_names, @api, args[:weeks])
15
19
  @event_list_file_writer.write events, args[:output]
16
20
  end
17
21
 
18
- def init(args)
22
+ def init_retrieve(args)
19
23
  @api = Meetupinator::MeetupAPI.new(args[:meetup_api_key])
20
24
  @group_names = Meetupinator::InputFileReader.group_names args[:input]
21
25
  @event_finder = Meetupinator::EventFinder.new
22
26
  @event_list_file_writer = Meetupinator::EventListFileWriter.new
23
27
  end
28
+
29
+ def format(args)
30
+ reader = Meetupinator::EventListFileReader.new
31
+ formatter = Meetupinator::Formatter.new
32
+
33
+ events = reader.read(args[:input])
34
+ formatter.format(events, args[:template], args[:output])
35
+ end
24
36
  end
25
37
  end
@@ -11,24 +11,39 @@ module Meetupinator
11
11
 
12
12
  class_option :meetup_api_key,
13
13
  type: :string, aliases: '-k',
14
- desc: 'API key for the meetup.com API,
15
- defaults to MEETUP_API_KEY environment
16
- variable if not set'
14
+ desc: 'API key for the meetup.com API, defaults to MEETUP_API_KEY environment variable if not set'
17
15
 
18
16
  desc 'getevents', 'Write all upcoming events for the given meetup
19
17
  groups specified in INPUT to OUTPUT'
20
- map 'getevents' => 'run_app'
18
+ map 'getevents' => 'retrieve_events'
21
19
  method_option :input, aliases: '-i', required: true, type: :string,
22
- desc: 'The location of the input file'
20
+ desc: 'The location of the input file.'
23
21
  method_option :output,
24
22
  aliases: '-o', required: false, type: :string,
25
23
  default: 'output.csv',
26
24
  desc: 'The name of the file you want to output. (default is ./output.csv)'
25
+ method_option :weeks,
26
+ aliases: '-w', required: false, type: :numeric,
27
+ desc: 'Number of weeks to retrieve events for.'
28
+ def retrieve_events
29
+ Meetupinator::App.retrieve_events(options)
30
+ puts "Output written to #{options[:output]}"
31
+ end
27
32
 
28
- method_option :weeks, aliases: '-w', required: false, type: :numeric
29
-
30
- def run_app
31
- Meetupinator::App.run(options)
33
+ desc 'format', 'Write a formatted version of the events listed in INPUT to a file using a template to specify the desired output format.'
34
+ method_option :input,
35
+ aliases: '-i', required: true, type: :string,
36
+ desc: 'The location of the input CSV file.'
37
+ method_option :output,
38
+ aliases: '-o', required: false, type: :string,
39
+ default: 'output.html',
40
+ desc: 'The name of the file you want to output.'
41
+ method_option :template,
42
+ aliases: '-t', required: false, type: :string,
43
+ default: File.expand_path("#{File.dirname(__FILE__)}/../../files/templates/default.html.erb"),
44
+ desc: 'The name of the template file.'
45
+ def format
46
+ Meetupinator::App.format(options)
32
47
  puts "Output written to #{options[:output]}"
33
48
  end
34
49
 
@@ -39,7 +54,7 @@ module Meetupinator
39
54
  puts Meetupinator::App.version
40
55
  end
41
56
 
42
- default_task :run_app
57
+ default_task :retrieve_events
43
58
  end
44
59
  end
45
60
  # rubocop:enable Metrics/LineLength
@@ -1,10 +1,10 @@
1
1
  module Meetupinator
2
2
  # class def
3
3
  class EventFinder
4
- def extract_events(group_url_names, api, week)
4
+ def extract_events(group_url_names, api, weeks)
5
5
  ids = group_url_names.map { |name| api.get_meetup_id name }
6
6
 
7
- api.get_upcoming_events(ids, week)
7
+ api.get_upcoming_events(ids, weeks)
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,28 @@
1
+ module Meetupinator
2
+ # Reads a list of events from a CSV file.
3
+ class EventListFileReader
4
+ def read(file_name)
5
+ File.open file_name do |body|
6
+ csv = CSV.new(body,
7
+ headers: true,
8
+ header_converters: :symbol,
9
+ converters: :all)
10
+ csv.to_a.map(&:to_hash).each { |event| parse_dates(event) }
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def parse_dates(event)
17
+ event[:start_time] = parse_time_on_date(event[:date], event[:start_time])
18
+ event[:end_time] = parse_time_on_date(event[:date], event[:end_time])
19
+ event[:date] = Time.strptime(event[:date], '%d/%m/%Y')
20
+ end
21
+
22
+ def parse_time_on_date(date, time)
23
+ time_format = '%d/%m/%Y %I:%M %p'
24
+ time_with_date = date + ' ' + time
25
+ Time.strptime(time_with_date, time_format)
26
+ end
27
+ end
28
+ end
@@ -4,6 +4,8 @@ module Meetupinator
4
4
  # class def
5
5
  class EventListFileWriter
6
6
  def write(events, file_name)
7
+ FileUtils.mkdir_p(File.dirname(file_name))
8
+
7
9
  CSV.open(file_name, 'wb') do |csv|
8
10
  csv << ['Group name', 'Event name', 'Day of week', 'Date',
9
11
  'Start time', 'End time', 'Event URL']
@@ -0,0 +1,15 @@
1
+ require 'erb'
2
+
3
+ module Meetupinator
4
+ # Creates a nicely-formatted version of a list of events.
5
+ class Formatter
6
+ def format(events, template_file, output_file)
7
+ template_engine = ERB.new(File.read(template_file))
8
+ parameters = TemplateContext.new(events)
9
+ output = template_engine.result(parameters.template_binding)
10
+
11
+ FileUtils.mkdir_p(File.dirname(output_file))
12
+ File.write(output_file, output)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ module Meetupinator
2
+ # Object passed to templates during formatting.
3
+ class TemplateContext
4
+ attr_reader :events
5
+
6
+ DAY = 60 * 60 * 24
7
+
8
+ def initialize(events)
9
+ @events = events
10
+ end
11
+
12
+ # FIXME: This will probably break for daylight savings
13
+ def get_start_of_week(d)
14
+ d -= DAY until d.monday?
15
+ d
16
+ end
17
+
18
+ def sorted_events
19
+ events.sort { |a, b| a[:start_time] <=> b[:start_time] }
20
+ end
21
+
22
+ def days_list(start_date, n)
23
+ (0..(n - 1)).map { |d| add_days(start_date, d) }
24
+ end
25
+
26
+ def template_binding
27
+ binding
28
+ end
29
+
30
+ private
31
+
32
+ def add_days(date, n)
33
+ date + n * DAY
34
+ end
35
+ end
36
+ end
@@ -1,4 +1,4 @@
1
1
  # Module Comment
2
2
  module Meetupinator
3
- VERSION = '0.6.2'
3
+ VERSION = '0.7'
4
4
  end
data/lib/meetupinator.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require 'meetupinator/app'
2
2
  require 'meetupinator/cli'
3
3
  require 'meetupinator/event_finder'
4
+ require 'meetupinator/event_list_file_reader'
4
5
  require 'meetupinator/event_list_file_writer'
6
+ require 'meetupinator/formatter'
7
+ require 'meetupinator/input_file_reader'
5
8
  require 'meetupinator/meetup_api'
9
+ require 'meetupinator/template_context'
6
10
  require 'meetupinator/version'
7
- require 'meetupinator/input_file_reader'
@@ -0,0 +1 @@
1
+ Group name,Event name,Day of week,Date,Start time,End time,Event URL
@@ -0,0 +1,90 @@
1
+ <html>
2
+ <head>
3
+ <style>
4
+ body {
5
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
6
+ font-size: 14px;
7
+ }
8
+
9
+ h1 {
10
+ font-size: 16px;
11
+ margin-top: 25px;
12
+ margin-bottom: 5px;
13
+ }
14
+
15
+ .time {
16
+ float: left;
17
+ }
18
+
19
+ .time-group {
20
+ margin-left: 80px;
21
+ }
22
+
23
+ .event-name {
24
+ margin-bottom: 0;
25
+ }
26
+
27
+ .meetup {
28
+ color: #707070;
29
+ margin-bottom: 10px;
30
+ }
31
+
32
+ a {
33
+ text-decoration: none;
34
+ }
35
+
36
+ a:hover {
37
+ text-decoration: underline;
38
+ }
39
+ </style>
40
+ </head>
41
+ <body>
42
+ <h1>Monday 16/02/2015</h1>
43
+ <div>(none)</div>
44
+
45
+ <h1>Tuesday 17/02/2015</h1>
46
+
47
+ <div class="time">3:00 pm</div>
48
+ <div class="time-group">
49
+ <div class="meetup">
50
+ <div class="event-name"><a href="http://www.fun.com/Tuesday">Fun Stuff</a></div>
51
+ <div>Tuesday Funtimes</div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="time">7:00 pm</div>
56
+ <div class="time-group">
57
+ <div class="meetup">
58
+ <div class="event-name"><a href="http://www.fun.com/Tuesday/Later">Later Fun Stuff</a></div>
59
+ <div>Tuesday Funtimes</div>
60
+ </div>
61
+ </div>
62
+
63
+ <h1>Wednesday 18/02/2015</h1>
64
+ <div>(none)</div>
65
+
66
+ <h1>Thursday 19/02/2015</h1>
67
+
68
+ <div class="time">6:30 pm</div>
69
+ <div class="time-group">
70
+ <div class="meetup">
71
+ <div class="event-name"><a href="http://www.meetup.com/Ruby-On-Rails-Oceania-Melbourne/events/219051382/">Ruby on Rails InstallFest</a></div>
72
+ <div>Ruby and Rails Melbourne</div>
73
+ </div>
74
+ <div class="meetup">
75
+ <div class="event-name"><a href="http://www.fun.com/Thursday">Fun Stuff</a></div>
76
+ <div>Thursday Funtimes</div>
77
+ </div>
78
+ </div>
79
+
80
+ <h1>Friday 20/02/2015</h1>
81
+
82
+ <div class="time">7:00 pm</div>
83
+ <div class="time-group">
84
+ <div class="meetup">
85
+ <div class="event-name"><a href="http://www.melbjs.com/jsfest/">JSFest</a></div>
86
+ <div>MelbJS</div>
87
+ </div>
88
+ </div>
89
+ </body>
90
+ </html>
@@ -24,15 +24,44 @@ describe 'The meetupinator command line interface' do
24
24
  context 'no arguments' do
25
25
  end
26
26
 
27
+ def prepare_html_for_comparison(html)
28
+ # Replace consecutive spaces with a single space, remove leading spaces at the start of a line, remove multiple blank lines
29
+ html.gsub(/[ ]+/, ' ').gsub(/^[ ]+/, '').gsub(/\n+/, "\n")
30
+ end
31
+
27
32
  context 'meetup api and input file specified' do
28
33
  it 'generates the correct output.csv in the working dir' do
29
34
  VCR.use_cassette('functional') do
30
35
  Meetupinator::CLI.start(['-i', 'input.txt', '-k', '1234'])
31
36
  end
32
- expect(CSV.read('output.csv')).to eq(CSV.read('../spec/fixtures/functional.csv'))
37
+ expect(CSV.read('output.csv')).to eq(CSV.read('../spec/fixtures/retrieveOutput.csv'))
33
38
  end
34
39
  end
35
40
 
36
41
  context 'meetup api and input file and output file specified' do
42
+ it 'generates the correct output in the specified location' do
43
+ VCR.use_cassette('functional') do
44
+ Meetupinator::CLI.start(['-i', 'input.txt', '-o', 'outputDir/mySpecialOutput.csv', '-k', '1234'])
45
+ end
46
+ expect(CSV.read('outputDir/mySpecialOutput.csv')).to eq(CSV.read('../spec/fixtures/retrieveOutput.csv'))
47
+ end
48
+ end
49
+
50
+ context 'formatting output' do
51
+ it 'generates the correct output in the specified location' do
52
+ Meetupinator::CLI.start(['format', '-i', '../spec/fixtures/formatInput.csv',
53
+ '-o', 'outputDir/formattedOutput.md',
54
+ '-t', '../files/templates/default.html.erb'])
55
+ output = prepare_html_for_comparison(IO.read('outputDir/formattedOutput.md'))
56
+ expected_output = prepare_html_for_comparison(IO.read('../spec/fixtures/formatOutput.html'))
57
+ expect(output).to eq(expected_output)
58
+ end
59
+
60
+ it 'generates the correct output in the default location using the default template' do
61
+ Meetupinator::CLI.start(['format', '-i', '../spec/fixtures/formatInput.csv'])
62
+ output = prepare_html_for_comparison(IO.read('output.html'))
63
+ expected_output = prepare_html_for_comparison(IO.read('../spec/fixtures/formatOutput.html'))
64
+ expect(output).to eq(expected_output)
65
+ end
37
66
  end
38
67
  end
@@ -3,12 +3,12 @@ require 'spec_helper'
3
3
  require 'meetupinator/app'
4
4
 
5
5
  describe Meetupinator::App do
6
- describe '#run' do
6
+ describe '#retrieve_events' do
7
+ let(:event_finder) { instance_double(Meetupinator::EventFinder) }
8
+ let(:file_writer) { instance_double(Meetupinator::EventListFileWriter) }
9
+ let(:meetup_api) { instance_double(Meetupinator::MeetupAPI) }
7
10
  let(:input_file) { 'input.txt' }
8
11
  let(:output_file) { 'output.csv' }
9
- let(:event_finder) { double('event finder') }
10
- let(:file_writer) { double('file writer') }
11
- let(:meetup_api) { double('meetup api') }
12
12
  let(:group_names) { ['First meetup group', 'Second meetup group'] }
13
13
  let(:events) { double('events') }
14
14
  let(:args) do
@@ -20,15 +20,41 @@ describe Meetupinator::App do
20
20
  }
21
21
  end
22
22
 
23
- context 'when input file / output file / api key / is specified' do
23
+ context 'when input file, output file, api key and number of weeks are specified' do
24
24
  it 'executes the program' do
25
- expect(Meetupinator::MeetupAPI).to receive(:new).and_return(meetup_api)
26
- expect(Meetupinator::InputFileReader).to receive(:group_names).with(input_file).and_return(group_names)
27
25
  expect(Meetupinator::EventFinder).to receive(:new).and_return(event_finder)
28
26
  expect(Meetupinator::EventListFileWriter).to receive(:new).and_return(file_writer)
27
+ expect(Meetupinator::MeetupAPI).to receive(:new).and_return(meetup_api)
28
+ expect(Meetupinator::InputFileReader).to receive(:group_names).with(input_file).and_return(group_names)
29
29
  expect(event_finder).to receive(:extract_events).with(group_names, meetup_api, 1).and_return(events)
30
30
  expect(file_writer).to receive(:write).with(events, output_file)
31
- Meetupinator::App.run(args)
31
+ Meetupinator::App.retrieve_events(args)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#format' do
37
+ let(:file_reader) { instance_double(Meetupinator::EventListFileReader) }
38
+ let(:formatter) { instance_double(Meetupinator::Formatter) }
39
+ let(:input_file) { 'input.csv' }
40
+ let(:output_file) { 'output.md' }
41
+ let(:template_file) { 'template.md.erb' }
42
+ let(:events) { double('events') }
43
+ let(:args) do
44
+ {
45
+ input: input_file,
46
+ output: output_file,
47
+ template: template_file
48
+ }
49
+ end
50
+
51
+ context 'when input file, output file and template are specified' do
52
+ it 'formats the given events using the given template and saves the output to the specified output filename' do
53
+ expect(Meetupinator::EventListFileReader).to receive(:new).and_return(file_reader)
54
+ expect(Meetupinator::Formatter).to receive(:new).and_return(formatter)
55
+ expect(file_reader).to receive(:read).with(input_file).and_return(events)
56
+ expect(formatter).to receive(:format).with(events, template_file, output_file)
57
+ Meetupinator::App.format(args)
32
58
  end
33
59
  end
34
60
  end
@@ -0,0 +1,49 @@
1
+ require 'fakefs/spec_helpers'
2
+ require 'spec_helper'
3
+ require 'meetupinator/event_list_file_reader'
4
+
5
+ describe Meetupinator::EventListFileReader do
6
+ include FakeFS::SpecHelpers::All
7
+
8
+ let(:file_name) { 'input.csv' }
9
+ let(:input) do
10
+ [
11
+ 'Group name,Event name,Day of week,Date,Start time,End time,Event URL',
12
+ 'Ruby and Rails Melbourne,Ruby on Rails InstallFest,Thursday,19/02/2015,6:30 pm,9:00 pm,http://www.meetup.com/Ruby-On-Rails-Oceania-Melbourne/events/219051382/',
13
+ 'Ruby and Rails Melbourne,Melbourne Ruby,Wednesday,25/02/2015,6:00 pm,9:00 pm,http://www.meetup.com/Ruby-On-Rails-Oceania-Melbourne/events/219387830/'
14
+ ].join("\n")
15
+ end
16
+ let(:expected_output) do
17
+ [
18
+ {
19
+ group_name: 'Ruby and Rails Melbourne',
20
+ event_name: 'Ruby on Rails InstallFest',
21
+ day_of_week: 'Thursday',
22
+ date: Time.new(2015, 2, 19),
23
+ start_time: Time.new(2015, 2, 19, 18, 30),
24
+ end_time: Time.new(2015, 2, 19, 21, 0),
25
+ event_url: 'http://www.meetup.com/Ruby-On-Rails-Oceania-Melbourne/events/219051382/'
26
+ },
27
+ {
28
+ group_name: 'Ruby and Rails Melbourne',
29
+ event_name: 'Melbourne Ruby',
30
+ day_of_week: 'Wednesday',
31
+ date: Time.new(2015, 2, 25),
32
+ start_time: Time.new(2015, 2, 25, 18, 0),
33
+ end_time: Time.new(2015, 2, 25, 21, 0),
34
+ event_url: 'http://www.meetup.com/Ruby-On-Rails-Oceania-Melbourne/events/219387830/'
35
+ }
36
+ ]
37
+ end
38
+
39
+ before do
40
+ File.write(file_name, input)
41
+ end
42
+
43
+ describe '#read' do
44
+ it 'should read all events from the file' do
45
+ output = subject.read file_name
46
+ expect(output).to eq(expected_output)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ require 'fakefs/spec_helpers'
2
+ require 'spec_helper'
3
+ require 'meetupinator/formatter'
4
+
5
+ describe Meetupinator::Formatter do
6
+ include FakeFS::SpecHelpers::All
7
+
8
+ let(:template) { 'template content' }
9
+ let(:template_file) { 'template.erb' }
10
+ let(:events) { double('events') }
11
+ let(:output) { 'output' }
12
+ let(:output_file) { 'output.blah' }
13
+ let(:erb) { instance_double(ERB) }
14
+
15
+ describe '#format' do
16
+ before do
17
+ File.write(template_file, template)
18
+ end
19
+
20
+ it 'passes the events to the formatter and saves the result to file' do
21
+ expect(ERB).to receive(:new).with(template).and_return(erb)
22
+ expect(erb).to receive(:result) do |binding|
23
+ expect(eval('events', binding)).to eq(events) # rubocop:disable Lint/Eval
24
+ output
25
+ end
26
+
27
+ subject.format(events, template_file, output_file)
28
+
29
+ expect(File.read(output_file)).to eq(output)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,48 @@
1
+ require 'fakefs/spec_helpers'
2
+ require 'spec_helper'
3
+ require 'meetupinator/formatter'
4
+
5
+ describe Meetupinator::TemplateContext do
6
+ let(:events) do
7
+ [
8
+ {
9
+ event_name: 'Event A',
10
+ start_time: Time.new(2015, 03, 21, 7, 0)
11
+ },
12
+ {
13
+ event_name: 'Event B',
14
+ start_time: Time.new(2015, 03, 19, 7, 0)
15
+ },
16
+ {
17
+ event_name: 'Event C',
18
+ start_time: Time.new(2015, 03, 19, 8, 0)
19
+ }
20
+ ]
21
+ end
22
+
23
+ subject do
24
+ Meetupinator::TemplateContext.new(events)
25
+ end
26
+
27
+ describe '#get_start_of_week' do
28
+ it 'returns the given day if it is a Monday' do
29
+ expect(subject.get_start_of_week(Time.new(2015, 3, 16))).to eq(Time.new(2015, 3, 16))
30
+ end
31
+
32
+ it 'returns the previous Monday if the day is not a Monday' do
33
+ expect(subject.get_start_of_week(Time.new(2015, 3, 22))).to eq(Time.new(2015, 3, 16))
34
+ end
35
+ end
36
+
37
+ describe '#sorted_events' do
38
+ it 'returns the events in order sorted by start time' do
39
+ expect(subject.sorted_events.map { |e| e[:event_name] }).to eq(['Event B', 'Event C', 'Event A'])
40
+ end
41
+ end
42
+
43
+ describe '#days_list' do
44
+ it 'returns a list of days starting with the day given' do
45
+ expect(subject.days_list(Time.new(2015, 3, 19), 3)).to eq([Time.new(2015, 3, 19), Time.new(2015, 3, 20), Time.new(2015, 3, 21)])
46
+ end
47
+ end
48
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meetupinator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: '0.7'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Sustaric
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-02-22 00:00:00.000000000 Z
13
+ date: 2015-03-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -164,22 +164,31 @@ extra_rdoc_files: []
164
164
  files:
165
165
  - README.md
166
166
  - bin/meetupinator
167
+ - files/templates/default.html.erb
167
168
  - lib/meetupinator.rb
168
169
  - lib/meetupinator/app.rb
169
170
  - lib/meetupinator/cli.rb
170
171
  - lib/meetupinator/event_finder.rb
172
+ - lib/meetupinator/event_list_file_reader.rb
171
173
  - lib/meetupinator/event_list_file_writer.rb
174
+ - lib/meetupinator/formatter.rb
172
175
  - lib/meetupinator/input_file_reader.rb
173
176
  - lib/meetupinator/meetup_api.rb
177
+ - lib/meetupinator/template_context.rb
174
178
  - lib/meetupinator/version.rb
175
- - spec/fixtures/functional.csv
179
+ - spec/fixtures/formatInput.csv
180
+ - spec/fixtures/formatOutput.html
181
+ - spec/fixtures/retrieveOutput.csv
176
182
  - spec/functional/cli_spec.rb
177
183
  - spec/lib/meetupinator/app_spec.rb
178
184
  - spec/lib/meetupinator/event_finder_spec.rb
185
+ - spec/lib/meetupinator/event_list_file_reader_spec.rb
179
186
  - spec/lib/meetupinator/event_list_file_writer_spec.rb
187
+ - spec/lib/meetupinator/formatter_spec.rb
180
188
  - spec/lib/meetupinator/functional_spec.rb
181
189
  - spec/lib/meetupinator/input_file_reader_spec.rb
182
190
  - spec/lib/meetupinator/meetup_api_spec.rb
191
+ - spec/lib/meetupinator/template_context_spec.rb
183
192
  - spec/spec_helper.rb
184
193
  - spec/test_helpers/match_stdout.rb
185
194
  - spec/vcr_cassettes/events_multiple_groups.yml
@@ -214,14 +223,19 @@ signing_key:
214
223
  specification_version: 4
215
224
  summary: Tool to generate weekly meetup emails
216
225
  test_files:
217
- - spec/fixtures/functional.csv
226
+ - spec/fixtures/formatInput.csv
227
+ - spec/fixtures/formatOutput.html
228
+ - spec/fixtures/retrieveOutput.csv
218
229
  - spec/functional/cli_spec.rb
219
230
  - spec/lib/meetupinator/app_spec.rb
220
231
  - spec/lib/meetupinator/event_finder_spec.rb
232
+ - spec/lib/meetupinator/event_list_file_reader_spec.rb
221
233
  - spec/lib/meetupinator/event_list_file_writer_spec.rb
234
+ - spec/lib/meetupinator/formatter_spec.rb
222
235
  - spec/lib/meetupinator/functional_spec.rb
223
236
  - spec/lib/meetupinator/input_file_reader_spec.rb
224
237
  - spec/lib/meetupinator/meetup_api_spec.rb
238
+ - spec/lib/meetupinator/template_context_spec.rb
225
239
  - spec/spec_helper.rb
226
240
  - spec/test_helpers/match_stdout.rb
227
241
  - spec/vcr_cassettes/events_multiple_groups.yml