black-widow 0.0.1.alpha → 0.0.2.alpha

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
2
  SHA256:
3
- metadata.gz: 451595693d9f9d1da12fde89fceabc4d2f2910f845828e9a6741fc500af34804
4
- data.tar.gz: 0f0e5bd73f61d9df812fb018e3f78205c435e9b4fee5b03f2dca53c03ee4ab91
3
+ metadata.gz: 876454d736fa938ca409a2c89c2407fe6fd03b755a6cfbf7cc9e3230c46d9581
4
+ data.tar.gz: 79106c4d5e2c27b11f585cd367e39a0d10446048cac23fc64d94d714b96b9baa
5
5
  SHA512:
6
- metadata.gz: 0a68f6762019fdbb776eacd54e1fc61177050922b4c42694e566b96fc8dc599a539c91a75e26c753ca2568fba69b39eca5fa57c0989fa34c48382ed2b248ba48
7
- data.tar.gz: ddc7f3a8648225dbef2f15ee650aa8dc5dc3ebc68028048f4606c2dbc3240e7781045ac9e9b1ee27843006d9d8c3dd1effcc7b67cbd2ea4e9ccd0945d88b4b28
6
+ metadata.gz: 32abef3685b16d28669aeb962415c759886fc8c46d2a6cd60ac0a6548afb44401197b3a9abbdb1f3832e3f0077f033a18c58d6ff712ccbd9a06feff796fb6493
7
+ data.tar.gz: 323c360361b4d4bad1eaffa5c7f4fade0db735dea4d0f369d52b14df8c87487c04e75d41fcb90990a2d8405874b9afe0f2a941e90590c9abd7c8caff77dd787b
data/.gitignore CHANGED
@@ -8,4 +8,8 @@ tmp/*
8
8
 
9
9
  # Ruby Stuff
10
10
  Gemfile.lock
11
- *.gem
11
+ *.gem
12
+
13
+ # Built documentation & documentation files
14
+ doc/*
15
+ .yardoc/
data/Gemfile CHANGED
@@ -5,3 +5,7 @@ source "https://rubygems.org"
5
5
  gem 'rake'
6
6
  # TODO:
7
7
  # gem 'sass'
8
+
9
+ group :development do
10
+ gem 'yard'
11
+ end
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Black Widow
2
2
 
3
3
  Do *NOT* use this gem yet! It isn't even close to done!
4
- *TODO*
4
+
5
+
6
+ Black Widow is a static site generator for people who like using ActionView
7
+ but want static html files instead of a heavyweight rails server.
data/Rakefile CHANGED
@@ -1,5 +1,11 @@
1
1
  task default: %w[test]
2
2
 
3
3
  task :test do
4
+ raise NotImplementedError.new "Testing has not yet been implemented."
4
5
  ruby "test/driver.rb"
6
+ end
7
+
8
+ # Generates documentation, putting the resulting .html files in doc/
9
+ task :gendocs do
10
+ `yard doc --readme README.md - LICENSE`
5
11
  end
@@ -9,6 +9,78 @@ require 'pathname'
9
9
  require 'getoptlong'
10
10
  require 'black-widow'
11
11
 
12
+ ##
13
+ # Creates a new BlackWidow project skeleton
14
+ #
15
+ # This function creates a new project directory and populates it with a
16
+ # config.yaml file and folders for view components.
17
+ #
18
+ # @param name: String
19
+ # The name of the project. This will also be the name of the project
20
+ # directory.
21
+ #
22
+ # @return void
23
+ #
24
+ def init_project name
25
+ root = Pathname.new Dir.pwd
26
+ if (root + name).exist? then
27
+ raise ArgumentError 'Project could not be created; directory already exists.'
28
+ end
29
+ root += name
30
+ root.mkpath
31
+
32
+ BlackWidow::ViewEngine::VIEW_FOLDERS.each_value do |dir|
33
+ (root + dir).mkpath
34
+ end
35
+
36
+ config = File.new root.join(BlackWidow.CONFIG_FILE_NAME), 'w+'
37
+ end
38
+
39
+ def render_project opts = {}
40
+ out_dir = opts[:out_dir] || 'dist/'
41
+ # TODO: put default layout in config. Magic strings are no bueno :(
42
+ layout = opts[:layout] || 'application'
43
+ # Project root directory is the directory with the config file
44
+ engine = nil
45
+ dest = Pathname.new(Dir.pwd) + out_dir
46
+
47
+ begin
48
+ engine = BlackWidow::ViewEngine.new File.dirname BlackWidow::resolve_config
49
+ rescue IOError => e
50
+ err e, 4
51
+ end
52
+
53
+ Pathname.new(engine.root).each_child do |file|
54
+ if file.directory?
55
+ puts "Directory #{file} reached. TODO: Implement namespace rendering"
56
+ else
57
+ # Extract the filename, which is the same as the view name
58
+ view = file.basename.split('.')[0]
59
+ page_contents = engine.render view, opts
60
+
61
+ page_file = File.new dest + (view + '.html'), 'w+'
62
+ page_file.write page_contents
63
+ page_file.close
64
+ end
65
+ end
66
+
67
+ ##
68
+ # Prints an error message and exits with an error status
69
+ #
70
+ # @param err: Exception | RuntimeException | StandardErr | String
71
+ # The error being thrown.
72
+ #
73
+ # @param status: Number
74
+ # The exit status. Defaults to 1.
75
+ #
76
+ def err err, status = 1
77
+ err_type = if err.is_a? Exception then err.class.name else 'Error' end
78
+ err_msg = if err.is_a? Exception then err.message else err end
79
+
80
+ puts "BlackWidow: - #{err_type} #{err_msg}"
81
+ exit status
82
+ end
83
+
12
84
  # Base command usage message
13
85
  USAGE = {}
14
86
  HELP = {}
@@ -65,6 +137,10 @@ EOF
65
137
  HELP[:render] = <<-EOF
66
138
  EOF
67
139
 
140
+ ################################################################################
141
+ ################################ START OF SCRIPT ###############################
142
+ ################################################################################
143
+
68
144
  # :_ key is all unnamed arguments from ARGV
69
145
  ARGS = { _: [] }
70
146
  next_arg = :command # First unnamed arg is expected to be a sub command
@@ -84,7 +160,8 @@ ARGV.each do |arg|
84
160
  end
85
161
  end
86
162
 
87
- if ARGS[:help] || !!ARGV.length
163
+ # Help is specified, or no args are passed.
164
+ if ARGS[:help] || ARGV.length == 0
88
165
  if ARGS[:command] && HELP.include?(ARGS[:command].to_sym)
89
166
  puts HELP[ARGS[:command].to_sym]
90
167
  else
@@ -102,8 +179,12 @@ case ARGS[:command]
102
179
  # Handle 'new' command
103
180
  when 'n', 'new'
104
181
  unless ARGS[:name]
105
- puts USAGE_NEW
182
+ err USAGE[:new]
106
183
  exit 1
184
+ else
185
+ puts ARGS[:name]
186
+ init_project ARGS[:name]
187
+ exit 0
107
188
  end
108
189
  # Handle 'generate' command
109
190
  when 'g', 'gen', 'generate'
@@ -127,58 +208,11 @@ when 'r', 'render'
127
208
 
128
209
  exit 0
129
210
  else
130
- puts USAGE
211
+ puts USAGE[:base]
131
212
  exit 1
132
213
  end
133
214
 
134
- ##
135
- # Creates a new BlackWidow project skeleton
136
- #
137
- # This function creates a new project directory and populates it with a
138
- # config.yaml file and folders for view components.
139
- #
140
- # @param name: String
141
- # The name of the project. This will also be the name of the project
142
- # directory.
143
- #
144
- # @return void
145
- #
146
- def init_project name
147
- root = Pathname.new Dir.pwd
148
- if (root + name).exist? then
149
- raise ArgumentError 'Project could not be created; directory already exists.'
150
- end
151
-
152
- root.mkpath name
153
- root.join name
154
- ViewEngine::FOLDERS.each_value do |dir|
155
- root.mkpath dir
156
- end
157
- config = File.new root.join(BlackWidow::CONFIG_FILE_NAME), 'w+'
158
- end
159
-
160
- def render_project
161
- # Project root directory is the directory with the config file
162
- root = File.dirname BlackWidow::resolve_config
163
- Dir.chdir root
164
- end
165
215
 
166
- ##
167
- # Prints an error message and exits with an error status
168
- #
169
- # @param err: Exception | RuntimeException | StandardErr | String
170
- # The error being thrown.
171
- #
172
- # @param status: Number
173
- # The exit status. Defaults to 1.
174
- #
175
- def err err, status = 1
176
- err_type = if err.is_a? Error then err.class.name else 'Error' end
177
- err_msg = err.message || err
178
-
179
- puts "BlackWidow: - #{err.type} #{err_msg}"
180
- exit status
181
- end
182
216
 
183
217
  # engine = BlackWidow::ViewEngine.new Pathname.new(Dir.pwd).join 'src'
184
218
  # puts(engine.render 'index')
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
15
15
  # s.bindir = 'bin'
16
16
 
17
17
  s.add_dependency 'rake', '~> 0'
18
+ s.add_development_dependency 'yard', '~> 0'
18
19
 
19
20
  s.files = `git ls-files`.split("\n")
20
21
 
@@ -3,46 +3,51 @@
3
3
  # Black Widow
4
4
  # by Donald Isaac (https://www.opensourceryumd.com)
5
5
  # Copyright (c) 2019 Open Sourcery. See LICENSE for license details.
6
- require 'black-widow/engine'
7
6
  require 'pathname'
8
7
  require 'yaml'
9
8
 
10
9
  module BlackWidow
11
- CONFIG_FILE_NAME = '.black-widow.yaml'
12
- @config = nil
10
+ # Internal requires
11
+ autoload :ViewEngine 'black-widow/engine'
12
+ autoload :Config 'black-widow/config'
13
+ # autoload :command 'black-widow/command'
13
14
 
14
- ##
15
- # Resolves the location of the config file.
16
- #
17
- # If no config file exists in the current directory, then the parent
18
- # directory is checked. This is done until the file is found or the root
19
- # directory is reached, in which case an IOError is raised.
20
- #
21
- # @return The absolute path to the config file.
22
- #
23
- def self.resolve_config
24
- config_path = Pathname.new Dir.pwd
25
-
26
- # Ascend up the file tree until a .black-widow.yaml file is found
27
- until config_path.children(false).include? CONFIG_FILE_NAME do
28
- # A path is equal to its parent if and only if it is the root directory
29
- if config_path == config_path.parent
30
- raise IOError.new 'BlackWidow: Could not find a ' + CONFIG_FILE_NAME +
31
- ' file. Are you running this command in your project directory?'
32
- else
33
- config_path = config_path.parent
15
+ class << self
16
+ CONFIG_FILE_NAME = '.black-widow.yaml'
17
+ @config = nil
18
+
19
+ ##
20
+ # Resolves the location of the config file.
21
+ #
22
+ # If no config file exists in the current directory, then the parent
23
+ # directory is checked. This is done until the file is found or the root
24
+ # directory is reached, in which case an IOError is raised.
25
+ #
26
+ # @raise [IOError] If the config file could not be found
27
+ #
28
+ # @return [String] The absolute path to the config file.
29
+ #
30
+ def resolve_config
31
+ config_path = Pathname.new Dir.pwd
32
+
33
+ # Ascend up the file tree until a .black-widow.yaml file is found
34
+ until config_path.children(false).include? CONFIG_FILE_NAME do
35
+ # A path is equal to its parent if and only if it is the root directory
36
+ if config_path == config_path.parent
37
+ raise IOError.new 'BlackWidow: Could not find a ' + CONFIG_FILE_NAME +
38
+ ' file. Are you running this command in your project directory?'
39
+ else
40
+ config_path = config_path.parent
41
+ end
34
42
  end
43
+
44
+ config_path.join CONFIG_FILE_NAME
35
45
  end
36
-
37
- config_path.join CONFIG_FILE_NAME
38
- end
39
-
40
- def self.config
41
- if !@config
42
- @config = resolve_config
43
- else
44
- @config
46
+
47
+ def config
48
+ @config ||= resolve_config
45
49
  end
46
50
  end
51
+
47
52
 
48
53
  end
@@ -0,0 +1,14 @@
1
+ module BlackWidow
2
+ class Command
3
+ class << self
4
+ def subclasses
5
+ @subclasses ||= []
6
+ end
7
+
8
+ def inherited base
9
+ subclasses << base
10
+ super base
11
+ end
12
+ end # !class << self
13
+ end # !Command
14
+ end # !BlackWidow
@@ -0,0 +1,64 @@
1
+ module BlackWidow
2
+ ##
3
+ # Manages system configuration data.
4
+ #
5
+ # @author Donald Isaac
6
+ #
7
+ class Config
8
+ # Default name of the user's configuration file
9
+ DEFAULT_CONFIG_FILE_NAME = 'config.yml'.freeze
10
+
11
+ # Default configuration
12
+ DEFAULTS = Hash[
13
+ 'out_dir' => 'dist/', # Where the compiled site will go
14
+ 'src_dir' => 'src/', # Where view components are
15
+ 'asset_dir' => 'assets/' # Where to find view assets
16
+ ].map {|k, v| v.freeze}.freeze
17
+
18
+ attr_accessor :config
19
+
20
+ def initialize config_file
21
+ _user_config = load_from config_file
22
+ @config = DEFAULTS.merge _user_config
23
+
24
+ end
25
+
26
+ ##
27
+ # Resolves the project's root directory.
28
+ #
29
+ # Starting at the current working directory, this function looks for a
30
+ # 'config.yml' file. If none is found, the parent is checked. This
31
+ # continues until the config file is found or the root directory is
32
+ # reached, upon which an IOError is thrown.
33
+ #
34
+ # @raise [IOError] if the config file could not be found.
35
+ #
36
+ # @return the absoulte path to the project's root directory.
37
+ #
38
+ def resolve_root
39
+ config_path = Pathname.new Dir.pwd
40
+
41
+ # Ascend up the file tree until a config.yml file is found
42
+ until config_path.children(false).include? CONFIG_FILE_NAME do
43
+ # A path is equal to its parent if and only if it is the root directory
44
+ if config_path == config_path.parent
45
+ raise IOError.new 'BlackWidow: Could not find a ' + CONFIG_FILE_NAME +
46
+ ' file. Are you sure you\'re running this command in your project directory?'
47
+ else
48
+ config_path = config_path.parent
49
+ end
50
+ end
51
+
52
+ return config_path
53
+ end
54
+
55
+ ##
56
+ # Gets the project's root directory.
57
+ #
58
+ # @return the absolute path to the project's root directory.
59
+ def root
60
+ @root ||= resolve_root
61
+ end
62
+
63
+ end
64
+ end
@@ -127,10 +127,37 @@ module BlackWidow
127
127
  @view_components
128
128
  end
129
129
 
130
+ ##
131
+ # Gets the absolute path of each view component directory.
132
+ #
133
+ # The set of available view componets is specified in the VIEW_FOLDERS
134
+ # Hash. You can also access the project's root directory by passing
135
+ # :root
136
+ #
137
+ # @param component: String | Symbol
138
+ # The view component type.
139
+ #
140
+ # @return The absolute path to the view component directory.
141
+ #
142
+ def component_path component
143
+ # When the argument is a string, convert it into a symbol
144
+ component = component.to_sym if component.is_a? String
145
+ raise ArgumentError.new "Argument must be a symbol." unless component.is_a? Symbol
146
+
147
+ if component == :root
148
+ @root_dir
149
+ elsif @view_components[component]
150
+ selected = @view_components[component]
151
+ selected[:dir]
152
+ else
153
+ raise ArgumentError.new "Component type '#{component}' does not exist"
154
+ end
155
+ end
156
+
130
157
  private
131
158
 
132
159
  ##
133
- # Renders a view to HTML.
160
+ # Renders a page view to HTML.
134
161
  #
135
162
  # A view is the collection of data associated with a specific page.
136
163
  # This data includes the erb template and it's associated context data.
@@ -0,0 +1,6 @@
1
+ module BlackWidow
2
+ class Renderer
3
+ class << self
4
+ end
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module BlackWidow
2
- VERSION = '0.0.1.alpha'
2
+ VERSION = '0.0.2.alpha'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: black-widow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha
4
+ version: 0.0.2.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Donald Isaac
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-05 00:00:00.000000000 Z
11
+ date: 2019-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -24,10 +24,24 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: yard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: A simple static site generator powered by eRuby
28
42
  email:
29
43
  executables:
30
- - black-widow
44
+ - blackwidow
31
45
  extensions: []
32
46
  extra_rdoc_files: []
33
47
  files:
@@ -36,10 +50,13 @@ files:
36
50
  - LICENSE
37
51
  - README.md
38
52
  - Rakefile
39
- - bin/black-widow
53
+ - bin/blackwidow
40
54
  - black-widow.gemspec
41
55
  - lib/black-widow.rb
56
+ - lib/black-widow/command.rb
57
+ - lib/black-widow/config.rb
42
58
  - lib/black-widow/engine.rb
59
+ - lib/black-widow/renderer.rb
43
60
  - lib/black-widow/version.rb
44
61
  - test/driver.rb
45
62
  homepage: https://www.opensourceryumd.com