morning-pages 0.2.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/README.md CHANGED
@@ -5,15 +5,22 @@ Morning Pages
5
5
 
6
6
  I've long been fascinated by the morning pages habit of writing three pages (or about 750 words) of whatever comes into your head each day - it's like taking a mental showers and helps to clear your head, ready for the day. There are great sites out there like http://750words.com, but I live on the command line and like to keep my words on my own computer.
7
7
 
8
- When installed, type `morning-pages help` for more info.
8
+ When installed, type `morning-pages` to open your `$EDITOR` with the file for today. Type away and quit your editor, and you'll get stats on how many words you've typed today.
9
+
10
+ Use `-d <folder>` to change the default words folder (currently `~/words`).
11
+
12
+ ## Plans
13
+
14
+ In future, I hope to post words stats up to a central server so we can track leaderboards and badges. Don't worry, we'll never post your actual words.
9
15
 
10
16
  ## Contributing
11
17
 
12
18
  We work on pull requests. If you have an idea for something you'd like to contribute, here's how to do it:
13
19
 
14
- 1. Create a local branch, and commit a failing spec that describes what you want to implement.
15
- 2. Push the branch, go on Github and create a pull request from the head of the branch.
16
- 3. Start the conversation: ping the mailing list and get some people to pair with you on designing the code. Iterate in the pull request, adding more specs, making them pass and refactoring until everyone is happy.
17
- 4. Remember to regularly rebase your branch from master in case there are upstream changes to pull in.
18
- 5. Get someone else to merge your pull request, that way you know your code makes sense to at least one other person.
19
- 6. Go and have a nice cup of tea to celebrate.
20
+ * Fork the project.
21
+ * Make your feature addition or bug fix.
22
+ * Add tests for it. This is important so I don't break it in a
23
+ future version unintentionally.
24
+ * Commit, do not mess with rakefile, version, or history.
25
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
26
+ * Send me a pull request. Bonus points for topic branches.
@@ -3,16 +3,47 @@ $: << File.dirname(__FILE__) + '/../lib'
3
3
 
4
4
  require 'trollop'
5
5
  require 'morning-pages'
6
+ require 'highline/import'
6
7
 
7
8
  opts = Trollop.options do
8
9
  opt :dir, "Words directory", :required => false, :type => :string, :default => "~/words"
10
+ opt :config, "Configuration file", :required => false, :type => :string, :default => "~/.morning-pages/config.yml"
11
+ opt :server, "Stats server", :required => false, :type => :string, :default => "http://morning-pages.me/api"
9
12
  end
10
13
 
11
- opts[:dir] = File.expand_path(opts[:dir])
12
- MorningPages.setup(opts)
14
+ [:dir, :config].each { |key| opts[key] = File.expand_path(opts[key]) }
13
15
 
14
- path = MorningPages.today_path(opts[:dir])
16
+ config = MorningPages::Config.new(opts[:config], opts[:server])
17
+ unless (config.registered?)
18
+ say "<%= color('Welcome to Morning Pages!', :yellow) %>"
19
+ say "We record basic stats and the fact you've posted under your chosen username at http://morning-pages.me"
20
+ say "We never post your actual words or your real name."
21
+ username = ask "What is your desired username? " do |q|
22
+ q.validate = /\w+/
23
+ end
24
+ email = ask "What is your email address (for account recovery?) " do |q|
25
+ q.validate = /@/
26
+ end
27
+ if config.register!(:username => username, :email => email)
28
+ say "Saved to #{opts[:config]}."
29
+ else
30
+ say "<%= color('There was a problem registering your account.', :red) %> You can continue but your stats will not be saved to the website."
31
+ if (ask "Press enter to continue, or 'q' and then enter to quit:") == 'q'
32
+ exit(0)
33
+ end
34
+ end
35
+ end
36
+
37
+ pages = MorningPages::Folder.new(opts)
38
+
39
+ path = pages.today_path
15
40
 
16
41
  system "$EDITOR #{path}"
17
42
 
18
- puts MorningPages.stats_for_today(opts[:dir])
43
+ stats = MorningPages::Stats.new(pages.todays_words)
44
+ puts MorningPages::TextReporter.new(stats).report
45
+ if stats.post!(config)
46
+ say "Stats uploaded to #{opts[:server]}"
47
+ else
48
+ say "<%= color('There was a problem posting your stats this time.', :red) %> You can try running the problem again to retry if you want to."
49
+ end
@@ -1,7 +1,33 @@
1
1
  require 'tmpdir'
2
+ require 'background_process'
3
+
4
+ def prep_config
5
+ yaml = "---\n:username: test\n:email: test@example.com\n"
6
+ File.open(@config, 'w') { |f| f.write(yaml) }
7
+ end
8
+
9
+ def command
10
+ "morning-pages -d #{@dir} -c #{@config} -s http://localhost:45110/api"
11
+ end
2
12
 
3
13
  When /^I run 'morning\-pages'$/ do
4
- run "morning-pages -d #{@dir}"
14
+ prep_config
15
+ run command
16
+ end
17
+
18
+ When /^I run 'morning\-pages' for the first time$/ do
19
+ run_interactive command
20
+ type("chrismdp")
21
+ type("chris@example.com")
22
+ end
23
+
24
+ Then /^I should be asked for my username and email before writing$/ do
25
+ all_output.should match(/username/i)
26
+ all_output.should match(/email/i)
27
+ end
28
+
29
+ Then /^I should have my stats uploaded to the website after writing$/ do
30
+ all_output.should match(/uploaded/i)
5
31
  end
6
32
 
7
33
  Then /^I should be able to write my words$/ do
@@ -9,14 +35,27 @@ Then /^I should be able to write my words$/ do
9
35
  check_exact_file_content "#{@dir}/#{Time.now.strftime("%Y\-%m\-%d")}", "fake editor output"
10
36
  end
11
37
 
12
- Then /^I see my current word stats after I finish$/ do
38
+ Then /^I should see my current word stats after I finish$/ do
13
39
  all_output.should match(/3 words/)
14
40
  end
15
41
 
16
42
  Before do
17
43
  @dir = Dir.mktmpdir + "/words/foo"
44
+ @config = Dir.mktmpdir + '/config.yml'
45
+ @server = BackgroundProcess.run("bundle exec rackup -p 45110 features/support/server.ru")
46
+ @out = []
47
+ @server.detect { |line| @out << line; line =~ /WEBrick::HTTPServer#start/ }
18
48
  end
19
49
 
50
+
20
51
  After do
21
- FileUtils.remove_entry_secure @dir
52
+ FileUtils.remove_entry_secure @dir if File.exists?(@dir)
53
+ @server.kill("KILL")
54
+ @server.wait
55
+ @out << @server.stdout.read
56
+ @out << @server.stderr.read
57
+ puts "Stopped server"
58
+ puts "TEST SERVER OUTPUT"
59
+ puts @out.join
60
+ $stdout.flush
22
61
  end
@@ -1 +1,3 @@
1
1
  $: << File.dirname(__FILE__) + '/../../lib'
2
+
3
+ require 'webmock/cucumber'
@@ -0,0 +1,13 @@
1
+ require 'sinatra'
2
+
3
+ post '/api/register' do
4
+ content_type "application/json"
5
+ %{{"key":"12345"}}
6
+ end
7
+
8
+ post '/api/stats' do
9
+ halt 401 unless params[:key] == '12345'
10
+ "OK"
11
+ end
12
+
13
+ run Sinatra::Application
@@ -0,0 +1,14 @@
1
+ Feature: Uploading stats
2
+ As Wilma the writer
3
+ I want to type morning-pages for the first time and be asked for a login, which is then checked to see if it's available
4
+
5
+ Scenario: Credential saving
6
+ When I run 'morning-pages' for the first time
7
+ Then I should be asked for my username and email before writing
8
+ And I should have my stats uploaded to the website after writing
9
+
10
+ Scenario: Username already taken
11
+ When I run 'morning-pages' for the first time
12
+ And I enter an existing username
13
+ Then I should be asked for another username
14
+
@@ -6,4 +6,4 @@ Feature: writing words
6
6
  Scenario:
7
7
  When I run 'morning-pages'
8
8
  Then I should be able to write my words
9
- And I see my current word stats after I finish
9
+ And I should see my current word stats after I finish
@@ -1,6 +1,15 @@
1
1
  require "morning-pages/version"
2
+ require "morning-pages/folder"
3
+ require "morning-pages/config"
4
+ require "morning-pages/stats"
5
+ require "morning-pages/text_reporter"
6
+
2
7
  require 'fileutils'
3
8
 
9
+ module MorningPages
10
+ TARGET = 750
11
+ end
12
+
4
13
  class Array
5
14
  def mean
6
15
  inject(0, &:+) / count.to_f
@@ -11,28 +20,3 @@ class Array
11
20
  end
12
21
  end
13
22
 
14
- module MorningPages
15
- def self.setup(options)
16
- FileUtils.mkdir_p(options[:dir]) unless File.exists?(options[:dir])
17
- end
18
-
19
- def self.stats_for_today(dir)
20
- words = get_words_for(today_path(dir)).split(" ")
21
- [
22
- "You have written #{words.count} words today.",
23
- average_word_length(words)
24
- ].join(" ")
25
- end
26
-
27
- def self.average_word_length(words)
28
- words.empty? ? "" : "Average word length: %.2f" % [ words.average_length ]
29
- end
30
-
31
- def self.today_path(dir)
32
- File.expand_path([dir, Time.now.strftime("%Y\-%m\-%d")].join('/'))
33
- end
34
-
35
- def self.get_words_for(path)
36
- File.exists?(path) ? File.read(path) : ""
37
- end
38
- end
@@ -0,0 +1,53 @@
1
+ require 'yaml'
2
+ require 'httparty'
3
+
4
+ module MorningPages
5
+ class Config
6
+ def initialize(config_path, server)
7
+ @config_path = config_path
8
+ @server = server
9
+ containing_folder = File.dirname(config_path)
10
+
11
+ unless (File.exists?(containing_folder))
12
+ FileUtils.mkdir_p(containing_folder)
13
+ end
14
+
15
+ @config = {}
16
+ if (File.exists?(@config_path))
17
+ @config = YAML.load(File.read(@config_path))
18
+ end
19
+ end
20
+
21
+ def registered?
22
+ @config.include? :username
23
+ end
24
+
25
+ def register!(params)
26
+ response = HTTParty.post("#{@server}/register", :body => params)
27
+ return false if response.code != 200
28
+ save(params.merge(:key => response.fetch("key")))
29
+ write!
30
+ true
31
+ rescue Timeout::Error
32
+ return false
33
+ end
34
+
35
+ def post_stats!(params)
36
+ response = HTTParty.post("#{@server}/stats", :body => params.merge(:key => @config[:key]))
37
+ return false if response.code != 200
38
+ true
39
+ rescue Timeout::Error
40
+ return false
41
+ end
42
+
43
+ private
44
+
45
+ def save(params)
46
+ @config.merge!(params)
47
+ end
48
+
49
+ def write!
50
+ File.open(@config_path, 'w') { |f| f.write(@config.to_yaml) }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,22 @@
1
+ module MorningPages
2
+ class Folder
3
+ def initialize(options = {})
4
+ @dir = options[:dir]
5
+ if (@dir && !File.exists?(@dir))
6
+ FileUtils.mkdir_p(@dir)
7
+ end
8
+ end
9
+
10
+ def todays_words
11
+ get_words_for(today_path)
12
+ end
13
+
14
+ def today_path
15
+ File.expand_path([@dir, Time.now.strftime("%Y\-%m\-%d")].join('/'))
16
+ end
17
+
18
+ def get_words_for(path)
19
+ (File.exists?(path) ? File.read(path) : "").split(" ")
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module MorningPages
2
+ class Stats < Struct.new(:words)
3
+ def count
4
+ words.count
5
+ end
6
+
7
+ def average_length
8
+ words.average_length
9
+ end
10
+
11
+ def post!(config)
12
+ config.post_stats!(:count => count, :average_length => average_length)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module MorningPages
2
+ class TextReporter < Struct.new(:stats)
3
+ def report
4
+ [
5
+ target(stats),
6
+ "You have written #{stats.count} words today.",
7
+ average_word_length(stats)
8
+ ].join("\n")
9
+ end
10
+
11
+ def average_word_length(stats)
12
+ stats.count > 0 ?
13
+ "Average word length: %.2f." % [ stats.average_length ] :
14
+ ""
15
+ end
16
+
17
+ def target(stats)
18
+ stats.count >= MorningPages::TARGET ?
19
+ "Congratulations! You have reached the target today -- you are awesome!" :
20
+ "You have written %.2f%% of the target today." % [stats.count * 100.0 / TARGET]
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module MorningPages
2
- VERSION = "0.2.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -21,8 +21,13 @@ Gem::Specification.new do |s|
21
21
  s.require_paths = ["lib"]
22
22
 
23
23
  s.add_dependency 'trollop', '~> 1.16.2'
24
+ s.add_dependency 'highline'
25
+ s.add_dependency 'httparty'
24
26
  s.add_development_dependency 'rspec', '~> 2.10.0'
25
27
  s.add_development_dependency 'rake', '~> 0.9.2.2'
26
28
  s.add_development_dependency 'cucumber', '~> 1.2'
27
29
  s.add_development_dependency 'aruba', '~> 0.4'
30
+ s.add_development_dependency 'webmock', '~> 1.8.10'
31
+ s.add_development_dependency 'background_process', '~> 1.3'
32
+ s.add_development_dependency 'sinatra'
28
33
  end
@@ -0,0 +1,94 @@
1
+ require 'morning-pages'
2
+
3
+ require 'webmock/rspec'
4
+
5
+ describe 'config' do
6
+ subject { MorningPages::Config.new('new-folder/file', 'http://morning-pages.me/api') }
7
+ let(:params) {{ :username => "test", :email => "test@example.com" }}
8
+ let(:yaml) { params.to_yaml }
9
+ before do
10
+ FileUtils.stub(:mkdir_p)
11
+ end
12
+ context 'not pre-existing' do
13
+ before do
14
+ File.stub(:exists? => false)
15
+ end
16
+
17
+ it 'creates the folder' do
18
+ FileUtils.should_receive(:mkdir_p).with("new-folder")
19
+ subject
20
+ end
21
+
22
+ it 'is not registered' do
23
+ subject.should_not be_registered
24
+ end
25
+
26
+ context 'saving to file' do
27
+ let(:file) { double }
28
+ before do
29
+ File.stub(:open).with('new-folder/file', 'w').and_yield(file)
30
+ file.stub(:write)
31
+ stub_request(:post, "http://morning-pages.me/api/register").
32
+ to_return(:status => 200, :body => %{{"key":"abcde"}}, :headers => { "Content-type" => "application/json"})
33
+ end
34
+
35
+ it 'writes the file with a key from the server' do
36
+ file.should_receive(:write).with(params.merge(:key => 'abcde').to_yaml)
37
+ subject.register!(:username => 'test', :email => 'test@example.com').should be_true
38
+ end
39
+
40
+ it 'returns message on timeout' do
41
+ stub_request(:post, "http://morning-pages.me/api/register").to_timeout
42
+ subject.register!(:username => 'test', :email => 'test@example.com').should be_false
43
+ end
44
+
45
+ it 'returns false on failed request' do
46
+ stub_request(:post, "http://morning-pages.me/api/register").to_return(:status => 406)
47
+ subject.register!(:username => 'test', :email => 'test@example.com').should be_false
48
+ end
49
+ end
50
+
51
+ context 'posting stats' do
52
+ it 'posts them to the website' do
53
+ stub_request(:post, "http://morning-pages.me/api/stats").
54
+ to_return(:status => 200, :body => %{OK})
55
+ subject.post_stats!(:count => 4, :average_length => 2.1).should be_true
56
+ end
57
+
58
+ it 'returns a failure if there was a problem' do
59
+ stub_request(:post, "http://morning-pages.me/api/stats").
60
+ to_return(:status => 500)
61
+ subject.post_stats!(:count => 4, :average_length => 2.1).should be_false
62
+ stub_request(:post, "http://morning-pages.me/api/stats").to_timeout
63
+ subject.post_stats!(:count => 4, :average_length => 2.1).should be_false
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'with an existing folder but no file' do
69
+ before do
70
+ File.stub(:exists?).with('new-folder').and_return(true)
71
+ File.stub(:exists?).with('new-folder/file').and_return(false)
72
+ end
73
+
74
+ it 'does not create the folder' do
75
+ FileUtils.should_not_receive(:mkdir_p)
76
+ subject
77
+ end
78
+
79
+ it 'is not registered' do
80
+ subject.should_not be_registered
81
+ end
82
+ end
83
+
84
+ context 'with existing file' do
85
+ before do
86
+ File.stub(:exists? => true)
87
+ File.stub(:read => yaml)
88
+ end
89
+
90
+ it 'is registered' do
91
+ subject.should be_registered
92
+ end
93
+ end
94
+ end
@@ -4,13 +4,13 @@ describe 'setup' do
4
4
  context 'with a new folder' do
5
5
  it 'creates the folder' do
6
6
  FileUtils.should_receive(:mkdir_p)
7
- MorningPages.setup(:dir => 'new-folder')
7
+ MorningPages::Folder.new(:dir => 'new-folder')
8
8
  end
9
9
  end
10
10
  context 'with an existing folder' do
11
11
  it 'does nothing' do
12
12
  FileUtils.should_not_receive(:mkdir_p)
13
- MorningPages.setup(:dir => '.')
13
+ MorningPages::Folder.new(:dir => '.')
14
14
  end
15
15
  end
16
16
  end
@@ -1,33 +1,58 @@
1
1
  require 'morning-pages'
2
2
 
3
- module MorningPages
4
- describe 'stats' do
5
- context 'for today' do
6
- before(:each) do
7
- File.stub(:exists? => true)
8
- File.stub(:read => "foo ba")
9
- end
3
+ describe 'stats' do
4
+ let(:folder) { MorningPages::Folder.new(:dir => '/tmp/foo') }
10
5
 
11
- it 'prints out the word count' do
12
- MorningPages.stats_for_today("foo").should match(/2 words/)
13
- end
6
+ before(:each) do
7
+ File.stub(:exists? => true)
8
+ File.stub(:read => "foo ba")
9
+ end
10
+
11
+ describe "posting" do
12
+ subject { MorningPages::Stats.new(folder.todays_words) }
13
+ let(:config) { double }
14
+
15
+ it 'posts the stats to the website using config key' do
16
+ config.should_receive(:post_stats!).with(:count => 2, :average_length => 2.5)
17
+ subject.post!(config)
18
+ end
19
+ end
20
+
21
+ context 'for today' do
22
+ let(:stats) { MorningPages::Stats.new(folder.todays_words) }
23
+ subject { MorningPages::TextReporter.new(stats) }
24
+
25
+ it 'prints out the word count' do
26
+ subject.report.should match(/2 words/)
27
+ end
28
+
29
+ it 'prints the average word length' do
30
+ subject.report.should match(/2\.5/)
31
+ end
32
+
33
+ it 'prints your percentage to go' do
34
+ subject.report.should match(/0.27%/)
35
+ end
14
36
 
15
- it 'prints the average word length' do
16
- MorningPages.stats_for_today("foo").should match(/2\.5/)
37
+ context "when written 800 words" do
38
+ before { File.stub(:read => "word " * 800) }
39
+
40
+ it "shows a nice message" do
41
+ subject.report.should match(/Congratulations.*awesome/)
17
42
  end
43
+ end
18
44
 
19
- context 'when today has no words yet' do
20
- before do
21
- File.stub(:exists? => false)
22
- end
45
+ context 'when today has no words yet' do
46
+ before do
47
+ File.stub(:exists? => false)
48
+ end
23
49
 
24
- it "shows a message to that effect" do
25
- MorningPages.stats_for_today("foo").should match(/0 words/)
26
- end
50
+ it "shows a message to that effect" do
51
+ subject.report.should match(/0 words/)
52
+ end
27
53
 
28
- it "does not show average" do
29
- MorningPages.stats_for_today("foo").should_not match(/NaN/)
30
- end
54
+ it "does not show average" do
55
+ subject.report.should_not match(/NaN/)
31
56
  end
32
57
  end
33
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morning-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-18 00:00:00.000000000 Z
12
+ date: 2012-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: trollop
@@ -27,6 +27,38 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.16.2
30
+ - !ruby/object:Gem::Dependency
31
+ name: highline
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: httparty
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
30
62
  - !ruby/object:Gem::Dependency
31
63
  name: rspec
32
64
  requirement: !ruby/object:Gem::Requirement
@@ -91,6 +123,54 @@ dependencies:
91
123
  - - ~>
92
124
  - !ruby/object:Gem::Version
93
125
  version: '0.4'
126
+ - !ruby/object:Gem::Dependency
127
+ name: webmock
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 1.8.10
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 1.8.10
142
+ - !ruby/object:Gem::Dependency
143
+ name: background_process
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: '1.3'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: '1.3'
158
+ - !ruby/object:Gem::Dependency
159
+ name: sinatra
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
94
174
  description: ! "I've long been fascinated by the morning pages habit of writing three
95
175
  pages (or about 750 words) of whatever comes into your head each day - it's like
96
176
  taking a mental showers and helps to clear your head, ready for the day. There are
@@ -104,6 +184,7 @@ executables:
104
184
  extensions: []
105
185
  extra_rdoc_files: []
106
186
  files:
187
+ - .DS_Store
107
188
  - .gitignore
108
189
  - .rspec
109
190
  - Gemfile
@@ -114,10 +195,17 @@ files:
114
195
  - features/step_definitions/steps.rb
115
196
  - features/support/driver.rb
116
197
  - features/support/env.rb
198
+ - features/support/server.ru
199
+ - features/uploading_stats.feature
117
200
  - features/writing_words.feature
118
201
  - lib/morning-pages.rb
202
+ - lib/morning-pages/config.rb
203
+ - lib/morning-pages/folder.rb
204
+ - lib/morning-pages/stats.rb
205
+ - lib/morning-pages/text_reporter.rb
119
206
  - lib/morning-pages/version.rb
120
207
  - morning-pages.gemspec
208
+ - spec/config_spec.rb
121
209
  - spec/setup_spec.rb
122
210
  - spec/stats_spec.rb
123
211
  homepage: http://github.com/chrismdp/morning-pages
@@ -132,15 +220,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
220
  - - ! '>='
133
221
  - !ruby/object:Gem::Version
134
222
  version: '0'
223
+ segments:
224
+ - 0
225
+ hash: -965781968581789806
135
226
  required_rubygems_version: !ruby/object:Gem::Requirement
136
227
  none: false
137
228
  requirements:
138
229
  - - ! '>='
139
230
  - !ruby/object:Gem::Version
140
231
  version: '0'
232
+ segments:
233
+ - 0
234
+ hash: -965781968581789806
141
235
  requirements: []
142
236
  rubyforge_project: morning-pages
143
- rubygems_version: 1.8.19
237
+ rubygems_version: 1.8.24
144
238
  signing_key:
145
239
  specification_version: 3
146
240
  summary: Command line helper to write your morning pages
@@ -149,6 +243,9 @@ test_files:
149
243
  - features/step_definitions/steps.rb
150
244
  - features/support/driver.rb
151
245
  - features/support/env.rb
246
+ - features/support/server.ru
247
+ - features/uploading_stats.feature
152
248
  - features/writing_words.feature
249
+ - spec/config_spec.rb
153
250
  - spec/setup_spec.rb
154
251
  - spec/stats_spec.rb