pagemaster 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. data/lib/pagemaster.rb +74 -94
  3. metadata +60 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 85693645a299d6fdaf96300cac4bb14965a30ec8
4
- data.tar.gz: 5ded4953bc2f0f3fb9a44766c0074dbf8b9e58e3
2
+ SHA256:
3
+ metadata.gz: 1cc95d2a656139e4ac5f4487d2ee34259e953a949021a1b3885a2e4ee3124250
4
+ data.tar.gz: 3270dd906aae58e82ec50dab84b98a45dfee552583de3e2636e14d3ef362748e
5
5
  SHA512:
6
- metadata.gz: d684b86103dc4dbb49e5d019c6a69ae1d4b1b121fa5813ce216fb1b9d3831baa7108f2eeca0e5590967208e1a4574cf5f8583078aba54d035c8bc42ea5d2923d
7
- data.tar.gz: 077cc16aa4c5a9b51540b88d979ab517aeff689f70720d9da1c72495d70bc29b2f185e72294241154300180d48506cdf222eb5b8834100d298d35f2770efb89a
6
+ metadata.gz: 91177001b1b99318b88324b8cc20fffd16eb3fc6756cecb08bf405f45aac74122dcf845fd9e3737f5a86ef0c49acb6d20ae34c9db805ac07c13d0205831c45da
7
+ data.tar.gz: a44434fefa5681e38ba6405243d2930a3076a02724756d738289a1f94f19676b63e5fb29a8d0cd59f51881d6ad00f0ce89cbb314f74fd95baf8b2a719e6efd58
data/lib/pagemaster.rb CHANGED
@@ -1,103 +1,83 @@
1
- require 'yaml'
1
+ include FileUtils
2
2
  require 'csv'
3
+ require 'yaml'
4
+ require 'json'
3
5
 
4
- Jekyll::Hooks.register :site, :after_reset do |site| # when site is re/built
5
-
6
- for collection in site.collections
7
- collection = collection[1]
8
- if collection.metadata["output"] && collection.metadata["pm_generate"]
9
-
10
- # grab collection variables from config
11
- @input = collection.metadata["pm_input"].to_s
12
- @dir = collection.metadata["pm_directory"].to_s
13
- @name_key = collection.metadata["pm_key"].to_s
14
- @src = collection.metadata["pm_source"].to_s
15
- @layout = collection.metadata["pm_layout"].to_s
16
-
17
- @layout ||= @src
18
- @src = @src + "." + @input
19
-
20
- # check if input is csv or yaml
21
- unless @input == 'yaml' or @input == 'csv'
22
- raise "pagemaster :: Input must be 'csv' or 'yaml'."
6
+ # Jekyll comand to generate markdown collection pages from CSV/YML/JSON records
7
+ class Pagemaster < Jekyll::Command
8
+ class << self
9
+ def init_with_program(prog)
10
+ prog.command(:pagemaster) do |command|
11
+ command.syntax 'pagemaster [options]'
12
+ command.description 'Generate md pages from collection data.'
13
+ command.action do |args|
14
+ execute(args)
15
+ end
23
16
  end
17
+ end
24
18
 
25
- # check usability of dir name. gsub alphanumerics to (especially) avoid leading double underscores. then make directory.
26
- if @dir.empty?
27
- raise "pagemaster :: Target directory is undefined or unusable. Cannot generate pages. Specify dir in config and rebuild."
28
- else
29
- @targetdir = "_" + @dir.downcase.gsub(/[^\0-9a-z]/, '').to_s
30
- FileUtils::mkdir_p @targetdir
31
- puts ">> pagemaster :: Made directory " + @targetdir + " in root."
32
- end
33
-
34
- # check usability of name_key, to be used later when naming generated pages
35
- if @name_key.empty?
36
- raise "pagemaster :: pm_key is undefined or unusable. Cannot generate pages. Specify pm_key in config and rebuild."
37
- end
38
-
39
- def ingest(src) # takes + opens src file
40
- begin
41
- puts ">> pagemaster :: Loaded " + src + "."
42
- if @input == 'yaml'
43
- return YAML.load_file('_data/' + src)
44
- else
45
- return CSV.read('_data/' + src, :headers => true).map(&:to_hash)
46
- end
47
- rescue
48
- raise "pagemaster :: Cannot load " + src + ". Check for typos and rebuild."
49
- end
50
- end
51
-
52
- def uniqify(hashes, key) # takes opened src file as hash array
53
- occurences = {} # hash list of slug names and # of occurences
54
- hashes.each do |item|
55
- if item[key].nil?
56
- raise "pagemaster :: Source file has at least one missing value for pm_key='" + key + "'. Cannot generate page."
57
- end
58
- new_name = item[key].downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '').gsub(/-+/, '-') # gsub for slug
59
- if occurences.has_key? new_name
60
- occurences[new_name]+=1
61
- safe_slug = new_name + "-" + occurences[new_name].to_s
62
- else
63
- occurences.store(new_name, 1)
64
- safe_slug = new_name
65
- end
66
- item.store("slug", safe_slug)
67
- end
68
- return hashes # return changed yml array with unique, slugified names added
69
- end
19
+ def execute(args)
20
+ config = YAML.load_file('_config.yml')
21
+ abort 'Cannot find collections in config' unless config.key?('collections')
22
+ perma = config['permalink'] == 'pretty' ? '/' : '.html'
23
+ args.each do |name|
24
+ abort "Cannot find #{name} in collection config" unless config['collections'].key? name
25
+ meta = {
26
+ 'id_key' => config['collections'][name].fetch('id_key'),
27
+ 'layout' => config['collections'][name].fetch('layout'),
28
+ 'source' => config['collections'][name].fetch('source')
29
+ }
30
+ data = ingest(meta)
31
+ generate_pages(name, meta, data, perma)
32
+ end
33
+ end
70
34
 
71
- # ingest data source, sort it and generate unique titles
72
- data = uniqify(ingest(@src), @name_key)
35
+ def ingest(meta)
36
+ src = '_data/' + meta['source']
37
+ puts "Processing #{src}...."
38
+ case File.extname(src)
39
+ when '.csv' then data = CSV.read(src, headers: true, encoding: 'utf-8').map(&:to_hash)
40
+ when '.json' then data = JSON.parse(File.read(src).encode('UTF-8'))
41
+ when '.yml' then data = YAML.load_file(src)
42
+ else abort 'Collection source must have a valid extension (.csv, .yml, or .json)'
43
+ end
44
+ detect_duplicates(meta, data)
45
+ data
46
+ rescue StandardError
47
+ abort "Cannot load #{src}. check for typos and rebuild."
48
+ end
73
49
 
74
- # keep track of (valid) pages generated vs. (untitled, nonunique) pages skipped.
75
- untitled, nonunique, valid = 0, 0, 0
50
+ def detect_duplicates(meta, data)
51
+ ids = []
52
+ data.each { |d| ids << d[meta['id_key']] }
53
+ duplicates = ids.detect { |i| ids.count(i) > 1 } || []
54
+ abort "Your collection duplicate ids: \n#{duplicates}" unless duplicates.empty?
55
+ end
76
56
 
77
- # make pages
78
- data.each do |item|
79
- pagename = item["slug"]
80
- pagepath = @targetdir + "/" + pagename + ".md"
81
- layout_str = ""
82
- unless @layout.empty?
83
- layout_str = "layout: " + @layout
84
- end
85
- if pagename.empty?
86
- puts ">> pagemaster :: Title for item is unspecified. Cannot generate page."
87
- untitled+=1
88
- elsif !File.exist?(pagepath)
89
- File.open(pagepath, 'w') { |file| file.write( item.to_yaml.to_s + layout_str + "\n---" ) }
90
- valid+=1
91
- else
92
- puts ">> pagemaster :: " + pagename + ".md already exits."
93
- nonunique+=1
94
- end
95
- end
57
+ def generate_pages(name, meta, data, perma)
58
+ completed = 0
59
+ skipped = 0
60
+ dir = '_' + name
61
+ mkdir_p(dir)
62
+ data.each do |item|
63
+ pagename = slug(item.fetch(meta['id_key']))
64
+ pagepath = dir + '/' + pagename + '.md'
65
+ item['permalink'] = '/' + name + '/' + pagename + perma
66
+ item['layout'] = meta['layout']
67
+ if File.exist?(pagepath)
68
+ puts "#{pagename}.md already exits. Skipping."
69
+ skipped += 1
70
+ else
71
+ File.open(pagepath, 'w') { |file| file.write(item.to_yaml.to_s + '---') }
72
+ completed += 1
73
+ end
74
+ end
75
+ rescue StandardError
76
+ abort 'Pagemaster exited for some reason, most likely a missing or invalid id_key.'
77
+ end
96
78
 
97
- # log outcomes
98
- puts ">> pagemaster :: " + valid.to_s + " pages were generated from " + @src + " to " + @targetdir + " directory."
99
- puts ">> pagemaster :: " + nonunique.to_s + " items were skipped because of non-unique names."
100
- puts ">> pagemaster :: " + untitled.to_s + " items were skipped because of missing titles."
101
- end
102
- end
79
+ def slug(str)
80
+ str.downcase.tr(' ', '_').gsub(/[^:\w-]/, '')
81
+ end
82
+ end
103
83
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagemaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marii Nyröp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-30 00:00:00.000000000 Z
11
+ date: 2018-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -24,7 +24,63 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
- description: jekyll .md page generator plugin from csv or yaml files
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.16'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.16'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faker
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0.5'
83
+ description: jekyll plugin for generating md pages from csv/json/yml
28
84
  email:
29
85
  executables: []
30
86
  extensions: []
@@ -51,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
107
  version: '0'
52
108
  requirements: []
53
109
  rubyforge_project:
54
- rubygems_version: 2.6.14
110
+ rubygems_version: 2.7.6
55
111
  signing_key:
56
112
  specification_version: 4
57
113
  summary: jekyll pagemaster plugin