moka 0.1.1

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.
Files changed (49) hide show
  1. data/LICENSE.txt +20 -0
  2. data/Manifest +48 -0
  3. data/README.rdoc +9 -0
  4. data/Rakefile +17 -0
  5. data/bin/moka +21 -0
  6. data/lib/commands.rb +54 -0
  7. data/lib/commands/compile.rb +77 -0
  8. data/lib/commands/delete.rb +47 -0
  9. data/lib/commands/group/delete.rb +59 -0
  10. data/lib/commands/group/group_generator.rb +115 -0
  11. data/lib/commands/group/inspect.rb +40 -0
  12. data/lib/commands/group/new.rb +2 -0
  13. data/lib/commands/group/template/groupdir/variables.yml +1 -0
  14. data/lib/commands/inspect.rb +55 -0
  15. data/lib/commands/lib/compiler.rb +114 -0
  16. data/lib/commands/lib/helpers.rb +156 -0
  17. data/lib/commands/lib/lipsum_constants.rb +159 -0
  18. data/lib/commands/lib/lipsum_helpers.rb +56 -0
  19. data/lib/commands/lib/page_scope.rb +29 -0
  20. data/lib/commands/lib/partials_inclusion.rb +42 -0
  21. data/lib/commands/lib/site_tree.rb +274 -0
  22. data/lib/commands/lib/string_inflectors.rb +13 -0
  23. data/lib/commands/lib/utilities.rb +45 -0
  24. data/lib/commands/new.rb +64 -0
  25. data/lib/commands/order_groups.rb +115 -0
  26. data/lib/commands/order_pages.rb +128 -0
  27. data/lib/commands/page/delete.rb +47 -0
  28. data/lib/commands/page/inspect.rb +35 -0
  29. data/lib/commands/page/new.rb +2 -0
  30. data/lib/commands/page/page_generator.rb +130 -0
  31. data/lib/commands/page/template/pagedir/variables.yml +1 -0
  32. data/lib/commands/server.rb +125 -0
  33. data/lib/commands/site/inspect.rb +28 -0
  34. data/lib/commands/site/new.rb +10 -0
  35. data/lib/commands/site/site_generator.rb +93 -0
  36. data/lib/commands/site/template/manifest.yml +4 -0
  37. data/lib/commands/site/template/project/lib/helpers.rb +1 -0
  38. data/lib/commands/site/template/project/site/content.erb +14 -0
  39. data/lib/commands/site/template/project/site/header.erb +7 -0
  40. data/lib/commands/site/template/project/site/layout.erb +20 -0
  41. data/lib/commands/site/template/project/site/navigation.erb +7 -0
  42. data/lib/commands/site/template/project/site/variables.yml +1 -0
  43. data/lib/commands/site/template/project/styles/style.sass +74 -0
  44. data/lib/commands/site/template/script/config/boot.rb +5 -0
  45. data/lib/commands/site/template/script/moka +4 -0
  46. data/lib/script_moka_loader.rb +14 -0
  47. data/lib/version.rb +10 -0
  48. data/moka.gemspec +39 -0
  49. metadata +182 -0
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'getoptlong'
4
+
5
+ if ARGV.include? '--help' or ARGV.include? '-h'
6
+ puts <<-EOT
7
+
8
+ Usage:
9
+
10
+ moka new site site_name
11
+
12
+ or
13
+
14
+ moka new page page_name
15
+
16
+ or
17
+
18
+ moka new page group_name:page_name...
19
+
20
+ or
21
+
22
+ moka new group group_name...
23
+
24
+ Examples:
25
+
26
+ moka new site my_site_name
27
+ create a brand new moka project named 'my_site_name'
28
+
29
+ moka new page groupname:pagename -vars=var_name:var_value other_var_name:other_var_value
30
+ create a page named 'pagename' in group 'groupname' using layout 'custom_layout' that will compile in 'mydir/mypage.php' and has a custom variable 'customvar' with value 'customvalue'
31
+
32
+ moka new page groupname:pagename -t anothergroup:anotherpage
33
+ create a page named 'pagename' in group 'groupname' that replicates partials and variables used by page 'anotherpage' in group 'anothergroup'
34
+
35
+ moka new group group_name -t anothergroup
36
+ create a group named 'group_name' that replicates the same pages, partials and variables of group 'anothergroup'
37
+
38
+ Options:
39
+
40
+ -t, --template:
41
+ specify another page or group or moka site to use as a template to create the new page/group/site. The new page/group/site will have a copy of all the partials, variables and pages of the template page/group/site, apart from those variables that are explicitly set as command line arguments.
42
+ -v, --vars:
43
+ set variables in the appropriate variables.yml file. Syntax is:
44
+ -vars=var_name:var_value other_var_name:other_var_value ...
45
+ or
46
+ -v var_name:var_value other_var_name:other_var_value ...
47
+ variables are saved as strings. Other variable types can be set by editing directly the variables.yml file with a text editor.
48
+ EOT
49
+ exit
50
+ end
51
+
52
+ thing_to_be_created = ARGV.shift
53
+
54
+ case thing_to_be_created
55
+ when 'page', 'p'
56
+ require File.expand_path('page/new', File.dirname(__FILE__))
57
+ when 'group', 'g'
58
+ require File.expand_path('group/new', File.dirname(__FILE__))
59
+ when 'site', 'project', 's'
60
+ require File.expand_path('site/new', File.dirname(__FILE__))
61
+ else
62
+ puts "ERROR: invalid option #{thing_to_be_created}. Valid options are 'site', 'page' and 'group'."
63
+ exit
64
+ end
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "thor"
5
+ require "thor/group"
6
+
7
+ module Moka
8
+ module OrderGivers
9
+ class GroupOrderGiver < Thor::Group
10
+ require "yaml"
11
+ require File.expand_path('lib/utilities', File.dirname(__FILE__))
12
+ require File.expand_path('lib/site_tree', File.dirname(__FILE__))
13
+
14
+ include Thor::Actions
15
+ include Moka::SiteTree
16
+
17
+ class_option :help, :type => :boolean, :aliases => "-h"
18
+
19
+ def provide_help_if_needed
20
+ if options[:help]
21
+ say <<-EOT
22
+
23
+ Usage:
24
+
25
+ moka order_groups
26
+
27
+ Examples:
28
+ moka order_groups
29
+ launch a CLI utility to display and edit the order groups
30
+
31
+ EOT
32
+ exit
33
+ end
34
+ end
35
+
36
+ def load_manifest
37
+ @manifest = YAML.load_file(File.expand_path("manifest.yml", MOKA_ROOT))
38
+ @site = SiteNode.new("site", @manifest["site"])
39
+ end
40
+
41
+ def ask_for_new_order
42
+ counter = 0
43
+ say ""
44
+ say "The current group order is the following:\n"
45
+ @site.groups.each do |group|
46
+ say "#{GroupOrderGiver.counter_to_letters(counter)} - #{group.name}"
47
+ counter += 1
48
+ end
49
+ say ""
50
+ @input = ask "Specify a new ordering as a string of space-separated indices, or press enter to do nothing (example: to switch the second and the third items insert 'a c b'):\n"
51
+ end
52
+
53
+ def reorder
54
+ input_array = @input.gsub(/[^a-z\s]/, "").split(/\s+/).map{|i| GroupOrderGiver.letters_to_counter(i)}.uniq.delete_if{|i| i < 0 or i > @site.groups.size - 1}
55
+ if input_array.size <= 0
56
+ exit
57
+ end
58
+ counter = 0
59
+ counter_two = 0
60
+ @site.groups.each do |group|
61
+ unless input_array.index(counter).nil?
62
+ @manifest["site"][group.name]["order"] = input_array.index(counter) + 1
63
+ else
64
+ @manifest["site"][group.name]["order"] = input_array.size + counter_two + 1
65
+ counter_two += 1
66
+ end
67
+ counter += 1
68
+ end
69
+ end
70
+
71
+ def dump_manifest
72
+ f = File.open( File.expand_path('manifest.yml', MOKA_ROOT), 'w' ) do |out|
73
+ YAML.dump( @manifest, out )
74
+ end
75
+ say_status "update", "manifest.yml", :green
76
+ end
77
+
78
+ def notify_new_order
79
+ say ""
80
+ say "The new group order is the following:\n"
81
+ counter = 0
82
+ @site = SiteNode.new("", @manifest["site"])
83
+ @site.groups.each do |group|
84
+ say "#{GroupOrderGiver.counter_to_letters(counter)} - #{group.name}"
85
+ counter += 1
86
+ end
87
+ say ""
88
+ end
89
+
90
+ def self.counter_to_letters(c)
91
+ letters = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
92
+ if c < letters.size
93
+ return letters[c]
94
+ else
95
+ return GroupOrderGiver.counter_to_letters(c/letters.size - 1) + letters[c%letters.size]
96
+ end
97
+ end
98
+
99
+ def self.letters_to_counter(l)
100
+ letters = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
101
+ l.gsub(/[^a-z]/, "")
102
+ if l.size == 0
103
+ return -1
104
+ end
105
+ unless letters.index(l).nil?
106
+ return letters.index(l)
107
+ else
108
+ return letters.index(l[-1]) + letters.size*(GroupOrderGiver.letters_to_counter(l[0..-2]))
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ Moka::OrderGivers::GroupOrderGiver.start
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "thor"
5
+ require "thor/group"
6
+
7
+ module Moka
8
+ module OrderGivers
9
+ class PageOrderGiver < Thor::Group
10
+ require "yaml"
11
+ require File.expand_path('lib/utilities', File.dirname(__FILE__))
12
+ require File.expand_path('lib/site_tree', File.dirname(__FILE__))
13
+
14
+ include Thor::Actions
15
+ include Moka::SiteTree
16
+
17
+ argument :group_name, :required => false, :default => 'root'
18
+ class_option :help, :type => :boolean, :aliases => "-h"
19
+
20
+ def provide_help_if_needed
21
+ if options[:help]
22
+ say <<-EOT
23
+
24
+ Usage:
25
+
26
+ moka order_pages [group]
27
+
28
+ Examples:
29
+ moka order_pages
30
+ launch a CLI utility to display and edit the order of pages in group 'root'
31
+
32
+ moka order_pages mygroup
33
+ launch a CLI utility to display and edit the order of pages in group 'mygroup'
34
+
35
+ EOT
36
+ exit
37
+ end
38
+ end
39
+
40
+ def load_manifest
41
+ @manifest = YAML.load_file(File.expand_path("manifest.yml", MOKA_ROOT))
42
+ @site = SiteNode.new("site", @manifest["site"])
43
+ end
44
+
45
+ def verify_group_existence
46
+ @group = @site.find_group(group_name)
47
+ if @group.nil?
48
+ say_status "ERROR:", "cannot find group '#{group_name}'", :red
49
+ exit
50
+ end
51
+ end
52
+
53
+ def ask_for_new_order
54
+ counter = 0
55
+ say ""
56
+ say "The current page order in group '#{group_name}' is the following:\n"
57
+ @group.pages.order_by(:order).each do |page|
58
+ say "#{PageOrderGiver.counter_to_letters(counter)} - #{page.name}"
59
+ counter += 1
60
+ end
61
+ say ""
62
+ @input = ask "Specify a new ordering as a string of space-separated indices, or press enter to do nothing (example: to switch the second and the third items insert 'a c b'):\n"
63
+ end
64
+
65
+ def reorder
66
+ input_array = @input.gsub(/[^a-z\s]/, "").split(/\s+/).map{|i| PageOrderGiver.letters_to_counter(i)}.uniq.delete_if{|i| i < 0 or i > @group.pages.size - 1}
67
+ if input_array.size <= 0
68
+ exit
69
+ end
70
+ counter = 0
71
+ counter_two = 0
72
+ @group.pages.order_by(:order).each do |page|
73
+ unless input_array.index(counter).nil?
74
+ @manifest["site"][@group.name][page.name]["order"] = input_array.index(counter) + 1
75
+ else
76
+ @manifest["site"][@group.name][page.name]["order"] = input_array.size + counter_two + 1
77
+ counter_two += 1
78
+ end
79
+ counter += 1
80
+ end
81
+ end
82
+
83
+ def dump_manifest
84
+ f = File.open( File.expand_path('manifest.yml', MOKA_ROOT), 'w' ) do |out|
85
+ YAML.dump( @manifest, out )
86
+ end
87
+ say_status "update", "manifest.yml", :green
88
+ end
89
+
90
+ def notify_new_order
91
+ say ""
92
+ say "The new page order in group '#{group_name}' is the following:\n"
93
+ counter = 0
94
+ @site = SiteNode.new("", @manifest["site"])
95
+ @group = @site.find_group(group_name)
96
+ @group.pages.each do |page|
97
+ say "#{PageOrderGiver.counter_to_letters(counter)} - #{page.name}"
98
+ counter += 1
99
+ end
100
+ say ""
101
+ end
102
+
103
+ def self.counter_to_letters(c)
104
+ letters = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
105
+ if c < letters.size
106
+ return letters[c]
107
+ else
108
+ return PageOrderGiver.counter_to_letters(c/letters.size - 1) + letters[c%letters.size]
109
+ end
110
+ end
111
+
112
+ def self.letters_to_counter(l)
113
+ letters = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
114
+ l.gsub(/[^a-z]/, "")
115
+ if l.size == 0
116
+ return -1
117
+ end
118
+ unless letters.index(l).nil?
119
+ return letters.index(l)
120
+ else
121
+ return letters.index(l[-1]) + letters.size*(PageOrderGiver.letters_to_counter(l[0..-2]))
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ Moka::OrderGivers::PageOrderGiver.start
@@ -0,0 +1,47 @@
1
+ require "yaml"
2
+ require "fileutils"
3
+ require File.expand_path('../lib/utilities', File.dirname(__FILE__))
4
+
5
+ opts = GetoptLong.new(
6
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ]
7
+ )
8
+
9
+ opts.each do |opt, arg|
10
+ case opt
11
+ when '--help'
12
+ RDoc::usage
13
+ end
14
+ end
15
+
16
+ if ARGV.first.nil?
17
+ puts "you need to specify a page name."
18
+ exit
19
+ end
20
+
21
+ # parse ARGV[0] to support syntax groupname:pagename
22
+ page_name, group = Moka::Moka::Utilities.parse_grouppage ARGV.first
23
+
24
+ path = ""
25
+ manifest = YAML.load_file(File.expand_path("manifest.yml", MOKA_ROOT))
26
+
27
+ unless manifest["site"][group].nil? or manifest["site"][group][page_name].nil?
28
+ path = manifest["site"][group][page_name]["path"]
29
+ else
30
+ puts "ERROR: cannot find any page named '#{page_name}' in group '#{group}'"
31
+ exit
32
+ end
33
+
34
+ manifest["site"][group].delete page_name
35
+
36
+ f = File.open( File.expand_path('manifest.yml', MOKA_ROOT), 'w' ) do |out|
37
+ YAML.dump( manifest, out )
38
+ end
39
+
40
+ FileUtils.rm_r(File.expand_path("project/site/#{group}/#{page_name}", MOKA_ROOT))
41
+ if File.exists? File.expand_path("compiled/"+path, MOKA_ROOT)
42
+ FileUtils.rm(File.expand_path("compiled/"+path, MOKA_ROOT))
43
+ end
44
+
45
+ puts ""
46
+ puts "Removed page #{group}:#{page_name}"
47
+ puts ""
@@ -0,0 +1,35 @@
1
+ require "yaml"
2
+ require "fileutils"
3
+ require File.expand_path('../lib/utilities', File.dirname(__FILE__))
4
+ require File.expand_path('../lib/site_tree', File.dirname(__FILE__))
5
+
6
+ include Moka::SiteTree
7
+
8
+ if ARGV.first.nil?
9
+ puts "you need to specify a page name."
10
+ exit
11
+ end
12
+
13
+ # parse ARGV[0] to support syntax groupname:pagename
14
+ page_name, group = Moka::Moka::Utilities.parse_grouppage ARGV.first
15
+
16
+ manifest = YAML.load_file(File.expand_path("manifest.yml", MOKA_ROOT))
17
+ @site = SiteNode.new("site", manifest["site"])
18
+
19
+ if @site.find_group(group).nil? or @site.find_group(group).find_page(page_name).nil?
20
+ puts "ERROR: cannot find page #{group}:#{page_name}"
21
+ exit
22
+ end
23
+
24
+ puts "\nPage #{page_name}"
25
+ puts "\n Variables:"
26
+ @site.find_group(group).find_page(page_name).variables.each do |var_name, var_value|
27
+ puts " #{var_name} = #{var_value.inspect}"
28
+ end
29
+ puts "\n Parameters:"
30
+ @site.find_group(group).find_page(page_name).params.each do |par_name, par_value|
31
+ puts " #{par_name} = #{par_value.inspect}"
32
+ end
33
+
34
+ puts ""
35
+
@@ -0,0 +1,2 @@
1
+ require File.expand_path('page_generator', File.dirname(__FILE__))
2
+ Moka::Generators::MokaPageGenerator.start
@@ -0,0 +1,130 @@
1
+ require "rubygems"
2
+ require "thor"
3
+ require "thor/group"
4
+
5
+ module Moka
6
+ module Generators
7
+ class MokaPageGenerator < Thor::Group
8
+
9
+ require "yaml"
10
+ require File.expand_path('../lib/utilities', File.dirname(__FILE__))
11
+ require File.expand_path('../lib/site_tree', File.dirname(__FILE__))
12
+
13
+ include Thor::Actions
14
+ include Moka::SiteTree
15
+
16
+ argument :name
17
+ class_option :template, :type => :string, :aliases => "-t"
18
+ class_option :vars, :aliases => %w(-v), :type => :hash
19
+
20
+ def self.source_root
21
+ File.expand_path('template/', File.dirname(__FILE__))
22
+ end
23
+
24
+ def parse_page_group_and_name
25
+ if name.nil?
26
+ say_status "ERROR:", "you need to specify a page name.", :red
27
+ exit
28
+ end
29
+ @page_name, @group = Moka::Utilities.parse_grouppage name
30
+ end
31
+
32
+ def load_manifest
33
+ @manifest = YAML.load_file(File.expand_path("manifest.yml", MOKA_ROOT))
34
+ @site = SiteNode.new("site", @manifest["site"])
35
+ end
36
+
37
+ def verify_if_page_exists
38
+ unless @site.find_group(@group).nil? or @site.find_group(@group).find_page(@page_name).nil?
39
+ say_status "ERROR:", "page '#{@page_name}' already exists in group '#{@group}'!", :red
40
+ exit
41
+ end
42
+ end
43
+
44
+ def create_page_dir_and_files
45
+ unless options[:template].nil?
46
+ @template_name, @template_group = Moka::Utilities.parse_grouppage options[:template]
47
+ if @site.find_group(@template_group).nil?
48
+ say_status "ERROR:", "cannot find group '#{@template_group}'", :red
49
+ exit
50
+ elsif @site.find_group(@template_group).find_page(@template_name).nil?
51
+ say_status "ERROR:", "cannot find page '#{@template_name}' in group '#{@template_group}'", :red
52
+ exit
53
+ end
54
+ directory(File.expand_path("project/site/#{@template_group}/#{@template_name}", MOKA_ROOT), File.expand_path("project/site/#{@group}/#{@page_name}", MOKA_ROOT))
55
+ else
56
+ directory("pagedir", File.expand_path("project/site/#{@group}/#{@page_name}", MOKA_ROOT))
57
+ end
58
+ end
59
+
60
+ def update_manifest
61
+ @page_params = {"order" => Time.new.utc.to_i}
62
+ unless options[:template].nil? or @manifest["site"][@template_group][@template_name]["layout"].nil?
63
+ @page_params["layout"] = @manifest["site"][@template_group][@template_name]["layout"]
64
+ end
65
+ unless @group == "root"
66
+ @page_params["path"] = File.join [@group, @page_name + "." + (@site.respond_to?(:default_extension) ? @site.default_extension : "html")]
67
+ else
68
+ @page_params["path"] = @page_name + "." + (@site.respond_to?(:default_extension) ? @site.default_extension : "html")
69
+ end
70
+ unless @site.find_group(@group).nil?
71
+ @manifest["site"][@group][@page_name] = @page_params
72
+ else
73
+ @manifest["site"][@group] = {"order" => Time.new.utc.to_i, @page_name => @page_params}
74
+ end
75
+ # dump manifest
76
+ f = File.open( File.expand_path('manifest.yml', MOKA_ROOT), 'w' ) do |out|
77
+ YAML.dump( @manifest, out )
78
+ end
79
+ say_status "update", "manifest.yml", :green
80
+ end
81
+
82
+ def delete_variables_using_reserved_name
83
+ unless options[:vars].nil?
84
+ options[:vars].each do |var_name, var_value|
85
+ if Moka::SiteTree::RESERVED_NAMES.include? var_name.to_s
86
+ say_status "WARNING:", "variable '#{var_name}' is a reserved word, and will not be set as a variable", :yellow
87
+ end
88
+ end
89
+ options[:vars].delete_if {|var_name, var_value| Moka::SiteTree::RESERVED_NAMES.include? var_name.to_s }
90
+ end
91
+ end
92
+
93
+ def dump_variables
94
+ if File.exists? File.expand_path("project/site/#{@group}/#{@page_name}/variables.yml", MOKA_ROOT)
95
+ @page_variables = YAML.load_file(File.expand_path("project/site/#{@group}/#{@page_name}/variables.yml", MOKA_ROOT))
96
+ else
97
+ @page_variables = {}
98
+ end
99
+ unless options[:vars].nil?
100
+ @page_variables.merge! options[:vars]
101
+ f = File.open( File.expand_path("project/site/#{@group}/#{@page_name}/variables.yml", MOKA_ROOT), 'w' ) do |out|
102
+ YAML.dump( @page_variables, out )
103
+ end
104
+ say_status "update", "project/site/#{@group}/#{@page_name}/variables.yml", :green
105
+ end
106
+ end
107
+
108
+ def notify_about_creation
109
+ say ""
110
+ if options[:template].nil?
111
+ say "Generated page #{@group}:#{@page_name}"
112
+ else
113
+ say "Generated page #{@group}:#{@page_name} using page #{@template_group}:#{@template_name} as a template"
114
+ end
115
+ say ""
116
+ say " Page Parameters:"
117
+ @page_params.each do |param_name, param_value|
118
+ say " #{param_name} = #{param_value}"
119
+ end
120
+
121
+ say ""
122
+ say " Page Variables:"
123
+ @page_variables.each do |var_name, var_value|
124
+ puts " #{var_name} = #{var_value}"
125
+ end
126
+ say ""
127
+ end
128
+ end
129
+ end
130
+ end