morning-pages 0.2.2 → 1.0.0
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.
- data/.DS_Store +0 -0
- data/README.md +14 -7
- data/bin/morning-pages +35 -4
- data/features/step_definitions/steps.rb +42 -3
- data/features/support/env.rb +2 -0
- data/features/support/server.ru +13 -0
- data/features/uploading_stats.feature +14 -0
- data/features/writing_words.feature +1 -1
- data/lib/morning-pages.rb +9 -25
- data/lib/morning-pages/config.rb +53 -0
- data/lib/morning-pages/folder.rb +22 -0
- data/lib/morning-pages/stats.rb +15 -0
- data/lib/morning-pages/text_reporter.rb +23 -0
- data/lib/morning-pages/version.rb +1 -1
- data/morning-pages.gemspec +5 -0
- data/spec/config_spec.rb +94 -0
- data/spec/setup_spec.rb +2 -2
- data/spec/stats_spec.rb +47 -22
- metadata +100 -3
data/.DS_Store
ADDED
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
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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.
|
data/bin/morning-pages
CHANGED
@@ -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
|
-
|
12
|
-
MorningPages.setup(opts)
|
14
|
+
[:dir, :config].each { |key| opts[key] = File.expand_path(opts[key]) }
|
13
15
|
|
14
|
-
|
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
|
-
|
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
|
-
|
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
|
data/features/support/env.rb
CHANGED
@@ -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
|
+
|
data/lib/morning-pages.rb
CHANGED
@@ -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
|
data/morning-pages.gemspec
CHANGED
@@ -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
|
data/spec/config_spec.rb
ADDED
@@ -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
|
data/spec/setup_spec.rb
CHANGED
@@ -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.
|
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.
|
13
|
+
MorningPages::Folder.new(:dir => '.')
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/spec/stats_spec.rb
CHANGED
@@ -1,33 +1,58 @@
|
|
1
1
|
require 'morning-pages'
|
2
2
|
|
3
|
-
|
4
|
-
|
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
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
45
|
+
context 'when today has no words yet' do
|
46
|
+
before do
|
47
|
+
File.stub(:exists? => false)
|
48
|
+
end
|
23
49
|
|
24
|
-
|
25
|
-
|
26
|
-
|
50
|
+
it "shows a message to that effect" do
|
51
|
+
subject.report.should match(/0 words/)
|
52
|
+
end
|
27
53
|
|
28
|
-
|
29
|
-
|
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.
|
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-
|
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.
|
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
|