postwave 0.0.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f460f1e6202c2d56b2c355266fd8819691cdb2a8f12b6aa33febd8a0c6b5d580
4
- data.tar.gz: 5159c6aa7c213bfff6ec6f1a2f3fdb8c4f1ef8f03dbe9ff5014b93709ee8c625
3
+ metadata.gz: 3659ecd8d7d5b7d1fdfaddb0b8538b86414e34687febec04f29c3352dff8d6c2
4
+ data.tar.gz: f877ba937e8361518ca4a0c16f5d3ae77dfb101ac94becd0e2f2c3ae5f01abf4
5
5
  SHA512:
6
- metadata.gz: 5102d693e92f76288dbdf152f00cfdf6a386e0b4a27bb4415ba8baccdd13d64b04e624f136bb993046bf7b71facbf5d78848716aa8c146abe6a1f9d006b91282
7
- data.tar.gz: cfbb408e719c8a56e54ef81614ae5e7a7a362e1b3f7f863e4e462d449dfab3188beca5e4536fe13381097c1eb14d8b43842c9108d5429f44909aaf87a765961a
6
+ metadata.gz: a866429e4ad00e427b8302527e4eafcd488d16b938b51d12f370104d9a8dc0abdec1f5b868f62c0afb7b10ac162a120bbe2494d6b4347f521c9c6f35cf9c00cd
7
+ data.tar.gz: 89575f81e742ca2bcd40d14c6e54ed3618daf4ad8434720ed65b6cdd4350e2189ba0721265351d62d565c49c9ac8c9a4686e96e93eabc358e29984a66999f3c1
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in trackstar.gemspec
3
+ # Specify your gem's dependencies in postwave.gemspec
4
4
  gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,22 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ postwave (0.0.2)
5
+ redcarpet (~> 3.6)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ rake (12.3.3)
11
+ redcarpet (3.6.0)
12
+
13
+ PLATFORMS
14
+ arm64-darwin-21
15
+
16
+ DEPENDENCIES
17
+ bundler
18
+ postwave!
19
+ rake (~> 12.3)
20
+
21
+ BUNDLED WITH
22
+ 2.2.31
data/README.md CHANGED
@@ -1,21 +1,23 @@
1
1
  # Postwave 🌊
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/postwave.svg)](https://badge.fury.io/rb/postwave)
4
+
3
5
  Write your posts statically. Interact with them dynamically.
4
6
 
5
7
  ## What is Postwave?
6
8
 
7
9
  Postwave is an opinionated flat-file based based blog engine.
8
10
 
9
- It lets you write posts in Markdown and then display them on a dynamic site using a client library.
10
-
11
- ## Getting Started
11
+ It lets you write posts in Markdown and then display them on a dynamic site using the client functionality.
12
12
 
13
- ### Installation
13
+ ## Installation
14
14
 
15
15
  ```
16
16
  gem install postwave
17
17
  ```
18
18
 
19
+ ## Authoring Posts
20
+
19
21
  ### Setup
20
22
 
21
23
  ```
@@ -51,11 +53,11 @@ postwave.yaml
51
53
  > postwave post
52
54
  ```
53
55
 
54
- This will generate at new Markdown file in the `_posts/` directory. The filename will be the current timestamp. This will eventually be overwritten by the `build` command, so don't worry too much about it. The file will have a general structure like this:
56
+ This will generate at new Markdown file in the `_posts/` directory. The title is set to a random string of characters. The filename will be the current timestamp. This will eventually be overwritten by the `build` command, so don't worry too much about it. The file will have a general structure like this:
55
57
 
56
58
  ```
57
59
  ---
58
- title:
60
+ title: FNJEXWZP
59
61
  date: 2022-01-01
60
62
  tags:
61
63
  ---
@@ -82,15 +84,108 @@ draft: true
82
84
  ```
83
85
 
84
86
  This will "build" the blog. This involves:
85
- - regenerating the `index.csv` file
87
+ - regenerating the `/meta/index.csv` file
86
88
  - generating slugs for each posts based on the post title and ensuring that there are no duplicate slugs
87
89
  - changing the post file names to match `yyyy-dd-mm-slug.md`
88
- - updating the `summary.yaml`
90
+ - updating the `/meta/summary.yaml`
89
91
  - creating and updating tag files (which will be `/tags/[tag-name].yaml` files for each tag)
92
+ - updating the `/meta/rss` file to create a feed for your posts
93
+
94
+ ## Displaying Posts
95
+
96
+ You can now use Postwave's build in client to display this posts in your project.
97
+
98
+ ### Include the Client In Your Project
99
+
100
+ ```ruby
101
+ require 'postwave/client'
102
+ ```
103
+
104
+ ### Create a Postwave Client
105
+ ```ruby
106
+ postwave_client = Postwave::Client.new("path/to/config/postwave.yaml")
107
+ ```
108
+
109
+ If you'd like to preload all the posts:
110
+ ```ruby
111
+ postwave_client = Postwave::Client.new("path/to/config/postwave.yaml", preload: true)
112
+ ```
113
+
114
+ ### Get a Single Post
115
+
116
+ Pass in the stub (the filename without '.md') for the post.
117
+ ```ruby
118
+ post = postwave_client.post("my-great-post")
119
+
120
+ # <Postwave::Post title="My Great Post", date=<Time ...>, tags=["tag1"], body="bla bla bla..">
121
+
122
+ puts post.title
123
+ # "My Great Post"
124
+ ```
125
+
126
+ ### Get a Collection of Posts
127
+
128
+ This will give you a list of posts for displaying on a page.
129
+
130
+ You can also filter by tags and specify offsets and limits (useful for pagination).
131
+
132
+ ```ruby
133
+ posts = postwave_client.posts
134
+
135
+ # [<Postwave::Post ...>, <Postwave::Post ...>, ...]
136
+
137
+ tagged_posts = postwave_client.posts(tag: "lizards")
90
138
 
91
- ## Available Client Libraries
139
+ page2_posts = postwave_client.posts(offset: 10, limit: 10)
140
+ ```
141
+ Posts will be in reverse chronological order.
142
+
143
+ ### Get an Index of Posts
144
+
145
+ This will give you a quick list of post summaries containing the title, date, and stub, useful for building an archive page or quick index of posts.
146
+
147
+ You can also specify offsets and limits (useful for pagination).
148
+ ```ruby
149
+ index = postwave_client(index)
150
+
151
+ # [<Postwave::PostStub title="My Great Post", date=<Time ...>, stub="my-great-post">, <Postwave::PostStub ...>, ...]
152
+
153
+ puts index.first.stub
154
+ # my-great-post
155
+
156
+ page2_index = postwave_client.index(offset: 10, limit: 10)
157
+ ```
158
+ Index will be in reverse chronological order.
159
+
160
+ ### Get Tags Used In the Blog
161
+
162
+ ```ruby
163
+ tags = postwave_client.tags
164
+
165
+ # ["tag1", "tag2", "another-tag"]
166
+ ```
92
167
 
93
- - [Ruby](https://github.com/dorkrawk/postwave-ruby-client)
168
+ ### Get Details For A Tag
169
+
170
+ ```ruby
171
+ tag = postwave_clinet.tag("tag1")
172
+
173
+ # <Postwave::Tag tile="tag1", count=1, post_slugs=["my-great-post"]>
174
+ ```
175
+
176
+ ### Get Text For An RSS Feed
177
+
178
+ ```ruby
179
+ rss = postwave_client.rss
180
+
181
+ # "<?xml version="1.0" encoding="utf-8"?>..."
182
+ ```
183
+
184
+ ## Run Tests
185
+
186
+ ```
187
+ rake test
188
+ ```
94
189
 
95
190
  ## What is Postwave Not?
96
191
 
@@ -5,6 +5,7 @@ require 'csv'
5
5
  require 'time'
6
6
  require_relative "blog_utilities"
7
7
  require_relative "display_helper"
8
+ require_relative "rss_helper"
8
9
  require_relative "post"
9
10
 
10
11
  module Postwave
@@ -12,6 +13,7 @@ module Postwave
12
13
  include Singleton
13
14
  include BlogUtilities
14
15
  include DisplayHelper
16
+ include RssHelper
15
17
 
16
18
  INDEX_HEADERS = ["slug", "date", "title"]
17
19
 
@@ -53,6 +55,8 @@ module Postwave
53
55
  build_tags_files(tags)
54
56
  build_summary(published_posts, tags)
55
57
 
58
+ build_rss(published_posts)
59
+
56
60
  build_time = Time.now - start
57
61
  output_build_completed(build_time)
58
62
  end
@@ -95,8 +99,8 @@ module Postwave
95
99
  def build_summary(posts, tags)
96
100
  summary = {
97
101
  post_count: posts.count,
98
- most_recent_file_name: posts.first.file_name,
99
- most_recent_date: posts.first.date,
102
+ most_recent_file_name: posts.first&.file_name,
103
+ most_recent_date: posts.first&.date,
100
104
  tags: tags.keys
101
105
  }
102
106
  File.write(File.join(Dir.pwd, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME), summary.to_yaml)
@@ -22,6 +22,8 @@ module Postwave
22
22
  build_files
23
23
  write_initial_summary_contents
24
24
 
25
+ configure_blog
26
+
25
27
  output_blog_created
26
28
  end
27
29
 
@@ -43,7 +45,23 @@ module Postwave
43
45
  tags: []
44
46
  }
45
47
 
46
- File.write(File.join(Dir.pwd, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME), summary.to_yaml)
48
+ File.write(File.join(Dir.pwd, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME), summary.transform_keys(&:to_s).to_yaml)
49
+ end
50
+
51
+ def configure_blog
52
+ config = {}
53
+
54
+ output_blog_name_prompt
55
+ config[:name] = gets.chomp
56
+ output_blog_url_prompt
57
+ config[:url] = gets.chomp
58
+ output_blog_posts_path_prompt
59
+ config[:posts_path] = gets.chomp
60
+ output_blog_description_prompt
61
+ config[:description] = gets.chomp
62
+
63
+ File.write(File.join(Dir.pwd, CONFIG_FILE_NAME), config.transform_keys(&:to_s).to_yaml)
64
+ output_config_message
47
65
  end
48
66
  end
49
67
  end
@@ -3,38 +3,47 @@ module Postwave
3
3
  CONFIG_FILE_NAME = "postwave.yaml"
4
4
  INDEX_FILE_NAME = "index.csv"
5
5
  SUMMARY_FILE_NAME = "summary.yaml"
6
+ RSS_FILE_NAME = "rss"
6
7
  POSTS_DIR = "_posts"
7
8
  META_DIR = "meta"
8
9
  TAGS_DIR = "tags"
9
10
 
10
- def is_set_up?
11
- missing_paths = find_missing_paths
11
+ def is_set_up?(blog_root = Dir.pwd)
12
+ missing_paths = find_missing_paths(blog_root)
12
13
  missing_paths.empty?
13
14
  end
14
15
 
15
- def file_paths
16
+ def file_paths(blog_root = Dir.pwd)
16
17
  [
17
- File.join(Dir.pwd, CONFIG_FILE_NAME),
18
- File.join(Dir.pwd, POSTS_DIR, META_DIR, INDEX_FILE_NAME),
19
- File.join(Dir.pwd, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME),
18
+ File.join(blog_root, CONFIG_FILE_NAME),
19
+ File.join(blog_root, POSTS_DIR, META_DIR, INDEX_FILE_NAME),
20
+ File.join(blog_root, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME),
20
21
  ]
21
22
  end
22
23
 
23
- def directory_paths
24
+ def directory_paths(blog_root = Dir.pwd)
24
25
  [
25
- File.join(Dir.pwd, POSTS_DIR),
26
- File.join(Dir.pwd, POSTS_DIR, META_DIR),
27
- File.join(Dir.pwd, POSTS_DIR, META_DIR, TAGS_DIR),
26
+ File.join(blog_root, POSTS_DIR),
27
+ File.join(blog_root, POSTS_DIR, META_DIR),
28
+ File.join(blog_root, POSTS_DIR, META_DIR, TAGS_DIR),
28
29
  ]
29
30
  end
30
31
 
31
- def find_missing_paths
32
- paths_to_check = directory_paths + file_paths
32
+ def find_missing_paths(blog_root = Dir.pwd)
33
+ paths_to_check = directory_paths(blog_root) + file_paths(blog_root)
33
34
  missing_paths = []
34
35
  paths_to_check.each do |path|
35
- missing_paths << path if !FileTest.exists?(path)
36
+ missing_paths << path if !FileTest.exist?(path)
36
37
  end
37
38
  missing_paths
38
39
  end
40
+
41
+ def config_values
42
+ @config_values ||= if yaml_load = YAML.load_file(File.join(Dir.pwd, CONFIG_FILE_NAME))
43
+ yaml_load.transform_keys(&:to_sym)
44
+ else
45
+ {}
46
+ end
47
+ end
39
48
  end
40
49
  end
@@ -0,0 +1,102 @@
1
+ require_relative "post"
2
+ require_relative "errors"
3
+ require_relative "blog_utilities"
4
+
5
+ require "csv"
6
+ require "time"
7
+ require "yaml"
8
+
9
+ Postwave::PostStub = Struct.new(:date, :title, :slug)
10
+ Postwave::Tag = Struct.new(:name, :count, :post_slugs)
11
+
12
+ module Postwave
13
+ class Client
14
+ include BlogUtilities
15
+
16
+ def initialize(config_path, preload: false)
17
+ raise MissingConfigError unless is_valid_config?(config_path)
18
+
19
+ @blog_root = File.dirname(config_path)
20
+ raise InvalidBlogError unless is_set_up?(@blog_root)
21
+
22
+ @all_posts = get_all_posts if preload
23
+ end
24
+
25
+ # returns: an array of PostStub Structs - [<struct PostStub date=Time, title="", stub="">]
26
+ def index(offset: 0, limit: nil)
27
+ working_index = @full_index || get_full_index
28
+ count = limit || working_index.size
29
+ working_index[offset, count]
30
+ end
31
+
32
+ # returns: a post - Postwave::Post
33
+ def post(slug)
34
+ post_file_path = Dir["#{File.join(@blog_root, POSTS_DIR)}/*#{slug}.md"].first
35
+
36
+ raise PostNotFoundError unless post_file_path && File.exist?(post_file_path)
37
+
38
+ Postwave::Post.new_from_file_path(post_file_path)
39
+ end
40
+
41
+ # returns: an array of posts - [Postwave::Post]
42
+ def posts(offset: 0, limit: nil, tag: nil)
43
+ posts = @all_posts || get_all_posts
44
+ posts = posts.select { |post| post.tags.include?(tag) } if tag
45
+ count = limit || posts.size
46
+ posts[offset, count]
47
+ end
48
+
49
+ # returns: an array of tags - [String]
50
+ def tags
51
+ summary = @blog_summary || get_summary
52
+ summary[:tags]
53
+ end
54
+
55
+ # returns: a Tag Struct - <Tag tag: "", count: Integer, post_slugs: ["post-slug",..]
56
+ def tag(tag)
57
+ tag_file_path = File.join(@blog_root, POSTS_DIR, META_DIR, TAGS_DIR, "#{tag}.yaml")
58
+ raise TagNotFoundError unless File.exist?(tag_file_path)
59
+
60
+ tag_info = YAML.load_file(tag_file_path)
61
+
62
+ Postwave::Tag.new(tag, tag_info[:count], tag_info[:post_slugs])
63
+ end
64
+
65
+ # returns: a string of the xml representing an RSS feed of posts - String
66
+ def rss
67
+ rss_file_path = File.join(@blog_root, POSTS_DIR, META_DIR, RSS_FILE_NAME)
68
+ rss = File.open(rss_file_path)
69
+ rss.read
70
+ end
71
+
72
+ private
73
+
74
+ def is_valid_config?(config_path)
75
+ File.exist?(config_path)
76
+ end
77
+
78
+ def get_all_posts
79
+ posts = []
80
+ Dir.glob(File.join(@blog_root, POSTS_DIR, "*.md")) do |post_file_path|
81
+ posts << Postwave::Post.new_from_file_path(post_file_path)
82
+ end
83
+ posts.reject! { |p| p.draft if p.respond_to? :draft }
84
+ posts.sort_by { |p| p.date }.reverse
85
+ end
86
+
87
+ def get_full_index
88
+ full_index = []
89
+ index_contents = CSV.read(File.join(@blog_root, POSTS_DIR, META_DIR, INDEX_FILE_NAME))
90
+ index_contents.shift # skip header
91
+ index_contents.each do |post|
92
+ full_index << Postwave::PostStub.new(Time.parse(post[1]), post[2], post[0])
93
+ end
94
+ full_index
95
+ end
96
+
97
+ def get_summary
98
+ summary_file_path = File.join(@blog_root, POSTS_DIR, META_DIR, SUMMARY_FILE_NAME)
99
+ YAML.load_file(summary_file_path)
100
+ end
101
+ end
102
+ end
@@ -7,6 +7,26 @@ module Postwave
7
7
  puts "🌊 Creating new blog..."
8
8
  end
9
9
 
10
+ def output_blog_name_prompt
11
+ puts "Enter the name of this blog (leave blank to skip): "
12
+ end
13
+
14
+ def output_blog_url_prompt
15
+ puts "Enter the url of this blog (leave blank to skip): "
16
+ end
17
+
18
+ def output_blog_posts_path_prompt
19
+ puts "Enter the directory for the blog posts (if a post will be at http://example.com/blog/posts/post-title put blog/posts):"
20
+ end
21
+
22
+ def output_blog_description_prompt
23
+ puts "Enter a short description of this blog (leave blank to skip): "
24
+ end
25
+
26
+ def output_config_message
27
+ puts "All configuration values can be changed at any time by editing the postwave.yaml file."
28
+ end
29
+
10
30
  def output_blog_created
11
31
  puts "New blog set up.".green
12
32
  end
@@ -0,0 +1,16 @@
1
+ module Postwave
2
+ class PostwaveError < StandardError
3
+ end
4
+
5
+ class MissingConfigError < PostwaveError
6
+ end
7
+
8
+ class InvalidBlogError < PostwaveError
9
+ end
10
+
11
+ class PostNotFoundError < PostwaveError
12
+ end
13
+
14
+ class TagNotFoundError < PostwaveError
15
+ end
16
+ end
data/lib/postwave/post.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require_relative "blog_utilities"
2
+ require "redcarpet"
2
3
 
3
4
  module Postwave
4
- class Post
5
+ class Post
5
6
  include BlogUtilities
6
7
 
7
8
  KNOWN_FIELDS = %w(title date tags title_slug body draft)
@@ -10,6 +11,8 @@ module Postwave
10
11
 
11
12
  attr_accessor :file_name
12
13
 
14
+ @@markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
15
+
13
16
  def self.new_from_file_path(path)
14
17
  metadata_delimter_count = 0
15
18
  body_buffer_count = 0
@@ -33,10 +36,13 @@ module Postwave
33
36
  next if clean_line.empty?
34
37
  end
35
38
 
36
- field_content["body"] += "#{line}\n"
39
+ field_content["body"] += "#{line}"
37
40
  end
38
41
  end
39
42
 
43
+ # turn "date" into a Time object
44
+ field_content["date"] = Time.parse(field_content["date"])
45
+
40
46
  # turn "tags" into an array
41
47
  if field_content["tags"]
42
48
  field_content["tags"] = field_content["tags"].split(",").map do |tag|
@@ -56,8 +62,8 @@ module Postwave
56
62
  @file_name = file_name
57
63
 
58
64
  field_content.each do |field, value|
59
- instance_variable_set("@#{field}", value)
60
- self.class.send(:attr_accessor, field)
65
+ instance_variable_set("@#{field}", value) unless self.instance_variables.include?("@#{field}".to_sym)
66
+ self.class.send(:attr_reader, field) unless self.public_methods.include?(field.to_sym)
61
67
  end
62
68
  end
63
69
 
@@ -73,9 +79,13 @@ module Postwave
73
79
  @slug = new_slug
74
80
  end
75
81
 
82
+ def body_html
83
+ @@markdown.render(@body)
84
+ end
85
+
76
86
  def generated_file_name
77
87
  # YYYY-MM-DD-slug-from-title.md
78
- "#{@date[..9]}-#{slug}.md"
88
+ "#{@date.to_s[..9]}-#{slug}.md"
79
89
  end
80
90
 
81
91
  def update_file_name!
@@ -0,0 +1,36 @@
1
+ require_relative "blog_utilities"
2
+ require "erb"
3
+ require 'redcarpet'
4
+
5
+ module Postwave
6
+ module RssHelper
7
+ include BlogUtilities
8
+
9
+ FeedPost = Struct.new(:title, :link, :body, :date, :tags)
10
+
11
+ def build_rss(posts)
12
+ File.open(File.join(Dir.pwd, POSTS_DIR, META_DIR, RSS_FILE_NAME), "w") do |rss|
13
+ rss << feed_content(posts)
14
+ end
15
+ end
16
+
17
+ def feed_content(posts)
18
+ link = config_values[:url]
19
+ updated = Time.now.iso8601.to_s
20
+ title = config_values[:name]
21
+ description = config_values[:description]
22
+
23
+ markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
24
+ feed_posts = posts.map do |post|
25
+ post_link = "#{config_values[:url]}/#{config_values[:posts_path]}/#{post.slug}"
26
+ html_body = CGI.unescapeHTML(markdown.render(post.body))
27
+ FeedPost.new(post.title, post_link, html_body, post.date.iso8601, post.tags)
28
+ end
29
+
30
+ path = File.join(__dir__, "templates/feed.erb")
31
+ template = File.read(path)
32
+ renderer = ERB.new(template)
33
+ renderer.result(binding)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom">
3
+ <generator uri="https://github.com/dorkrawk/postwave" version="<%= Postwave::VERSION %>">Postwave</generator>
4
+ <link href="<%= link %>" rel="self" type="application/atom+xml" />
5
+ <link href="<%= link %>" />
6
+ <updated><%= updated %></updated>
7
+ <id><%= link %></id>
8
+ <title type="html"><%= title %></title>
9
+ <subtitle><%= description %></subtitle>
10
+ <% feed_posts.each do |post| %>
11
+ <entry>
12
+ <title><%= post.title %></title>
13
+ <link href="<%= post.link %>" rel="alternate" type="text/html" title="<%= post.title %>" />
14
+ <id><%= post.link %></id>
15
+ <published><%= post.date %></published>
16
+ <updated><%= post.date %></updated>
17
+ <author>
18
+ <name><%= title %></name>
19
+ </author>
20
+ <content type="html">
21
+ <![CDATA[<%= post.body %>]]>
22
+ </content>
23
+ <% post.tags.each do |tag| %>
24
+ <category term="<%= tag %>" />
25
+ <% end %>
26
+ </entry>
27
+ <% end %>
28
+ </feed>
@@ -1,3 +1,3 @@
1
1
  module Postwave
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/postwave.rb CHANGED
@@ -14,7 +14,7 @@ module Postwave
14
14
  Postwave::BlogBuilder.instance.build
15
15
  else
16
16
  if options[:version]
17
- puts "postwave #{VERSION} [ruby]"
17
+ puts "postwave #{VERSION}"
18
18
  end
19
19
  end
20
20
  end
data/postwave.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = ['postwave']
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- # spec.add_dependency ""
21
+ spec.add_dependency "redcarpet", '~> 3.6'
22
22
 
23
23
  spec.add_development_dependency "bundler"
24
24
  spec.add_development_dependency "rake", "~> 12.3"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postwave
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Schwantes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-15 00:00:00.000000000 Z
11
+ date: 2025-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redcarpet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.6'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -48,6 +62,7 @@ extra_rdoc_files: []
48
62
  files:
49
63
  - ".gitignore"
50
64
  - Gemfile
65
+ - Gemfile.lock
51
66
  - README.md
52
67
  - Rakefile
53
68
  - bin/postwave
@@ -55,9 +70,13 @@ files:
55
70
  - lib/postwave/blog_builder.rb
56
71
  - lib/postwave/blog_creator.rb
57
72
  - lib/postwave/blog_utilities.rb
73
+ - lib/postwave/client.rb
58
74
  - lib/postwave/display_helper.rb
75
+ - lib/postwave/errors.rb
59
76
  - lib/postwave/post.rb
60
77
  - lib/postwave/post_creator.rb
78
+ - lib/postwave/rss_helper.rb
79
+ - lib/postwave/templates/feed.erb
61
80
  - lib/postwave/version.rb
62
81
  - postwave.gemspec
63
82
  homepage: https://github.com/dorkrawk/postwave