stack 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,7 +10,9 @@ begin
10
10
  gem.email = "dev@sixones.com"
11
11
  gem.homepage = "http://github.com/sixones/stack"
12
12
  gem.authors = ["sixones"]
13
+ gem.files = FileList['lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
13
14
  gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
15
+
14
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
17
  end
16
18
  rescue LoadError
@@ -43,10 +45,20 @@ task :default => :test
43
45
 
44
46
  require 'rake/rdoctask'
45
47
  Rake::RDocTask.new do |rdoc|
46
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+ if File.exist?('VERSION.yml')
49
+ config = YAML.load(File.read('VERSION.yml'))
50
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
51
+ else
52
+ version = ""
53
+ end
47
54
 
48
55
  rdoc.rdoc_dir = 'rdoc'
49
56
  rdoc.title = "stack #{version}"
50
57
  rdoc.rdoc_files.include('README*')
51
58
  rdoc.rdoc_files.include('lib/**/*.rb')
52
59
  end
60
+
61
+ desc "provide a console like merb -i or script/console"
62
+ task :console do
63
+ exec "irb -r irb/completion -r lib/stack.rb"
64
+ end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 0
4
+ :patch: 2
data/bin/stack CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'stack'
2
3
 
3
- require 'optparse'
4
- require 'stack'
4
+ Stack::runner = Stack::Runner.new(ARGV)
5
+ Stack::runner.run!
@@ -0,0 +1,63 @@
1
+ class Hash
2
+
3
+ # Returns a new hash just like this one, but with all the string keys expressed as symbols.
4
+ # Also applies to hashes within self.
5
+ # Based on an implementation within Rails 2.x, thanks Rails!
6
+ def deep_symbolize
7
+ target = dup
8
+ target.inject({}) do |memo, (key, value)|
9
+ value = value.deep_symbolize if value.is_a?(Hash)
10
+ memo[(key.to_sym rescue key) || key] = value
11
+ memo
12
+ end
13
+ end
14
+
15
+ # Subtracts one hash from another by removing keys from the actor and recursing on any hash values.
16
+ # Returns a new Hash without affecting the actors.
17
+ # Example 1:
18
+ # {:foo=>"bar"} - {:foo=>"bar"} == {}
19
+ # Example 2 of deep nesting:
20
+ # {:foo=>{:bar=>"baz", :car=>"naz"}, :bar=>"baz"} - {:foo=>{:car=>"naz"}} == {:foo=>{:bar=>"baz"}, :bar=>"baz"}
21
+ def -(arg)
22
+ target = dup; actor = arg.dup
23
+ actor.each do |key, value|
24
+ if value.is_a?(Hash)
25
+ target[key] = target[key] - value
26
+ else
27
+ target.delete(key)
28
+ end
29
+ end
30
+ return target
31
+ end
32
+
33
+ # Returns a new hash just like this one, but with all STRING keys and values evaluated
34
+ # and rendered as liquid templates using the provided payload hash.
35
+ def deep_liquify(payload={})
36
+ target = dup
37
+ target.inject({}) do |memo, (key, value)|
38
+ value = value.deep_liquify(payload) if value.is_a?(Hash)
39
+ value = value.liquify(payload) if value.is_a?(String)
40
+ key = key.liquify(payload) if key.is_a?(String)
41
+ memo[(key.to_sym rescue key) || key] = value
42
+ memo
43
+ end
44
+ end
45
+
46
+ # Merges self with another hash, recursively.
47
+ #
48
+ # This code was lovingly stolen from some random gem:
49
+ # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
50
+ #
51
+ # Thanks to whoever made it.
52
+ def deep_merge(hash)
53
+ target = dup
54
+ hash.keys.each do |key|
55
+ if hash[key].is_a? Hash and self[key].is_a? Hash
56
+ target[key] = target[key].deep_merge(hash[key])
57
+ next
58
+ end
59
+ target[key] = hash[key]
60
+ end
61
+ target
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ module Stack
2
+ class Configuration
3
+ attr_accessor :source, :target
4
+
5
+ def initialize(hash = nil)
6
+ self.from_hash(hash)
7
+ end
8
+
9
+ def from_hash(hash)
10
+ if (hash != nil)
11
+ @source = hash[:source]
12
+ @target = hash[:target]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Stack
2
+ class Generator
3
+ def initialize
4
+ puts "Source -> #{Stack::runner.configuration.source}"
5
+
6
+ # read layouts
7
+ # read "objects"
8
+ # read pages
9
+ # write pages
10
+ end
11
+
12
+ def layouts
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,42 @@
1
+ module Stack
2
+ class Runner
3
+ attr_accessor :configuration
4
+ attr_accessor :command
5
+ attr_accessor :arguments
6
+
7
+ def initialize(argv)
8
+ @argv = argv
9
+ @options = { }
10
+
11
+ parse!
12
+ end
13
+
14
+ # Parse options, command and arguments
15
+ def parse!
16
+ options = Stack::parse! @argv
17
+
18
+ @configuration = Stack::Configuration.new(options)
19
+
20
+ @command = @argv.shift
21
+ @arguments = @argv
22
+ end
23
+
24
+ # Run stack!
25
+ def run!
26
+ if @command.nil?
27
+ @command = "generate"
28
+ end
29
+
30
+ if Stack::COMMANDS.include?(@command)
31
+ run_command
32
+ else
33
+ abort "Unknown command: #{@command}. Use one of #{Stack::COMMANDS.join(", ")}."
34
+ end
35
+ end
36
+
37
+ # Runs the specified command
38
+ def run_command
39
+ Stack::Generator.new
40
+ end
41
+ end
42
+ end
data/lib/stack.rb CHANGED
@@ -1,28 +1,82 @@
1
1
  # rubygems
2
2
  require 'rubygems'
3
+ require 'optparse'
4
+
5
+ require 'core_ext/hash'
6
+
7
+ require 'stack/configuration'
8
+ require 'stack/generator'
9
+ require 'stack/runner'
3
10
 
4
11
  module Stack
5
- # Default options used by stack, overridden from the command line or stack configration file.
12
+ # Default options used by stack, overridden from the command line or YML configration file.
6
13
  DEFAULTS = {
7
-
14
+ :source => '.',
15
+ :target => File.join('.', '_stack')
8
16
  }.freeze
9
17
 
18
+ # Array of valid commands stack can use
19
+ COMMANDS = %w(create generate server)
20
+
21
+ class << self
22
+ attr_accessor :runner
23
+ end
24
+
25
+ # Parses the options configuration from the command line
26
+ def self.parse!(argv)
27
+ config = { }
28
+
29
+ parser = OptionParser.new do |opts|
30
+ opts.banner = "Usage: stack [options] #{Stack::COMMANDS.join('|')}"
31
+
32
+ opts.on("-s", "--source [DIR]", "Directory to use as the source for generating a stack") do |l| config[:source] = l unless l.nil? end
33
+ opts.on("-t", "--target [DIR]", "Directory to use as the target directory") do |l| config[:target] = l unless l.nil? end
34
+
35
+ opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
36
+ opts.on_tail("-v", "--version" "Show version") do puts "stack #{Stack::version}"; exit; end
37
+ end
38
+
39
+ parser.parse! argv
40
+
41
+ options = Stack::configuration(config)
42
+
43
+ options
44
+ end
45
+
46
+ # Merges the configuration from YAML file, command line and defaults
10
47
  def self.configuration(override)
11
48
  config = { }
49
+ source = File.join(override['source'] || Stack::DEFAULTS[:source])
50
+
51
+ config_file = File.join(source, "_stack.yml")
12
52
 
13
53
  begin
14
- #config = YAML.load_file(config_file)
15
- rescue => error
54
+ yml = YAML.load_file(config_file)
16
55
 
56
+ raise "Invalid configuration - #{config_file}" if !config.is_a?(Hash)
57
+
58
+ yml.each { |key, value| config[key.to_sym] = value }
59
+
60
+ STDOUT.puts "Configuration loaded from #{config_file}"
61
+ rescue => error
62
+ STDERR.puts "WARNING: Could not read configuration. Using defaults (and options)."
63
+ STDERR.puts "\t" + error.to_s
17
64
  end
18
65
 
19
66
  # Merge configuration with defaults
20
- Stack::DEFAULTS.deep_merge(config).deep_merge(override)
67
+ Stack::DEFAULTS.deep_merge(override).deep_merge(config)
21
68
  end
22
69
 
23
70
  # Stacks current version
24
71
  def self.version
25
- yml = YAML.load(File.read(File.join(File.dirname(__FILE__), *%w[.. VERSION.yml])))
26
- "#{yml[:major]}.#{yml[:minor]}.#{yml[:patch]}"
72
+ version_file = File.join(File.dirname(__FILE__), *%w[.. VERSION.yml])
73
+
74
+ if File.exist?(version_file)
75
+ yml = YAML.load(File.read(version_file))
76
+
77
+ "#{yml[:major]}.#{yml[:minor]}.#{yml[:patch]}"
78
+ else
79
+ "0.0.0"
80
+ end
27
81
  end
28
82
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - sixones
@@ -32,13 +32,16 @@ extra_rdoc_files:
32
32
  - LICENSE
33
33
  - README.rdoc
34
34
  files:
35
- - .document
36
- - .gitignore
37
35
  - LICENSE
38
36
  - README.rdoc
39
37
  - Rakefile
40
- - VERSION
38
+ - VERSION.yml
39
+ - bin/stack
40
+ - lib/core_ext/hash.rb
41
41
  - lib/stack.rb
42
+ - lib/stack/configuration.rb
43
+ - lib/stack/generator.rb
44
+ - lib/stack/runner.rb
42
45
  - test/helper.rb
43
46
  - test/test_stack.rb
44
47
  has_rdoc: true
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.1