zine 0.9.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1d0c74eb3ad2448eca853a98779f43fc8536e39e
4
- data.tar.gz: 5bfbce5f7b26a6289aba3b652b4c13c32e7d1c9a
2
+ SHA256:
3
+ metadata.gz: ec6708f393eb728e1c5683a092f37ee2008c41c292105be0587c89045f9b267a
4
+ data.tar.gz: c33be8fdc0d2b17ea341cd532827493491d41c665ffb21f0505dab21adfeaf27
5
5
  SHA512:
6
- metadata.gz: 2316b8ac4c8c8dd10fb6761ec77de852dda18dcced1d5b3ef0862ef2e01446ee04b65e32583e5e0495a43f22674ac278a8c4e1f776ab8f565fdbefd347bfecc2
7
- data.tar.gz: d63c8be31dc262b119bb536999c6ccfc3f0a85b3008c72ede9d873625c1495ebb210062df521e66f2b65c9ca27987edf6937441650cf79e5a3dabb7ebe5efb5e
6
+ metadata.gz: dd3359cbf10d141396f05ab17489eb44d80ff1bd6830dac029e8469a5d0a7d503d332a4892191f1240cf42813657ad10f90afed54ca19106e679710915196f9f
7
+ data.tar.gz: 51769bedd049eac1a94a9e94cd4c0114303e847861f7cfb38044269d3aa1f05a538c62cdb3e0289a72f1835247d64236849e36bb33586bf963cc3d4d6f312ec5
@@ -117,3 +117,55 @@
117
117
 
118
118
  - a bug in 'zine notice' involving full & partial paths that duplicated the post to notice on the history page, fixed
119
119
  - minor code clean-up in cli.rb and server.rb
120
+
121
+ # 0.10.0, November 7, 2018
122
+
123
+ - dependency version bumps
124
+
125
+ # 0.11.0, November 7, 2018
126
+
127
+ - fixed a bug where String#split would break apart markdown files on tables as well as at the metadata/markdown boundary
128
+
129
+ # 0.12.0 - never pushed, used up until April 25, 2019
130
+
131
+ - added (then removed) Mastodon from the list of contacts, changed the styling a few times, neglected to publish
132
+
133
+ # 0.13.0 - lucky 13 - May 26, 2019
134
+
135
+ - added some of the style changes that survived from v12, eg moved social media to the footer
136
+ - added a (permissive as they come) robots.txt file
137
+ - dependency updates, kramdown split into kramdown & kramdown-parser-gfm which seems to be slower :-(
138
+ - bumped the required version of Ruby to 2.3 (for bundler, kramdown, etc)
139
+ - dropped the highline gem (it was only used to get the one input, originally there was going to be more)
140
+ - minor readme updates
141
+ - placeholder site, mostly in case there's ever an app: https://zine.dev
142
+
143
+ # 0.14.0 - May 27, 2019
144
+
145
+ - added an AWS S3 uploader
146
+ - added AWS CloudFront invalidation
147
+ - added zine.dev to the footer template
148
+ - bug fix - catch carriage returns as default yes answers to the upload? question
149
+
150
+ # 0.15.0 - May 26, 2020
151
+
152
+ - dependency version bumps, year bump in template
153
+ - replaced zine.dev with https://mikekreuzer.com/projects/zine/
154
+ - other minor refactoring & doc rewrites
155
+
156
+ TO DO
157
+
158
+ - add canonical links to page headers, means the build order needs to change...
159
+ - generate sitemap.xml
160
+ - fix the SFTP error from 0.7/0.8, also likely applies to S3
161
+ - make sure the server's killed on errors (eg if no credentials) so can run it again later without a port conflict
162
+ - tests, lots of tests
163
+
164
+ MAY DO
165
+
166
+ - concurrent-ruby gem
167
+ - migration scripts from eg Jekyll?
168
+ - Apple News
169
+ - much refactoring, frozen_string_literal, split monster classes, etc
170
+ - replace thor with optparse
171
+ - an app... maybe
data/README.md CHANGED
@@ -1,40 +1,35 @@
1
1
  # zine
2
- Yet another blog aware static site generator.
3
2
 
4
- ## Warning: pre-release code
3
+ [![Gem Version](https://badge.fury.io/rb/zine.svg)](https://badge.fury.io/rb/zine)
5
4
 
6
- These are the very early days of zine, expect breaking changes.
7
-
8
- ## Why yet another static blog engine?
9
-
10
- Despite the [proliferation in these things][engine_list] (450!) I still find it more comfortable to use my own tools.
5
+ Zine is an open source, command line, blog-aware, static website generator.
11
6
 
12
7
  Distinguishing features include:
13
8
 
14
9
  - ERB templates
15
10
  - Sass stylesheets
16
11
  - fast incremental builds
17
- - SFTP file uploads
12
+ - a choice of AWS S3, GitHub & SFTP file uploaders
18
13
 
19
- Presented here in the hope it's of use to someone else too.
14
+ ## How do I get it?
20
15
 
21
- ## Installation
16
+ Zine is a Ruby Gem, so if you have Ruby on your machine (it comes installed standard on a Mac), open Terminal & type
22
17
 
23
- Install the gem.
18
+ ````bash
19
+ gem install zine
20
+ ````
24
21
 
25
- ```shell
26
- $ gem install zine
27
- ```
22
+ And you're away.
28
23
 
29
- To generate a new site scaffold, cd to a new folder and:
24
+ To generate a new scaffold site, cd to a new directory and:
30
25
 
31
26
  ```shell
32
27
  $ zine site
33
28
  ```
34
29
 
35
- Then update your site's name, your name & so on in zine.yaml. Pay particular care to the Upload section, if you want to use Zine as an SFTP uploader to deploy files that've changed, you'll need to edit this section to include your remote server's details, as well as the path to a YAML file with your username & password (nil for that if you're using SSH without a password).
30
+ Then update your site's name, your name & so on in zine.yaml. Pay particular care to the Upload section, if you want to use Zine to deploy files you've changed, you'll need to edit this section to include your remote server's details, including the path to a YAML file with your credentials.
36
31
 
37
- ## Day to day usage
32
+ ## Day to day use
38
33
 
39
34
  To set up a new blog post:
40
35
 
@@ -42,15 +37,25 @@ To set up a new blog post:
42
37
  $ zine post 'Your chosen title'
43
38
  ```
44
39
 
45
- Your new post will have some fields set up in the YAML front matter, feel free to edit them too. Markdown files you create outside of the posts folder will be rendered into HTML in the same relative position in the build folder.
40
+ Your new post will have some fields set up in the YAML front matter, feel free to edit them too.
41
+
42
+ You can also create other Markdown files outside of the posts folder, those will be rendered into HTML in the same relative position in the build folder. That's how the project, about etc pages on my site are made for example.
46
43
 
47
- Once you're done writing, build your new site:
44
+ Type zine build before you start writing to serve up a local copy of your site that you can refresh to see what the build version will look like.
48
45
 
49
46
  ```shell
50
- $ zine build # or zine force
47
+ $ zine build
51
48
  ```
52
49
 
53
- Build only writes files for things that have changed while it's running, so the first time you build your site you should use force -- force writes all of the files (& so also uploads them all too if you've set up uploads).
50
+ or
51
+
52
+ ```shell
53
+ $ zine force
54
+ ```
55
+
56
+ Build will only watch for the things that change while it's running, so the first time you build your site you should use force -- force writes all of the files (& so also uploads them all too if you've set up uploads).
57
+
58
+ Control-C in Terminal when you're done.
54
59
 
55
60
  ## Design & development
56
61
 
@@ -74,16 +79,11 @@ Commands:
74
79
  zine version # Show the version number
75
80
  ```
76
81
 
77
- ### Up next
78
-
79
- This is only a first cut at this gem, the stuff I considered a (barely) minimum viable product. Up next are:
82
+ ## Links
80
83
 
81
- - migration scripts from eg Jekyll? Maybe.
82
- - Apple News
83
- - much refactoring
84
- - docs
85
- - tests, lots of tests
86
- - and a few other things
84
+ - [Github][github] - show me the code
85
+ - [Ruby gems][rubygems] - show me the Ruby details (pick up some gems while you're there)
86
+ - [Project site][mk] - Zine's home on the web
87
87
 
88
88
  ## Contributing
89
89
 
@@ -92,11 +92,13 @@ Yes please. Bug reports and pull requests are welcome on GitHub at https://githu
92
92
  ## Tests
93
93
 
94
94
  ```shell
95
- bundle exec rspec spec # or your alias for that
95
+ rake
96
96
  ```
97
97
 
98
98
  ## License
99
99
 
100
100
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
101
101
 
102
- [engine_list]: https://staticsitegenerators.net
102
+ [github]: https://github.com/mikekreuzer/zine
103
+ [mk]: https://mikekreuzer/projects/zine/
104
+ [rubygems]: https://rubygems.org/gems/zine
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'erb'
2
4
  require 'rainbow'
3
5
  require 'zine/page'
@@ -70,7 +72,7 @@ module Zine
70
72
  end
71
73
 
72
74
  # currently used to say yes on a script's behalf - in #notice
73
- class MockHighlineYes
75
+ class MockYes
74
76
  def ask(_question)
75
77
  'Y'
76
78
  end
@@ -102,11 +104,12 @@ module Zine
102
104
  # preview posts_and_guard -- no preview needed...
103
105
  return if @options['upload']['method'] == 'none' ||
104
106
  (guard.delete_array.empty? && guard.upload_array.empty?)
105
- uploader = Zine::Upload.new @options['directories']['build'],
107
+
108
+ uploader = Zine::Upload.new(@options['directories']['build'],
106
109
  @options['upload'],
107
110
  guard.delete_array,
108
- guard.upload_array
109
- uploader.upload_decision MockHighlineYes
111
+ guard.upload_array)
112
+ uploader.upload_decision MockYes
110
113
  end
111
114
 
112
115
  def write_markdown(default_name, src_dir, file)
@@ -158,18 +161,18 @@ module Zine
158
161
  end
159
162
 
160
163
  def init_options
161
- @options ||= begin
162
- YAML.safe_load File.open('zine.yaml')
163
- rescue ArgumentError => err
164
- puts Rainbow("Could not parse YAML options: #{err.message}").red
165
- end
164
+ @options ||= YAML.safe_load File.open('zine.yaml')
165
+ rescue ArgumentError => e
166
+ puts Rainbow("Could not parse YAML options: #{e.message}").red
166
167
  end
167
168
 
168
169
  def init_templates
170
+ Encoding.default_external = 'UTF-8'
169
171
  tem_array = Dir[File.join(@options['directories']['templates'], '*.erb')]
170
172
  tem_array.each do |tem|
171
173
  @templates_by_name.merge!(File.basename(tem, '.*') =>
172
- ERB.new(File.read(tem), 0, '-'))
174
+ ERB.new(File.read(tem),
175
+ trim_mode: '-'))
173
176
  end
174
177
  end
175
178
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thor'
2
4
  require 'rainbow'
3
5
  require 'time'
@@ -16,6 +18,10 @@ module Zine
16
18
  def init_site
17
19
  @the_site ||= Zine::Site.new
18
20
  end
21
+
22
+ def options
23
+ @the_site.options
24
+ end
19
25
  end
20
26
 
21
27
  desc 'build', 'Build the site'
@@ -47,7 +53,7 @@ module Zine
47
53
  desc 'nuke', 'Delete the build folder'
48
54
  def nuke
49
55
  init_site
50
- FileUtils.remove_dir @the_site.options['directories']['build'],
56
+ FileUtils.remove_dir options['directories']['build'],
51
57
  force: true
52
58
  puts Rainbow('Site nuked. It\'s the only way to be sure.').green
53
59
  end
@@ -55,7 +61,6 @@ module Zine
55
61
  desc 'post TITLE', 'Create the file for a new blog post, titled TITLE'
56
62
  def post(name)
57
63
  init_site
58
- options = @the_site.options
59
64
  option_dir = options['directories']
60
65
  Zine::CLI.source_root option_dir['templates']
61
66
  @date = DateTime.now
@@ -77,7 +82,7 @@ module Zine
77
82
  desc 'style', 'Build the site\'s stylesheet'
78
83
  def style
79
84
  init_site
80
- style = Zine::Style.new(@the_site.options['directories'])
85
+ style = Zine::Style.new(options['directories'])
81
86
  style.process(File)
82
87
  puts Rainbow('Stylesheet rendered').green
83
88
  end
@@ -2,6 +2,7 @@ require 'erb'
2
2
  require 'date'
3
3
  require 'htmlcompressor'
4
4
  require 'kramdown'
5
+ require 'kramdown-parser-gfm'
5
6
  require 'pathname'
6
7
  require 'rainbow'
7
8
  require 'yaml'
@@ -39,7 +40,8 @@ module Zine
39
40
  site_URL: site['site_URL'],
40
41
  tags: slugify_tags(front_matter['tags']),
41
42
  title: html_escape(front_matter['title']),
42
- twitter_name: site['twitter_name'] }
43
+ twitter_name: site['twitter_name'],
44
+ uri: '' } # uri only generated for posts, and not until after markdown, TO DO
43
45
  end
44
46
 
45
47
  def public_binding
@@ -66,7 +68,7 @@ module Zine
66
68
 
67
69
  def initialize(md_file_name, dest, templates, site_options)
68
70
  @source_file = md_file_name
69
- file_parts = File.open(md_file_name, 'r').read.split('---')
71
+ file_parts = File.open(md_file_name, 'r').read.split('---', 3)
70
72
  @formatted_data = FormattedData.new(parse_yaml(file_parts[1],
71
73
  md_file_name),
72
74
  site_options)
@@ -104,7 +106,6 @@ module Zine
104
106
  input: 'GFM',
105
107
  auto_ids: false,
106
108
  smart_quotes: %w[apos apos quot quot],
107
- syntax_highlighter: 'rouge'
108
109
  ).to_html
109
110
  @raw_text = nil
110
111
  end
@@ -5,7 +5,7 @@ module Zine
5
5
  class Post < Page
6
6
  def initialize(md_file_name, templates, site_options)
7
7
  @source_file = md_file_name
8
- file_parts = File.open(md_file_name, 'r').read.split('---')
8
+ file_parts = File.open(md_file_name, 'r').read.split('---', 3)
9
9
  @formatted_data = FormattedData.new(parse_yaml(file_parts[1],
10
10
  md_file_name),
11
11
  site_options)
@@ -0,0 +1,10 @@
1
+ module Zine
2
+ # Returns an answer from the CLI
3
+ class Query
4
+ def call(question)
5
+ puts question
6
+ result = $stdin.gets.chomp
7
+ result == '' ? 'Y' : result
8
+ end
9
+ end
10
+ end
@@ -1,4 +1,4 @@
1
- require 'highline'
1
+ require 'zine/query'
2
2
  require 'rainbow'
3
3
  require 'rack'
4
4
  require 'thin'
@@ -67,7 +67,7 @@ module Zine
67
67
  (@delete_array.empty? && @upload_array.empty?)
68
68
  uploader = Zine::Upload.new rel_path_build, upload_options,
69
69
  @delete_array, @upload_array
70
- uploader.upload_decision HighLine
70
+ uploader.upload_decision Query
71
71
  end
72
72
  end
73
73
  end
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -1 +1 @@
1
- *{margin:0;padding:0}html,body{height:100%}body{background-color:#fff;font-family:GillSansRegular,"Gill Sans MT","Gill Sans","Century Gothic",Calibri,"Trebuchet MS",sans-serif;line-height:1.618;color:#333;text-align:center;font-weight:300}#skiptocontent{height:1px;width:1px;position:absolute;overflow:hidden;top:-10px}h1,h2,h3,h4,h5,h6{color:#333;letter-spacing:0.1em}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:#414f7c;text-decoration:none}h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:#212721}h1{font-weight:300;font-size:2.618em;margin:1.809em 0 0.809em}h2{font-weight:300;font-size:1.618em;margin:1.809em 0 0.809em}h3,h4,h5,h6{font-weight:400;font-size:1em;margin:1.809em 0 0.809em}p,li{margin:1em 0}ul{margin:0}a{color:#414f7c}a:hover{color:#212721}section{margin-bottom:1.618em}section>section{margin-bottom:3.236em}strong{font-weight:400}body>header{width:43em;text-align:center;margin:0 auto 0}body>header a{text-decoration:none;margin-left:0.5em;margin-right:0.5em}body>header,body>main,body>footer{display:block}body>header a{color:#414f7c}body>header a:hover{color:#212721}body>header a.extra{color:#414f7c;margin-left:1em}body>header a.extra:hover{color:#212721}body>header nav ul li{display:inline;list-style:none}.button{width:30px;height:30px;display:inline-block;background-size:100%;text-indent:-999em;text-align:left;margin:20px}.twitter{background:url("https://mikekreuzer.com/assets/webicon-twitter-m.png");background-image:url("https://mikekreuzer.com/assets/webicon-twitter.svg"),none}.rss{background:url("https://mikekreuzer.com/assets/webicon-rss-m.png");background-image:url("https://mikekreuzer.com/assets/webicon-rss.svg"),none}main{text-align:left;width:43em;margin:3em auto 2em}main li{margin-left:2.618em}.meta{color:#667}footer{width:43em;color:#667;border-top:4px solid #ddd;margin:3em auto 2em;overflow:hidden}footer .column{float:left;width:33%;text-align:left}footer .column ul{list-style:none}footer .column a,.tags a{color:#414f7c;text-decoration:none}footer .column a:hover,.tags a:hover{color:#212721;text-decoration:underline}.tags ul li{list-style:none;display:inline;font-variant:small-caps;font-size:1.2em}.archive a{text-decoration:none}ul.archive,ul.archive ul{margin-left:0}ul.archive li,ul.archive ul li{list-style:none;margin-left:0}.post pre{border:1px solid #ddd;background-color:#fff;padding:0 .4em}p.date{color:#667}pre{background-color:#eee;padding:1em;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}code{font-family:Consolas,Menlo,Monaco,"Lucida Console","Courier New",monospace,serif;font-size:0.8em}blockquote{margin:2em 2em 2em 1em;padding:0 .75em 0 1.25em;border-left:2px solid #ddd;border-right:0px solid #ddd}@media all and (max-width: 736px){body>header,main,footer{width:86%;margin:0 auto 0;padding:12px 24px 12px}p{margin-bottom:2em}.button{width:50px;height:50px;margin:20px}footer .column{width:100%}}
1
+ *{margin:0;padding:0}html,body{height:100%}body{background-color:#fff;font-family:GillSansRegular,"Gill Sans MT","Gill Sans","Century Gothic",Calibri,"Trebuchet MS",sans-serif;line-height:1.618;color:#333;text-align:center;font-weight:300}#skiptocontent{height:1px;width:1px;position:absolute;overflow:hidden;top:-10px}h1,h2,h3,h4,h5,h6{color:#333;letter-spacing:0.1em}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:#414f7c;text-decoration:none}h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:#212721}h1{font-weight:300;font-size:2.618em;margin:1.809em 0 0.809em}h2{font-weight:300;font-size:1.618em;margin:1.809em 0 0.809em}h3,h4,h5,h6{font-weight:400;font-size:1em;margin:1.809em 0 0.809em}p,li{margin:1em 0}ul{margin:0}a{color:#414f7c}a:hover{color:#212721}section{margin-bottom:1.618em}section>section{margin-bottom:3.236em}strong{font-weight:400}body>header{width:43em;text-align:center;margin:0 auto 0}body>header a{text-decoration:none;margin-left:0.5em;margin-right:0.5em}body>header,body>main,body>footer{display:block}body>header a{color:#414f7c}body>header a:hover{color:#212721}body>header a.extra{color:#414f7c;margin-left:1em}body>header a.extra:hover{color:#212721}body>header nav ul li{display:inline;list-style:none}.contact-list span{margin-left:40px}.button{width:30px;height:30px;display:inline-block;background-size:100%;text-align:left}.twitter{background:url("/assets/webicon-twitter-m.png");background-image:url("/assets/webicon-twitter.svg"),none}.rss{background:url("/assets/webicon-rss-m.png");background-image:url("/assets/webicon-rss.svg"),none}main{text-align:left;width:43em;margin:3em auto 2em}main li{margin-left:2.618em}.meta{color:#667}footer{width:43em;color:#667;border-top:4px solid #ddd;margin:3em auto 2em;overflow:hidden}footer .column{float:left;padding:1px;text-align:left;width:32%}footer .column ul{list-style:none}footer .column a,.tags a{color:#414f7c;text-decoration:none}footer .column a:hover,.tags a:hover{color:#212721;text-decoration:underline}.tags ul li{list-style:none;display:inline;font-variant:small-caps;font-size:1.2em}.archive a{text-decoration:none}ul.archive,ul.archive ul{margin-left:0}ul.archive li,ul.archive ul li{list-style:none;margin-left:0}.post pre{border:1px solid #ddd;background-color:#fff;padding:0 .4em}p.date{color:#667}pre{background-color:#eee;padding:1em;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}code{font-family:Consolas,Menlo,Monaco,"Lucida Console","Courier New",monospace,serif;font-size:0.8em}table{border-collapse:collapse;margin:0 auto}th,td{border:solid #ddd 1px;padding:0.5em 1.5em}blockquote{margin:2em 2em 2em 1em;padding:0 .75em 0 1.25em;border-left:2px solid #ddd;border-right:0px solid #ddd}.chart-png{margin:2em 0 2em;width:90%}.logo-png{float:left;margin-bottom:18px;margin-right:24px}@media all and (max-width: 736px){body>header,main,footer{width:86%;margin:0 auto 0;padding:12px 24px 12px}p{margin-bottom:2em}footer .column{width:100%}}
@@ -19,8 +19,6 @@ $desktopWidth: 43em;
19
19
  $lightWeight: 300;
20
20
  $heavyWeight: 400;
21
21
 
22
- $siteBaseURL: 'https:\/\/mikekreuzer.com';
23
-
24
22
  $regularFont: GillSansRegular, 'Gill Sans MT', 'Gill Sans', 'Century Gothic', Calibri, 'Trebuchet MS', sans-serif;
25
23
  $monoFont: Consolas, Menlo, Monaco, 'Lucida Console', 'Courier New', monospace, serif;
26
24
 
@@ -61,21 +59,21 @@ h1,h2,h3,h4,h5,h6 {
61
59
  }
62
60
 
63
61
  h1 {
64
- font-weight: $lightWeight;
65
- font-size: 2.618em;
66
- margin: 1.809em 0 0.809em;
62
+ font-weight: $lightWeight;
63
+ font-size: 2.618em;
64
+ margin: 1.809em 0 0.809em;
67
65
  }
68
66
 
69
67
  h2 {
70
- font-weight: $lightWeight;
71
- font-size: 1.618em;
72
- margin: 1.809em 0 0.809em;
68
+ font-weight: $lightWeight;
69
+ font-size: 1.618em;
70
+ margin: 1.809em 0 0.809em;
73
71
  }
74
72
 
75
73
  h3, h4, h5, h6 {
76
- font-weight: $heavyWeight;
77
- font-size: 1em;
78
- margin: 1.809em 0 0.809em;
74
+ font-weight: $heavyWeight;
75
+ font-size: 1em;
76
+ margin: 1.809em 0 0.809em;
79
77
  }
80
78
 
81
79
  p, li {
@@ -141,24 +139,26 @@ body > header nav ul li {
141
139
  list-style: none;
142
140
  }
143
141
 
142
+ .contact-list span {
143
+ margin-left: 40px;
144
+ }
145
+
144
146
  .button {
145
- width: 30px;
146
- height: 30px;
147
- display: inline-block;
148
- background-size: 100%;
149
- text-indent: -999em;
150
- text-align: left;
151
- margin: 20px;
147
+ width: 30px;
148
+ height: 30px;
149
+ display: inline-block;
150
+ background-size: 100%;
151
+ text-align: left;
152
152
  }
153
153
 
154
154
  .twitter {
155
- background: url($siteBaseURL + '/assets/webicon-twitter-m.png');
156
- background-image: url($siteBaseURL + '/assets/webicon-twitter.svg'), none;
155
+ background: url('/assets/webicon-twitter-m.png');
156
+ background-image: url('/assets/webicon-twitter.svg'), none;
157
157
  }
158
158
 
159
159
  .rss {
160
- background: url($siteBaseURL + '/assets/webicon-rss-m.png');
161
- background-image: url($siteBaseURL + '/assets/webicon-rss.svg'), none;
160
+ background: url('/assets/webicon-rss-m.png');
161
+ background-image: url('/assets/webicon-rss.svg'), none;
162
162
  }
163
163
 
164
164
  main {
@@ -185,8 +185,9 @@ footer {
185
185
 
186
186
  footer .column {
187
187
  float: left;
188
- width: 33%;
188
+ padding: 1px;
189
189
  text-align: left;
190
+ width: 32%;
190
191
  }
191
192
 
192
193
  footer .column ul { list-style: none; }
@@ -194,18 +195,18 @@ footer .column a, .tags a { color:$linkColour; text-decoration: none; }
194
195
  footer .column a:hover, .tags a:hover { color:$hoverColour; text-decoration: underline; }
195
196
 
196
197
  .tags ul li {
197
- list-style: none;
198
- display: inline;
199
- font-variant: small-caps;
200
- font-size:1.2em;
198
+ list-style: none;
199
+ display: inline;
200
+ font-variant: small-caps;
201
+ font-size:1.2em;
201
202
  }
202
203
 
203
204
  .archive a {
204
- text-decoration: none;
205
+ text-decoration: none;
205
206
  }
206
207
 
207
208
  ul.archive, ul.archive ul {
208
- margin-left: 0;
209
+ margin-left: 0;
209
210
  }
210
211
 
211
212
  ul.archive li, ul.archive ul li {
@@ -234,7 +235,7 @@ footer .rss img {
234
235
 
235
236
 
236
237
  p.date {
237
- color: $mediumGrey;
238
+ color: $mediumGrey;
238
239
  }
239
240
 
240
241
  /*.post ul, .post ol {
@@ -242,14 +243,14 @@ p.date {
242
243
  }*/
243
244
 
244
245
  pre {
245
- background-color: $codeBackgroundColour;
246
- padding: 1em;
247
- white-space: pre-wrap;
248
- /* why necessary */
249
- white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
250
- white-space: -pre-wrap; /* Opera 4-6 */
251
- white-space: -o-pre-wrap; /* Opera 7 */
252
- word-wrap: break-word;
246
+ background-color: $codeBackgroundColour;
247
+ padding: 1em;
248
+ white-space: pre-wrap;
249
+ /* why necessary */
250
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
251
+ white-space: -pre-wrap; /* Opera 4-6 */
252
+ white-space: -o-pre-wrap; /* Opera 7 */
253
+ word-wrap: break-word;
253
254
  }
254
255
 
255
256
  code {
@@ -268,6 +269,16 @@ code {
268
269
  background-color: $codeBackgroundColour;
269
270
  }*/
270
271
 
272
+ table {
273
+ border-collapse: collapse;
274
+ margin: 0 auto;
275
+ }
276
+
277
+ th, td {
278
+ border: solid $lightGrey 1px;
279
+ padding: 0.5em 1.5em;
280
+ }
281
+
271
282
  /* quotes */
272
283
  blockquote {
273
284
  margin: 2em 2em 2em 1em;
@@ -276,6 +287,17 @@ blockquote {
276
287
  border-right: 0px solid $borderColour;
277
288
  }
278
289
 
290
+ .chart-png {
291
+ margin: 2em 0 2em;
292
+ width:90%;
293
+ }
294
+
295
+ .logo-png {
296
+ float:left;
297
+ margin-bottom:18px;
298
+ margin-right: 24px;
299
+ }
300
+
279
301
  @media all and (max-width: 736px) {
280
302
  /* was max-device-width: 1242px */
281
303
  body > header, main, footer {
@@ -286,11 +308,11 @@ blockquote {
286
308
  p {
287
309
  margin-bottom:2em;
288
310
  }
289
- .button {
311
+ /*.button {
290
312
  width: 50px;
291
313
  height: 50px;
292
314
  margin: 20px;
293
- }
315
+ }*/
294
316
  footer .column {
295
317
  width: 100%;
296
318
  }
@@ -1,23 +1,26 @@
1
1
  <footer>
2
- <div class="column">
3
- <h3>Contact me</h3>
4
- <p>Twitter:&nbsp;<a href="https://twitter.com/<%= page[:twitter_name] %>">@<%= page[:twitter_name] %></a></p>
5
- </div>
6
- <div class="column">
7
- <h3>Me elsewhere</h3>
8
- <ul>
9
- <% for @link in page[:links_array] %>
10
- <li><a href="<%= @link['uri'] %>"><%= @link['name'] %></a></li>
11
- <% end %>
2
+ <div class="column">
3
+ <h3>Contact me</h3>
4
+ <ul class="contact-list">
5
+ <li><a href="https://twitter.com/<%= page[:twitter_name] %>" class="button twitter"><span>Twitter</span></a></li>
6
+ <li><a href="<%= page[:site_URL] %>/rss.xml" rel="home" type="application/rss+xml" class="button rss"><span>Subscribe</span></a></li>
12
7
  </ul>
13
- </div>
14
- <div class="column">
15
- <h3>The fine print</h3>
16
- <ul>
17
- <li>Built with <a href="https://github.com/mikekreuzer/zine">Zine</a></li>
18
- <li>&copy; 2017<span> <%= page[:site_author] %></span></li>
19
- </ul>
20
- </div>
8
+ </div>
9
+ <div class="column">
10
+ <h3>Me elsewhere</h3>
11
+ <ul>
12
+ <% for @link in page[:links_array] %>
13
+ <li><a href="<%= @link['uri'] %>"><%= @link['name'] %></a></li>
14
+ <% end %>
15
+ </ul>
16
+ </div>
17
+ <div class="column">
18
+ <h3>The fine print</h3>
19
+ <ul>
20
+ <li>Built with <a href="https://mikekreuzer.com/projects/zine/">Zine</a></li>
21
+ <li>&copy; 2020<span> <%= page[:site_author] %></span></li>
22
+ </ul>
23
+ </div>
21
24
  </footer>
22
- </body>
25
+ </body>
23
26
  </html>
@@ -6,8 +6,9 @@
6
6
  <meta name="description" content="<%= page[:site_description] %>">
7
7
  <title><%= page[:site_name] %> | <%= page[:title] %></title>
8
8
  <link rel="home" href="<%= page[:site_URL] %>/rss.xml" type="application/rss+xml" title="<%= page[:site_name] %>">
9
- <link rel="stylesheet" href="<%= page[:site_URL] %>/screen.css">
10
- <link rel="apple-touch-icon" href="<%= page[:site_URL] %>/apple-touch-icon.png">
9
+ <link rel="stylesheet" href="/screen.css">
10
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
11
+ <!--<link rel="canonical" href="<%= page[:uri] %>" />-->
11
12
  </head>
12
13
  <body>
13
14
  <div id="skiptocontent">
@@ -19,9 +20,10 @@
19
20
  <nav>
20
21
  <ul>
21
22
  <li><a href="<%= page[:site_URL] %>">Home</a></li>
22
- <li><a href="<%= page[:site_URL] %>/articles.html">Articles</a></li>
23
- <li><a href="<%= page[:site_URL] %>/about.html">About</a></li>
24
- </ul><a href="https://twitter.com/<%= page[:twitter_name] %>" class="button twitter">Argue with me on Twitter</a><a href="<%= page[:site_URL] %>/rss.xml" rel="home" type="application/rss+xml" class="button rss">RSS Feed</a>
23
+ <li><a href="/articles.html">Articles</a></li>
24
+ <li><a href="/tags/index.html">Tags</a></li>
25
+ <li><a href="/about.html">About</a></li>
26
+ </ul>
25
27
  </nav>
26
28
  </header>
27
29
  <a name="maincontent"></a>
@@ -33,8 +33,9 @@ templates:
33
33
  tag: tag
34
34
  tag_index: tag_index
35
35
  upload:
36
+ cloudfront_distrib: ID or ''
36
37
  credentials: /local/absolute/path/to/yaml/file/with/username/password/or/access_token
37
- host: 127.0.0.1
38
- method: none|github|sftp
38
+ host: eg 127.0.0.1, or for AWS region:bucket_name
39
+ method: none|aws|github|sftp
39
40
  path_or_repo: /remote/absolute/path/to/html|fullname/repo
40
41
  verbose: true
@@ -1,12 +1,12 @@
1
- require 'highline'
2
1
  require 'rainbow'
3
2
  require 'set'
4
3
  require 'zine'
4
+ require 'zine/uploader_aws'
5
5
  require 'zine/uploader_github'
6
6
  require 'zine/uploader_sftp'
7
7
 
8
8
  module Zine
9
- # Deploy changes to a remote host, via SFTP or using the GitHub Rest API
9
+ # Deploy changes to a remote host, via SFTP or using the AWS or GitHub API
10
10
  class Upload
11
11
  def initialize(build_dir, options, delete_file_array, upload_file_array)
12
12
  if options['method'] == 'none'
@@ -24,7 +24,7 @@ module Zine
24
24
  def upload_decision(query_class)
25
25
  return if @no_upload
26
26
  cli = query_class.new
27
- answer = cli.ask('Upload files? (Y/n)') { |q| q.default = 'Y' }
27
+ answer = cli.call 'Upload files? (Y/n)'
28
28
  return if answer != 'Y'
29
29
  puts Rainbow('Connecting...').green
30
30
  upload
@@ -46,6 +46,15 @@ module Zine
46
46
  exit
47
47
  end
48
48
 
49
+ def aws_upload
50
+ uploader = Zine::UploaderAWS.new(@build_dir,
51
+ @options,
52
+ @credentials,
53
+ @delete_file_array,
54
+ @upload_file_array)
55
+ uploader.upload
56
+ end
57
+
49
58
  def github_upload
50
59
  uploader = Zine::UploaderGitHub.new(@build_dir,
51
60
  @options,
@@ -65,7 +74,9 @@ module Zine
65
74
  end
66
75
 
67
76
  def upload
68
- if @options['method'] == 'sftp'
77
+ if @options['method'] == 'aws'
78
+ aws_upload
79
+ elsif @options['method'] == 'sftp'
69
80
  sftp_upload
70
81
  elsif @options['method'] == 'github'
71
82
  github_upload
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-cloudfront'
4
+ require 'aws-sdk-s3'
5
+ require 'rack/mime'
6
+ require 'rainbow'
7
+ require 'set'
8
+
9
+ module Zine
10
+ # Deploy changes to an AWS S3 bucket and invalidate the Cloudfront cache
11
+ class UploaderAWS
12
+ def initialize(build_dir, options, credentials, delete_file_array,
13
+ upload_file_array)
14
+ return unless options['method'] == 'aws'
15
+
16
+ @build_dir = build_dir
17
+ ENV['AWS_REGION'], @bucket_name = options['host'].split(':')
18
+ @path = options['path_or_repo']
19
+ @cf_distribution_id = options['cloudfront_distrib']
20
+
21
+ @verbose = options['verbose']
22
+ store_credentials credentials
23
+ @delete_file_array = Set.new(delete_file_array).to_a
24
+ @upload_file_array = Set.new(upload_file_array).to_a
25
+
26
+ @s3 = Aws::S3::Client.new
27
+ @cf = Aws::CloudFront::Client.new
28
+ end
29
+
30
+ def upload
31
+ delete
32
+ deploy
33
+ invalidate
34
+ rescue Aws::S3::Errors::ServiceError => err
35
+ puts Rainbow("S3 error: #{err}").red
36
+ end
37
+
38
+ private
39
+
40
+ def clean_path(path)
41
+ path.to_s
42
+ .delete_prefix('/')
43
+ .delete_suffix('/')
44
+ end
45
+
46
+ def delete
47
+ @delete_file_array.each do |rel_path|
48
+ remote_path = clean_path(rel_path)
49
+ @s3.delete_object(bucket: @bucket_name, key: remote_path)
50
+ puts "Delete: #{remote_path}" if @verbose
51
+ end
52
+ end
53
+
54
+ def deploy
55
+ @upload_file_array.each do |rel_path|
56
+ deploy_one_file(File.join(@build_dir, rel_path),
57
+ clean_path(rel_path))
58
+ end
59
+ end
60
+
61
+ def deploy_one_file(local_path, remote_path)
62
+ File.open(local_path, 'rb') do |file|
63
+ content_type = Rack::Mime.mime_type(File.extname(local_path))
64
+ @s3.put_object(bucket: @bucket_name,
65
+ key: remote_path,
66
+ content_type: content_type,
67
+ body: file)
68
+ puts "Add: #{remote_path}" if @verbose
69
+ end
70
+ end
71
+
72
+ def invalidate
73
+ changes = Set.new(@upload_file_array + @delete_file_array).to_a
74
+ return unless changes.count.positive?
75
+
76
+ puts 'Invalidating cache' if @verbose
77
+ string_changes = changes.map do |path|
78
+ path.to_s
79
+ .delete_prefix('/')
80
+ .prepend('/')
81
+ end
82
+ string_changes << '/'
83
+ @cf.create_invalidation(
84
+ distribution_id: @cf_distribution_id,
85
+ invalidation_batch: { paths: { quantity: string_changes.count,
86
+ items: string_changes },
87
+ caller_reference: Time.now.to_i.to_s }
88
+ )
89
+ end
90
+
91
+ def store_credentials(creds)
92
+ ENV['AWS_ACCESS_KEY_ID'] = creds['username']
93
+ ENV['AWS_SECRET_ACCESS_KEY'] = creds['password']
94
+ end
95
+ end
96
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zine
2
4
  # The version
3
- VERSION = '0.9.0'.freeze
5
+ VERSION = '0.15.0'
4
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Kreuzer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-01 00:00:00.000000000 Z
11
+ date: 2020-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,156 +16,184 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '2.1'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.5.4
22
+ version: 2.1.4
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '1.5'
29
+ version: '2.1'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.5.4
32
+ version: 2.1.4
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: curb
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.9.4
39
+ version: 0.9.10
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.9.4
46
+ version: 0.9.10
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '12.1'
53
+ version: '13.0'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 13.0.1
54
57
  type: :development
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - "~>"
59
62
  - !ruby/object:Gem::Version
60
- version: '12.1'
63
+ version: '13.0'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 13.0.1
61
67
  - !ruby/object:Gem::Dependency
62
68
  name: rspec
63
69
  requirement: !ruby/object:Gem::Requirement
64
70
  requirements:
65
71
  - - "~>"
66
72
  - !ruby/object:Gem::Version
67
- version: '3.6'
73
+ version: '3.9'
68
74
  type: :development
69
75
  prerelease: false
70
76
  version_requirements: !ruby/object:Gem::Requirement
71
77
  requirements:
72
78
  - - "~>"
73
79
  - !ruby/object:Gem::Version
74
- version: '3.6'
80
+ version: '3.9'
75
81
  - !ruby/object:Gem::Dependency
76
82
  name: simplecov
77
83
  requirement: !ruby/object:Gem::Requirement
78
84
  requirements:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
- version: 0.15.1
87
+ version: 0.18.5
82
88
  type: :development
83
89
  prerelease: false
84
90
  version_requirements: !ruby/object:Gem::Requirement
85
91
  requirements:
86
92
  - - "~>"
87
93
  - !ruby/object:Gem::Version
88
- version: 0.15.1
94
+ version: 0.18.5
89
95
  - !ruby/object:Gem::Dependency
90
- name: highline
96
+ name: aws-sdk-cloudfront
91
97
  requirement: !ruby/object:Gem::Requirement
92
98
  requirements:
93
99
  - - "~>"
94
100
  - !ruby/object:Gem::Version
95
- version: '1.7'
101
+ version: '1.27'
96
102
  - - ">="
97
103
  - !ruby/object:Gem::Version
98
- version: 1.7.8
104
+ version: 1.27.1
99
105
  type: :runtime
100
106
  prerelease: false
101
107
  version_requirements: !ruby/object:Gem::Requirement
102
108
  requirements:
103
109
  - - "~>"
104
110
  - !ruby/object:Gem::Version
105
- version: '1.7'
111
+ version: '1.27'
106
112
  - - ">="
107
113
  - !ruby/object:Gem::Version
108
- version: 1.7.8
114
+ version: 1.27.1
109
115
  - !ruby/object:Gem::Dependency
110
- name: htmlcompressor
116
+ name: aws-sdk-s3
111
117
  requirement: !ruby/object:Gem::Requirement
112
118
  requirements:
113
119
  - - "~>"
114
120
  - !ruby/object:Gem::Version
115
- version: '0.3'
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: 0.3.1
121
+ version: '1.66'
119
122
  type: :runtime
120
123
  prerelease: false
121
124
  version_requirements: !ruby/object:Gem::Requirement
122
125
  requirements:
123
126
  - - "~>"
124
127
  - !ruby/object:Gem::Version
125
- version: '0.3'
126
- - - ">="
128
+ version: '1.66'
129
+ - !ruby/object:Gem::Dependency
130
+ name: htmlcompressor
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
127
134
  - !ruby/object:Gem::Version
128
- version: 0.3.1
135
+ version: 0.4.0
136
+ type: :runtime
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: 0.4.0
129
143
  - !ruby/object:Gem::Dependency
130
144
  name: kramdown
131
145
  requirement: !ruby/object:Gem::Requirement
132
146
  requirements:
133
147
  - - "~>"
134
148
  - !ruby/object:Gem::Version
135
- version: '1.13'
149
+ version: '2.2'
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: 1.13.2
152
+ version: 2.2.1
139
153
  type: :runtime
140
154
  prerelease: false
141
155
  version_requirements: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: '1.13'
159
+ version: '2.2'
146
160
  - - ">="
147
161
  - !ruby/object:Gem::Version
148
- version: 1.13.2
162
+ version: 2.2.1
163
+ - !ruby/object:Gem::Dependency
164
+ name: kramdown-parser-gfm
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '1.1'
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: '1.1'
149
177
  - !ruby/object:Gem::Dependency
150
178
  name: listen
151
179
  requirement: !ruby/object:Gem::Requirement
152
180
  requirements:
153
181
  - - "~>"
154
182
  - !ruby/object:Gem::Version
155
- version: '3.0'
183
+ version: '3.2'
156
184
  - - ">="
157
185
  - !ruby/object:Gem::Version
158
- version: 3.1.5
186
+ version: 3.2.1
159
187
  type: :runtime
160
188
  prerelease: false
161
189
  version_requirements: !ruby/object:Gem::Requirement
162
190
  requirements:
163
191
  - - "~>"
164
192
  - !ruby/object:Gem::Version
165
- version: '3.0'
193
+ version: '3.2'
166
194
  - - ">="
167
195
  - !ruby/object:Gem::Version
168
- version: 3.1.5
196
+ version: 3.2.1
169
197
  - !ruby/object:Gem::Dependency
170
198
  name: net-sftp
171
199
  requirement: !ruby/object:Gem::Requirement
@@ -192,54 +220,42 @@ dependencies:
192
220
  requirements:
193
221
  - - "~>"
194
222
  - !ruby/object:Gem::Version
195
- version: '4.0'
223
+ version: '4.18'
196
224
  type: :runtime
197
225
  prerelease: false
198
226
  version_requirements: !ruby/object:Gem::Requirement
199
227
  requirements:
200
228
  - - "~>"
201
229
  - !ruby/object:Gem::Version
202
- version: '4.0'
230
+ version: '4.18'
203
231
  - !ruby/object:Gem::Dependency
204
232
  name: rainbow
205
233
  requirement: !ruby/object:Gem::Requirement
206
234
  requirements:
207
235
  - - "~>"
208
236
  - !ruby/object:Gem::Version
209
- version: '2.2'
210
- - - ">="
211
- - !ruby/object:Gem::Version
212
- version: 2.2.1
237
+ version: '3.0'
213
238
  type: :runtime
214
239
  prerelease: false
215
240
  version_requirements: !ruby/object:Gem::Requirement
216
241
  requirements:
217
242
  - - "~>"
218
243
  - !ruby/object:Gem::Version
219
- version: '2.2'
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- version: 2.2.1
244
+ version: '3.0'
223
245
  - !ruby/object:Gem::Dependency
224
246
  name: sassc
225
247
  requirement: !ruby/object:Gem::Requirement
226
248
  requirements:
227
249
  - - "~>"
228
250
  - !ruby/object:Gem::Version
229
- version: '1.11'
230
- - - ">="
231
- - !ruby/object:Gem::Version
232
- version: 1.11.2
251
+ version: '2.3'
233
252
  type: :runtime
234
253
  prerelease: false
235
254
  version_requirements: !ruby/object:Gem::Requirement
236
255
  requirements:
237
256
  - - "~>"
238
257
  - !ruby/object:Gem::Version
239
- version: '1.11'
240
- - - ">="
241
- - !ruby/object:Gem::Version
242
- version: 1.11.2
258
+ version: '2.3'
243
259
  - !ruby/object:Gem::Dependency
244
260
  name: thin
245
261
  requirement: !ruby/object:Gem::Requirement
@@ -260,23 +276,23 @@ dependencies:
260
276
  requirements:
261
277
  - - "~>"
262
278
  - !ruby/object:Gem::Version
263
- version: '0.19'
279
+ version: '1.0'
264
280
  - - ">="
265
281
  - !ruby/object:Gem::Version
266
- version: 0.19.4
282
+ version: 1.0.1
267
283
  type: :runtime
268
284
  prerelease: false
269
285
  version_requirements: !ruby/object:Gem::Requirement
270
286
  requirements:
271
287
  - - "~>"
272
288
  - !ruby/object:Gem::Version
273
- version: '0.19'
289
+ version: '1.0'
274
290
  - - ">="
275
291
  - !ruby/object:Gem::Version
276
- version: 0.19.4
292
+ version: 1.0.1
277
293
  description: |-
278
294
  Yet another blog aware static site generator.
279
- These are the very early days of zine, expect breaking changes.
295
+ There are many like it, but this one is mine.
280
296
  email:
281
297
  - mike@mikekreuzer.com
282
298
  executables:
@@ -296,6 +312,7 @@ files:
296
312
  - lib/zine/page.rb
297
313
  - lib/zine/post.rb
298
314
  - lib/zine/posts_and_headlines.rb
315
+ - lib/zine/query.rb
299
316
  - lib/zine/server.rb
300
317
  - lib/zine/skeleton/source/about.md
301
318
  - lib/zine/skeleton/source/assets/webicon-rss-m.png
@@ -303,6 +320,7 @@ files:
303
320
  - lib/zine/skeleton/source/assets/webicon-twitter-m.png
304
321
  - lib/zine/skeleton/source/assets/webicon-twitter.svg
305
322
  - lib/zine/skeleton/source/posts/2017-01-25-my-new-blog.md
323
+ - lib/zine/skeleton/source/robots.txt
306
324
  - lib/zine/skeleton/source/screen.css
307
325
  - lib/zine/skeleton/source/styles/screen.scss
308
326
  - lib/zine/skeleton/source/templates/articles.erb
@@ -320,11 +338,12 @@ files:
320
338
  - lib/zine/tag.rb
321
339
  - lib/zine/templates.rb
322
340
  - lib/zine/upload.rb
341
+ - lib/zine/uploader_aws.rb
323
342
  - lib/zine/uploader_github.rb
324
343
  - lib/zine/uploader_sftp.rb
325
344
  - lib/zine/version.rb
326
345
  - lib/zine/watcher.rb
327
- homepage: https://github.com/mikekreuzer/zine
346
+ homepage: https://mikekreuzer.com/projects/zine/
328
347
  licenses:
329
348
  - MIT
330
349
  metadata: {}
@@ -336,15 +355,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
336
355
  requirements:
337
356
  - - ">="
338
357
  - !ruby/object:Gem::Version
339
- version: 2.2.2
358
+ version: '2.3'
340
359
  required_rubygems_version: !ruby/object:Gem::Requirement
341
360
  requirements:
342
361
  - - ">="
343
362
  - !ruby/object:Gem::Version
344
363
  version: '0'
345
364
  requirements: []
346
- rubyforge_project:
347
- rubygems_version: 2.6.13
365
+ rubygems_version: 3.0.6
348
366
  signing_key:
349
367
  specification_version: 4
350
368
  summary: Yet another blog aware static site generator.