neruda 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.org +56 -5
- data/bin/pablo +76 -32
- data/lib/tasks/capistrano/chapters.rake +13 -2
- data/lib/tasks/chapters.rake +1 -1
- data/lib/tasks/sinatra.rake +3 -1
- metadata +35 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fec1e086d008db01ac799fc96019a2b04f284f5
|
4
|
+
data.tar.gz: bdd74e72f8116cf2c1156f085eb41c2b23744b1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b08b4e4040c7ca5ec07f556b0b71dafaf141f6c25a2027188569a60661e5c0dc6354ed8efc1a22adc16ba43322f9c633d092656eb697efb60198226fc7e6452
|
7
|
+
data.tar.gz: 2b8457ae617246c0c96ac522d9cc3d0036daee5ae14089d74656bdb7e5b57a37b4d77fcb0aa646628b53b33b00d1dc846a47dba904945669b706151145228964
|
data/README.org
CHANGED
@@ -3,11 +3,14 @@
|
|
3
3
|
*Neruda* is a little [[http://sinatrarb.com][Sinatra]] app, which aims to offer a quick access for
|
4
4
|
writers to web publication. It is named in memory of Pablo Neruda.
|
5
5
|
|
6
|
+
Source code is available on my [[https://git.deparis.io/neruda][cgit instance]], while issues should be
|
7
|
+
followed on my [[https://projects.deparis.io/projects/neruda][redmine instance]].
|
8
|
+
|
6
9
|
* Install
|
7
10
|
|
8
11
|
These installation instructions use [[https://rvm.io][rvm]] as ruby provider. If you want to
|
9
12
|
use rbenv or your system ruby, please refer to their specific
|
10
|
-
documentation to know how to install ruby 2.4
|
13
|
+
documentation to know how to install ruby 2.4.
|
11
14
|
|
12
15
|
First we need to upgrade rvm (always do that from time to time):
|
13
16
|
|
@@ -20,9 +23,7 @@ Then the installation itself:
|
|
20
23
|
|
21
24
|
#+begin_src shell
|
22
25
|
$ mkdir mysite
|
23
|
-
$ rvm use ruby-2.4.1
|
24
|
-
$ rvm gemset create neruda
|
25
|
-
$ rvm gemset use neruda
|
26
|
+
$ rvm use ruby-2.4.1@neruda --create
|
26
27
|
$ gem install neruda
|
27
28
|
#+end_src
|
28
29
|
|
@@ -30,6 +31,7 @@ Finally, you need to configure it to your needs.
|
|
30
31
|
|
31
32
|
#+begin_src shell
|
32
33
|
$ pablo init
|
34
|
+
$ bundle install
|
33
35
|
#+end_src
|
34
36
|
|
35
37
|
* Running it
|
@@ -49,7 +51,56 @@ $ APP_ENV=production pablo start
|
|
49
51
|
To stop it, just enter =ctrl+C= if you are in development mode or enter
|
50
52
|
=pablo stop= in production mode.
|
51
53
|
|
52
|
-
|
54
|
+
* Pablo command
|
55
|
+
|
56
|
+
In order to manage you Neruda installation, this gem provides a little
|
57
|
+
helper called =pablo=. You already used it to =init=, =start= and =stop=
|
58
|
+
your local installation. It can do a little more.
|
59
|
+
|
60
|
+
** New
|
61
|
+
|
62
|
+
=pablo new [article title]= will open your favorite text editor to let
|
63
|
+
you write a new chapter to your book.
|
64
|
+
|
65
|
+
If you don't provide a title to the command, =pablo= will ask you for
|
66
|
+
one before launching your editor.
|
67
|
+
|
68
|
+
If you don't have configured the =EDITOR= or =VISUAL= environnement
|
69
|
+
variable, =pablo= will default to Gnu Emacs.
|
70
|
+
|
71
|
+
** Compile
|
72
|
+
|
73
|
+
=pablo compile= will first convert your orphaned org files (the ones
|
74
|
+
without a corresponding epub file), then producing the global epub book,
|
75
|
+
made with all your chapters.
|
76
|
+
|
77
|
+
** Capify
|
78
|
+
|
79
|
+
=pablo capify= will add the correct references to Neruda rake tasks in
|
80
|
+
your =Capfile=, what will allow you to call them as part of your
|
81
|
+
deployment workflow.
|
82
|
+
|
83
|
+
You can add the =chapters:sync= task:
|
84
|
+
|
85
|
+
#+begin_src ruby
|
86
|
+
after 'deploy:finishing', 'chapters:sync'
|
87
|
+
#+end_src
|
88
|
+
|
89
|
+
This task depends on all the following. Or you can just select a bunch
|
90
|
+
of them:
|
91
|
+
|
92
|
+
#+begin_src ruby
|
93
|
+
after 'deploy:finishing', 'chapters:build_epubs'
|
94
|
+
after 'deploy:finishing', 'chapters:upload_epubs'
|
95
|
+
after 'deploy:finishing', 'chapters:upload_book'
|
96
|
+
after 'deploy:finishing', 'chapters:purge:remote'
|
97
|
+
#+end_src
|
98
|
+
|
99
|
+
Don't forget to restart the remote sinatra server:
|
100
|
+
|
101
|
+
#+begin_src ruby
|
102
|
+
after 'deploy:finished', 'sinatra:restart:remote'
|
103
|
+
#+end_src
|
53
104
|
|
54
105
|
* Known issues
|
55
106
|
|
data/bin/pablo
CHANGED
@@ -1,33 +1,36 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# coding: utf-8
|
3
|
+
# frozen_string_literal: true
|
2
4
|
|
3
5
|
require 'yaml'
|
6
|
+
require 'rainbow'
|
4
7
|
require 'fileutils'
|
5
8
|
|
6
9
|
def help
|
7
10
|
unless File.exist? 'config/config.yml'
|
8
|
-
STDERR.puts 'Please init your website:
|
11
|
+
STDERR.puts 'Please init your website: ' +
|
12
|
+
Rainbow('pablo init').yellow
|
9
13
|
exit 1
|
10
14
|
end
|
11
15
|
|
12
|
-
options = ['start', 'stop', 'new']
|
16
|
+
options = ['start', 'stop', 'new', 'compile']
|
13
17
|
options << 'capify' if File.exist? 'Capfile'
|
14
18
|
|
15
|
-
STDERR.puts "pablo [ #{options.join(' | ')} ]"
|
16
|
-
exit 1
|
19
|
+
STDERR.puts 'Usage: ' + Rainbow("pablo [ #{options.join(' | ')} ]").yellow
|
17
20
|
end
|
18
21
|
|
19
22
|
def capify
|
20
23
|
unless File.exist? 'Capfile'
|
21
|
-
STDERR.puts 'Capfile does not exist.
|
24
|
+
STDERR.puts Rainbow('ERROR: Capfile does not exist.').red
|
22
25
|
exit 1
|
23
26
|
end
|
24
27
|
|
25
28
|
capfile = File.new('Capfile', 'a')
|
26
|
-
capfile.write
|
27
|
-
neruda_spec = Gem::Specification.find_by_name 'neruda'
|
28
|
-
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
29
|
-
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/capistrano/*.rake").each { |r| import r }
|
30
|
-
EOF
|
29
|
+
capfile.write <<~EOF
|
30
|
+
neruda_spec = Gem::Specification.find_by_name 'neruda'
|
31
|
+
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
32
|
+
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/capistrano/*.rake").each { |r| import r }
|
33
|
+
EOF
|
31
34
|
end
|
32
35
|
|
33
36
|
def _init_path
|
@@ -78,20 +81,60 @@ def _init_rackup
|
|
78
81
|
end
|
79
82
|
|
80
83
|
return if File.exist? 'config.ru'
|
81
|
-
rackup_conf =
|
82
|
-
# frozen_string_literal: true
|
84
|
+
rackup_conf = <<~EOF
|
85
|
+
# frozen_string_literal: true
|
83
86
|
|
84
|
-
require 'neruda'
|
85
|
-
run Neruda::App
|
86
|
-
EOF
|
87
|
+
require 'neruda'
|
88
|
+
run Neruda::App
|
89
|
+
EOF
|
87
90
|
IO.write('config.ru', rackup_conf)
|
88
91
|
end
|
89
92
|
|
93
|
+
def _init_bundler
|
94
|
+
# print 'Do you want to use [o]rg files, [m]arkdown files or [b]oth' \
|
95
|
+
# ' (default is org): '
|
96
|
+
# markup = STDIN.gets.strip.downcase
|
97
|
+
# if markup == 'm'
|
98
|
+
# markup_gem = 'gem \'kramdown\''
|
99
|
+
# elsif markup == 'b'
|
100
|
+
# markup_gem = "gem 'kramdown'\ngem 'org-ruby'"
|
101
|
+
# else
|
102
|
+
# markup_gem = 'gem \'org-ruby\''
|
103
|
+
# end
|
104
|
+
markup_gem = 'gem \'org-ruby\''
|
105
|
+
|
106
|
+
gemfile = <<~EOF
|
107
|
+
# frozen_string_literal: true
|
108
|
+
|
109
|
+
source 'https://rubygems.org'
|
110
|
+
|
111
|
+
gem 'neruda'
|
112
|
+
#{markup_gem}
|
113
|
+
|
114
|
+
group :development do
|
115
|
+
gem 'capistrano'
|
116
|
+
gem 'capistrano-bundler'
|
117
|
+
gem 'capistrano-rvm'
|
118
|
+
gem 'rubocop'
|
119
|
+
end
|
120
|
+
EOF
|
121
|
+
IO.write('Gemfile', gemfile)
|
122
|
+
end
|
123
|
+
|
90
124
|
def init
|
125
|
+
puts Rainbow('Creating main folders…').green
|
91
126
|
_init_path
|
127
|
+
puts Rainbow('Populating config file…').green
|
92
128
|
_init_config
|
129
|
+
puts Rainbow('Copying template files…').green
|
93
130
|
_init_assets
|
131
|
+
puts Rainbow('Installing rake and bundler files…').green
|
94
132
|
_init_rackup
|
133
|
+
_init_bundler
|
134
|
+
puts Rainbow('Neruda has been successfully installed.').green
|
135
|
+
puts ''
|
136
|
+
puts 'To complete this installation, you must now run: ' +
|
137
|
+
Rainbow('bundle install').yellow
|
95
138
|
end
|
96
139
|
|
97
140
|
def create_new(title)
|
@@ -103,18 +146,17 @@ def create_new(title)
|
|
103
146
|
|
104
147
|
filename = "private/orgs/#{filename}.org"
|
105
148
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
#+title: #{title}
|
110
|
-
#+date: <#{Date.today.strftime('%Y-%m-%d %a.')}>
|
111
|
-
#+author: #{config['author']}
|
149
|
+
FileUtils.mkdir_p 'private/orgs' unless Dir.exist? 'private/orgs'
|
150
|
+
config = YAML.load_file('config/config.yml')
|
151
|
+
IO.write filename, <<~EOF
|
152
|
+
#+title: #{title}
|
153
|
+
#+date: <#{Date.today.strftime('%Y-%m-%d %a.')}>
|
154
|
+
#+author: #{config['author']}
|
112
155
|
|
113
156
|
|
114
|
-
EOF
|
115
|
-
end
|
157
|
+
EOF
|
116
158
|
|
117
|
-
editor = ENV['EDITOR'] || 'emacs'
|
159
|
+
editor = ENV['EDITOR'] || ENV['VISUAL'] || 'emacs'
|
118
160
|
exec editor, filename
|
119
161
|
end
|
120
162
|
|
@@ -125,16 +167,18 @@ elsif ARGV[0] == 'capify'
|
|
125
167
|
capify
|
126
168
|
|
127
169
|
elsif ['start', 'run'].include?(ARGV[0])
|
128
|
-
puts '
|
129
|
-
|
130
|
-
|
131
|
-
exec 'rake', 'sinatra:start'
|
170
|
+
puts Rainbow('bundle exec rake sinatra:start').green
|
171
|
+
system 'bundle', 'exec', 'rake', 'sinatra:start'
|
132
172
|
|
133
173
|
elsif ARGV[0] == 'stop'
|
134
|
-
puts '
|
135
|
-
|
136
|
-
|
137
|
-
|
174
|
+
puts Rainbow('bundle exec rake sinatra:stop').green
|
175
|
+
system 'bundle', 'exec', 'rake', 'sinatra:stop'
|
176
|
+
|
177
|
+
elsif ARGV[0] == 'compile'
|
178
|
+
puts Rainbow('bundle exec rake chapters:build_epubs').green
|
179
|
+
system 'bundle', 'exec', 'rake', 'chapters:build_epubs'
|
180
|
+
puts Rainbow('bundle exec rake chapters:make_book').green
|
181
|
+
system 'bundle', 'exec', 'rake', 'chapters:make_book'
|
138
182
|
|
139
183
|
elsif ARGV[0] == 'new'
|
140
184
|
if ARGV[1].nil?
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'yaml'
|
2
4
|
|
3
5
|
namespace :chapters do
|
4
|
-
|
5
6
|
desc 'Upload epub files listed in tmp/epub_to_upload.yml'
|
6
7
|
task :upload_epubs do
|
7
8
|
next unless File.exist?('tmp/epub_to_upload.yml')
|
@@ -32,7 +33,12 @@ namespace :chapters do
|
|
32
33
|
final_org = neruda_config['book_filename'] || 'all'
|
33
34
|
on roles(:app) do
|
34
35
|
within release_path do
|
35
|
-
|
36
|
+
begin
|
37
|
+
epub_files = capture :ls, '-1', 'private/epubs/*.epub'
|
38
|
+
rescue SSHKit::Command::Failed
|
39
|
+
warn 'No epub files found. Aborting.'
|
40
|
+
next
|
41
|
+
end
|
36
42
|
epub_files.each_line do |filename|
|
37
43
|
filename.delete!("\n")
|
38
44
|
file_radix = File.basename(filename, '.epub')
|
@@ -46,4 +52,9 @@ namespace :chapters do
|
|
46
52
|
end
|
47
53
|
end
|
48
54
|
end
|
55
|
+
|
56
|
+
desc 'Execute in one call the following: :build_epubs,' \
|
57
|
+
':upload_epubs, :upload_book, :purge:remote'
|
58
|
+
task sync: ['chapters:build_epubs', 'chapters:upload_epubs',
|
59
|
+
'chapters:upload_book', 'chapters:purge:remote']
|
49
60
|
end
|
data/lib/tasks/chapters.rake
CHANGED
@@ -45,7 +45,7 @@ namespace :chapters do
|
|
45
45
|
next if file_radix == 'index'
|
46
46
|
epub_file = "private/epubs/#{file_radix}.epub"
|
47
47
|
epub_to_upload << epub_file
|
48
|
-
|
48
|
+
system 'pandoc', '-S', "-o #{epub_file}", filename
|
49
49
|
end
|
50
50
|
next if epub_to_upload.empty?
|
51
51
|
IO.write('tmp/epub_to_upload.yml', epub_to_upload.to_yaml)
|
data/lib/tasks/sinatra.rake
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
namespace :sinatra do
|
2
4
|
desc 'Stop the underlaying sinatra application'
|
3
5
|
task :stop do
|
@@ -15,7 +17,7 @@ namespace :sinatra do
|
|
15
17
|
loc_env = ENV['APP_ENV'] || 'development'
|
16
18
|
cmd = ['rackup', "-E #{loc_env}", '-P', 'tmp/pids/neruda.pid']
|
17
19
|
cmd << '-D' if loc_env == 'production'
|
18
|
-
|
20
|
+
system cmd.join(' ')
|
19
21
|
end
|
20
22
|
|
21
23
|
desc 'Restart local sinatra server'
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neruda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Deparis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rainbow
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.2'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: org-ruby
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +94,9 @@ dependencies:
|
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '2.0'
|
69
|
-
description:
|
97
|
+
description: |
|
98
|
+
A simplistic way to publish a book online.
|
99
|
+
Write your org files, we take care of the rest.
|
70
100
|
email: etienne@depar.is
|
71
101
|
executables:
|
72
102
|
- pablo
|
@@ -90,7 +120,7 @@ files:
|
|
90
120
|
- lib/tasks/capistrano/sinatra.rake
|
91
121
|
- lib/tasks/chapters.rake
|
92
122
|
- lib/tasks/sinatra.rake
|
93
|
-
homepage: https://git.deparis.io/neruda/
|
123
|
+
homepage: https://git.deparis.io/neruda/about/
|
94
124
|
licenses:
|
95
125
|
- WTFPL
|
96
126
|
metadata: {}
|
@@ -102,7 +132,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
132
|
requirements:
|
103
133
|
- - ">="
|
104
134
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
135
|
+
version: '2.4'
|
106
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
137
|
requirements:
|
108
138
|
- - ">="
|