preambular 0.3

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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in preamble.gemspec
4
+ gemspec
@@ -0,0 +1,60 @@
1
+ Preamble
2
+ ========
3
+
4
+ Introduction
5
+ ------------
6
+
7
+ The preamble gem lets you add a yaml preamble to your files, much like the Jekyll static site generator
8
+
9
+
10
+ Example
11
+ -------
12
+
13
+ ---
14
+ key1: value1
15
+ key2: [1, 2, 3]
16
+ ---
17
+
18
+ Your body content goes here.
19
+
20
+
21
+ Usage
22
+ -----
23
+
24
+ # load file with metadata and content
25
+ Preamble.load("./file.xyz")
26
+
27
+ # load multiple files with metadata and content
28
+ Preamble.load_multiple("./file.xyz", "./file.abc")
29
+
30
+ # save metadata and content
31
+ file = Preamble.new({"author" => "Lucky", "year" => 2014}, "My lucky diary.")
32
+ file.save("diary.txt")
33
+
34
+ # load, modify metadata, then save
35
+ file = Preamble.load('./file.xyz')
36
+ file.metadata["new_key"] = "factoid"
37
+ file.save('./file.xyz')
38
+
39
+ Output
40
+ ------
41
+
42
+ The Preamble.load function returns a Preamble object. Your data will be in preamble.metadata, and the rest of the content will be in preamble.content.
43
+
44
+ `preamble.metadata`
45
+
46
+ { "key1" => "value1", "key2" => [1, 2, 3] }
47
+
48
+ `preamble.content`
49
+
50
+ "\nYour body content goes here"
51
+
52
+
53
+ Notes
54
+ -----
55
+
56
+ 1. The preamble must begin and end with three dashes '---'
57
+ 2. Whitespace can go above the preamble, but no content
58
+ 3. This gem is template-agnostic. It doesn't care what your body content is. It just gives it to you as a string.
59
+
60
+
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,85 @@
1
+ require 'preambular/version'
2
+ require 'yaml'
3
+
4
+ class Preambular
5
+
6
+ DEFAULTS = {
7
+ :external_encoding => Encoding.default_external
8
+ }
9
+
10
+ attr_accessor :metadata, :content
11
+
12
+ def initialize(metadata, content)
13
+ @metadata = metadata
14
+ @content = content
15
+ end
16
+
17
+ def metadata_with_content
18
+ @metadata.to_yaml + "---\n" + @content
19
+ end
20
+
21
+ def save(path, options = {})
22
+ options = DEFAULTS.merge(options)
23
+
24
+ open(path, "w:#{options[:external_encoding]}") do |f|
25
+ f.write metadata_with_content
26
+ end
27
+ end
28
+
29
+ def self.load(path, options = {})
30
+ preamble_lines = String.new
31
+ content_lines = String.new
32
+ options = DEFAULTS.merge(options)
33
+
34
+ state = :before_preamble
35
+
36
+ open(path, "r:#{options[:external_encoding]}") do |f|
37
+ f.each do |line|
38
+
39
+ stripped = line.strip
40
+
41
+ case state
42
+
43
+ when :before_preamble
44
+
45
+ new_state = case stripped
46
+ when "---"
47
+ :preamble
48
+ when ""
49
+ :before_preamble
50
+ else
51
+ raise "First line must begin with ---"
52
+ end
53
+
54
+ when :preamble
55
+
56
+ new_state = case stripped
57
+ when "---"
58
+ :after_preamble
59
+ else
60
+ preamble_lines << line
61
+ :preamble
62
+ end
63
+
64
+ when :after_preamble
65
+ new_state = :after_preamble
66
+ content_lines << line
67
+
68
+ else
69
+ raise "Invalid State: #{ state }"
70
+
71
+ end
72
+
73
+ state = new_state
74
+ end
75
+ end
76
+
77
+ return new(YAML::load(preamble_lines), content_lines)
78
+ end
79
+
80
+ def self.load_multiple(*paths)
81
+ options = paths.last.is_a?(Hash) ? paths.pop : {}
82
+ paths.map{ |path| Preambular.load(path, options) }
83
+ end
84
+
85
+ end
@@ -0,0 +1,3 @@
1
+ class Preambular
2
+ VERSION = "0.3"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "preambular/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "preambular"
7
+ s.version = Preambular::VERSION
8
+ s.authors = ["Starr Horne", "Duane Johnson"]
9
+ s.email = ["starr@chromahq.com", "duane.johnson@gmail.com"]
10
+ s.homepage = "https://github.com/wordtreefoundation/preambular"
11
+ s.summary = %q{Use and save yaml preambles in your documents & templates}
12
+ s.description = %q{Allows you to add YAML front matter to your templates. Useful for adding metadata to static pages}
13
+
14
+ s.rubyforge_project = "preambular"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/**`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+ s.add_dependency 'rspec'
21
+ end
@@ -0,0 +1,77 @@
1
+ require_relative '../spec_helper'
2
+ require 'tempfile'
3
+
4
+ describe Preambular do
5
+
6
+ describe "#load" do
7
+
8
+ it "should parse the preamble of a single file" do
9
+ result = Preambular.load(standard)
10
+ end
11
+
12
+ it "should return the result as a Preambular object" do
13
+ result = Preambular.load(standard)
14
+ expect(result).to be_a Preambular
15
+ end
16
+
17
+ it "should return a Preambular object with metadata as a Hash" do
18
+ result = Preambular.load(standard)
19
+ expect(result.metadata).to be_a Hash
20
+ end
21
+
22
+ it "should return a Preambular object with content as a String" do
23
+ result = Preambular.load(standard)
24
+ expect(result.content).to be_a String
25
+ end
26
+
27
+ it "should accept leading whitespace" do
28
+ Preambular.load(leading_whitespace)
29
+ end
30
+
31
+ it "should accept an options hash" do
32
+ Preambular.load(standard, {})
33
+ end
34
+
35
+ it "should accept an encoding option" do
36
+ Preambular.load(standard, {:external_encoding => 'UTF-8'})
37
+ end
38
+
39
+ it "should read a UTF-8 character" do
40
+ result = Preambular.load(unicode, {:external_encoding => 'UTF-8'})
41
+ expect(result.metadata['unicode_tm']).to eq "\u2122" # "TM"
42
+ end
43
+
44
+ end
45
+
46
+ describe "#metadata_with_content" do
47
+ it "should be the same as the source file" do
48
+ result = Preambular.load(standard)
49
+ expect(File.read(standard)).to eq(result.metadata_with_content)
50
+ end
51
+ end
52
+
53
+ describe "#save" do
54
+ it "should save a modified file" do
55
+ result = Preambular.load(standard)
56
+ output_file = Tempfile.new('preamble').path
57
+ result.metadata["key1"] += "!"
58
+ result.save(output_file)
59
+
60
+ result = Preambular.load(output_file)
61
+ expect(result.metadata["key1"]).to eq("value1!")
62
+ end
63
+ end
64
+
65
+ describe "#load_multiple" do
66
+
67
+ it "should load multiple files" do
68
+ Preambular.load_multiple(standard, leading_whitespace, unicode)
69
+ end
70
+
71
+ it "should accept options as tail arguments" do
72
+ Preambular.load_multiple(standard, leading_whitespace, unicode, external_encoding: 'UTF-8')
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,17 @@
1
+ module SampleFiles
2
+
3
+ SAMPLE_FILES = {
4
+ standard: "standard.txt",
5
+ leading_whitespace: "leading_whitespace.txt",
6
+ unicode: "unicode.txt"
7
+ }
8
+
9
+ SAMPLE_FILES.each do |method, filename|
10
+ define_method(method) { full_path filename }
11
+ end
12
+
13
+ def full_path filename
14
+ "#{File.dirname(__FILE__)}/sample_files/#{filename}"
15
+ end
16
+
17
+ end
@@ -0,0 +1,6 @@
1
+
2
+ ---
3
+ key1: value1
4
+ ---
5
+
6
+ Your body content goes here.
@@ -0,0 +1,5 @@
1
+ ---
2
+ key1: value1
3
+ ---
4
+
5
+ Your body content goes here.
@@ -0,0 +1,5 @@
1
+ ---
2
+ unicode_tm: ™
3
+ ---
4
+
5
+ Your body content goes here.
@@ -0,0 +1,6 @@
1
+ require_relative '../lib/preambular'
2
+ require_relative 'sample_files'
3
+
4
+ RSpec.configure do |c|
5
+ c.include SampleFiles
6
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: preambular
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.3'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Starr Horne
9
+ - Duane Johnson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-07-14 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ description: Allows you to add YAML front matter to your templates. Useful for adding
32
+ metadata to static pages
33
+ email:
34
+ - starr@chromahq.com
35
+ - duane.johnson@gmail.com
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - .gitignore
41
+ - .rspec
42
+ - Gemfile
43
+ - README.markdown
44
+ - Rakefile
45
+ - lib/preambular.rb
46
+ - lib/preambular/version.rb
47
+ - preambular.gemspec
48
+ - spec/preambular/preambular_spec.rb
49
+ - spec/sample_files.rb
50
+ - spec/sample_files/leading_whitespace.txt
51
+ - spec/sample_files/standard.txt
52
+ - spec/sample_files/unicode.txt
53
+ - spec/spec_helper.rb
54
+ homepage: https://github.com/wordtreefoundation/preambular
55
+ licenses: []
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project: preambular
74
+ rubygems_version: 1.8.23
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: Use and save yaml preambles in your documents & templates
78
+ test_files:
79
+ - spec/preambular/preambular_spec.rb
80
+ - spec/sample_files.rb
81
+ - spec/sample_files/leading_whitespace.txt
82
+ - spec/sample_files/standard.txt
83
+ - spec/sample_files/unicode.txt
84
+ - spec/spec_helper.rb
85
+ has_rdoc: