creationix-milk 0.0.9

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 (88) hide show
  1. data/.document +5 -0
  2. data/.gitignore +7 -0
  3. data/LICENSE +27 -0
  4. data/README.rdoc +7 -0
  5. data/Rakefile +62 -0
  6. data/VERSION +1 -0
  7. data/bin/milk +22 -0
  8. data/lib/milk.rb +82 -0
  9. data/lib/milk/application.rb +227 -0
  10. data/lib/milk/component.rb +142 -0
  11. data/lib/milk/field.rb +60 -0
  12. data/lib/milk/fields/component.haml +8 -0
  13. data/lib/milk/fields/component_array.haml +3 -0
  14. data/lib/milk/fields/component_array.rb +4 -0
  15. data/lib/milk/fields/image_chooser.haml +7 -0
  16. data/lib/milk/fields/image_chooser.rb +26 -0
  17. data/lib/milk/fields/login.haml +90 -0
  18. data/lib/milk/fields/markdown_field.haml +1 -0
  19. data/lib/milk/fields/markdown_field.rb +4 -0
  20. data/lib/milk/fields/page_chooser.haml +3 -0
  21. data/lib/milk/fields/page_chooser.rb +17 -0
  22. data/lib/milk/fields/sprite_chooser.haml +6 -0
  23. data/lib/milk/fields/sprite_chooser.rb +19 -0
  24. data/lib/milk/fields/text_field.haml +1 -0
  25. data/lib/milk/fields/text_field.rb +4 -0
  26. data/lib/milk/fields/xhtml.haml +253 -0
  27. data/lib/milk/haxe.rb +139 -0
  28. data/lib/milk/page.rb +139 -0
  29. data/lib/milk/tasks.rb +51 -0
  30. data/milk.gemspec +137 -0
  31. data/site_template/Rakefile +3 -0
  32. data/site_template/config.ru +16 -0
  33. data/site_template/config/config.yaml +31 -0
  34. data/site_template/config/foot.yaml +3 -0
  35. data/site_template/config/head.yaml +18 -0
  36. data/site_template/config/users.yaml +18 -0
  37. data/site_template/design/0-reset.sass +170 -0
  38. data/site_template/design/1-text.sass +65 -0
  39. data/site_template/design/960.sass +305 -0
  40. data/site_template/design/body.haml +1 -0
  41. data/site_template/design/body.rb +4 -0
  42. data/site_template/design/button.haml +2 -0
  43. data/site_template/design/button.rb +16 -0
  44. data/site_template/design/foot.haml +1 -0
  45. data/site_template/design/foot.rb +4 -0
  46. data/site_template/design/foot.sass +3 -0
  47. data/site_template/design/head.haml +3 -0
  48. data/site_template/design/head.rb +4 -0
  49. data/site_template/design/head.sass +27 -0
  50. data/site_template/design/page.haml +2 -0
  51. data/site_template/design/page.sass +7 -0
  52. data/site_template/design/sprites.sass +0 -0
  53. data/site_template/design/xhtml.haml +15 -0
  54. data/site_template/pages/About.yaml +14 -0
  55. data/site_template/pages/Home.yaml +14 -0
  56. data/site_template/pages/News.yaml +14 -0
  57. data/site_template/pages/NotFound.yaml +14 -0
  58. data/site_template/pages/Products.yaml +14 -0
  59. data/site_template/public/cache/About/index.html +42 -0
  60. data/site_template/public/cache/Home/index.html +44 -0
  61. data/site_template/public/cache/News/index.html +42 -0
  62. data/site_template/public/cache/Products/index.html +42 -0
  63. data/site_template/public/favicon.ico +0 -0
  64. data/site_template/public/images/README.txt +2 -0
  65. data/site_template/public/js/jquery-1.3.2.min.js +19 -0
  66. data/site_template/public/js/jquery-ui-1.7.2.custom.min.js +34 -0
  67. data/site_template/public/js/jquery.json-1.3.min.js +37 -0
  68. data/site_template/public/robots.txt +0 -0
  69. data/site_template/public/skin/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  70. data/site_template/public/skin/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  71. data/site_template/public/skin/images/ui-bg_flat_10_000000_40x100.png +0 -0
  72. data/site_template/public/skin/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  73. data/site_template/public/skin/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  74. data/site_template/public/skin/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  75. data/site_template/public/skin/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  76. data/site_template/public/skin/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  77. data/site_template/public/skin/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  78. data/site_template/public/skin/images/ui-icons_222222_256x240.png +0 -0
  79. data/site_template/public/skin/images/ui-icons_228ef1_256x240.png +0 -0
  80. data/site_template/public/skin/images/ui-icons_ef8c08_256x240.png +0 -0
  81. data/site_template/public/skin/images/ui-icons_ffd27a_256x240.png +0 -0
  82. data/site_template/public/skin/images/ui-icons_ffffff_256x240.png +0 -0
  83. data/site_template/public/skin/jquery-ui-1.7.2.custom.css +406 -0
  84. data/site_template/public/style/style.css +157 -0
  85. data/site_template/tmp/restart.txt +1 -0
  86. data/test/milk_test.rb +7 -0
  87. data/test/test_helper.rb +10 -0
  88. metadata +170 -0
data/lib/milk/haxe.rb ADDED
@@ -0,0 +1,139 @@
1
+ module Milk
2
+ class Haxe
3
+ HAXE_HEADER_REGEX = /^\/\/ COMPILE_FLAGS (.*)$/
4
+ HAXE_BIN = Milk::BIN_DIR+"/haxe"
5
+ ENV['HAXE_LIBRARY_PATH'] = File.absolute_path(Milk::BIN_DIR+"/../haxe/std")
6
+ HAXE_DIR = Milk::COMPONENTS_DIR + "/haxe"
7
+
8
+ def initialize(page_name)
9
+ @page_name = page_name
10
+ base_path = HAXE_DIR + "/" + @page_name
11
+ @haxe = base_path + ".hx"
12
+ @haxe_swf = @haxe + ".swf"
13
+ @swfmill = base_path + ".xml"
14
+ @swfmill_swf = @swfmill + ".swf"
15
+
16
+ raise PageNotFoundError if not File.file? @haxe
17
+
18
+ # Compile swfmill resource if it exists and the binary is nonexistant/outdated
19
+ if File.file? @swfmill
20
+ if (not (File.file?(@swfmill_swf)) or (File.mtime(@swfmill) > File.mtime(@swfmill_swf)))
21
+ compile_swfmill
22
+ end
23
+ end
24
+
25
+ # Compile haxe binary if nonexistant/outdated
26
+ # if a swfmill resource exists, it can outdate the main swf too
27
+ if (not (File.file?(@haxe_swf)) \
28
+ or (File.mtime(@haxe) > File.mtime(@haxe_swf)) \
29
+ or (File.file?(@swfmill_swf) \
30
+ and File.mtime(@swfmill_swf) > File.mtime(@haxe_swf) \
31
+ ) \
32
+ )
33
+ compile_haxe
34
+ end
35
+ end
36
+
37
+ def render(mode='view')
38
+ open(@haxe_swf)
39
+ end
40
+
41
+ private
42
+
43
+ def popen3(*cmd)
44
+ pw = IO::pipe # pipe[0] for read, pipe[1] for write
45
+ pr = IO::pipe
46
+ pe = IO::pipe
47
+
48
+ pid = fork{
49
+ # child
50
+ fork{
51
+ # grandchild
52
+ pw[1].close
53
+ STDIN.reopen(pw[0])
54
+ pw[0].close
55
+
56
+ pr[0].close
57
+ STDOUT.reopen(pr[1])
58
+ pr[1].close
59
+
60
+ pe[0].close
61
+ STDERR.reopen(pe[1])
62
+ pe[1].close
63
+
64
+ exec(*cmd)
65
+ }
66
+ exit!(0)
67
+ }
68
+
69
+ pw[0].close
70
+ pr[1].close
71
+ pe[1].close
72
+ Process.waitpid(pid)
73
+ pi = [pw[1], pr[0], pe[0]]
74
+ pw[1].sync = true
75
+ if defined? yield
76
+ begin
77
+ return yield(*pi)
78
+ ensure
79
+ pi.each{|p| p.close unless p.closed?}
80
+ end
81
+ end
82
+ pi
83
+ end
84
+
85
+ def run_command(*command)
86
+ popen3(*command) do |stdin, stdout, stderr|
87
+ stdin.close
88
+ error = stderr.read
89
+ if error.length > 0
90
+ raise ExternalCompilerError.new(error.inspect)
91
+ end
92
+ end
93
+ end
94
+
95
+ def compile_swfmill
96
+ command = ["swfmill", "simple", @swfmill, @swfmill_swf]
97
+ Dir.chdir(Milk::HAXE_DIR)
98
+ run_command *command
99
+ end
100
+
101
+ def compile_haxe
102
+ command = [HAXE_BIN,
103
+ "-swf-version", "9", "--flash-strict",
104
+ "-swf", @haxe_swf,
105
+ "-main", @page_name,
106
+ "-cp", Milk::HAXE_DIR]
107
+ open @haxe, "r" do |file|
108
+ line = file.readline
109
+ if HAXE_HEADER_REGEX =~ line
110
+ HAXE_HEADER_REGEX.match(line)[1].split(' ').each do |item|
111
+ command.push(item)
112
+ end
113
+ end
114
+ end
115
+ if File.file? @swfmill_swf
116
+ # For some reason, haxe doesn't like a full path here, so convert
117
+ # to relative.
118
+ command.push('-swf-lib')
119
+ command.push(@swfmill_swf.split("/").last)
120
+ end
121
+ run_command *command
122
+ end
123
+
124
+ end
125
+
126
+ # An exception raised by haxe or swfmill.
127
+ class ExternalCompilerError < StandardError
128
+ end
129
+
130
+ end
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
data/lib/milk/page.rb ADDED
@@ -0,0 +1,139 @@
1
+ module Milk
2
+ class Page
3
+
4
+ attr_reader :components
5
+ attr_reader :title
6
+ attr_reader :description
7
+ attr_reader :pagename
8
+ attr_accessor :parent
9
+ @parent = nil
10
+
11
+ PATH_TO_NAME_REGEXP = Regexp.new("#{Milk::PAGES_DIR}\/(.*)\.yaml")
12
+
13
+ def self.each_page
14
+ Dir.glob(Milk::PAGES_DIR + "/**/*.yaml").each do |yaml_file|
15
+ p = load_file(yaml_file)
16
+ Milk::Application.join_tree(p, nil)
17
+ yield p
18
+ end
19
+ end
20
+
21
+ def self.load_file(yaml_file, pagename=nil)
22
+ pagename ||= PATH_TO_NAME_REGEXP.match(yaml_file)[1]
23
+ page = YAML.load_file(yaml_file)
24
+ page.instance_variable_set('@pagename', pagename)
25
+ page.load_settings
26
+ page
27
+ end
28
+
29
+ def self.find(pagename)
30
+ yaml_file = Milk::PAGES_DIR + "/" + pagename + ".yaml"
31
+ raise PageNotFoundError unless File.readable? yaml_file
32
+ load_file(yaml_file, pagename)
33
+ end
34
+
35
+ def self.haml(filename, context, extras)
36
+ if block_given?
37
+ ::Haml::Engine.new(File.read(filename), :filename => filename).render(context, extras) do
38
+ yield
39
+ end
40
+ else
41
+ ::Haml::Engine.new(File.read(filename), :filename => filename).render(context, extras)
42
+ end
43
+ end
44
+
45
+ def haml(filename, context=self, extras={})
46
+ if block_given?
47
+ Page.haml(filename, context, extras) { yield }
48
+ else
49
+ Page.haml(filename, context, extras)
50
+ end
51
+ end
52
+
53
+ def to_yaml_properties
54
+ [:@components, :@title, :@keywords, :@description]
55
+ end
56
+
57
+ def app
58
+ @parent
59
+ end
60
+
61
+ def save
62
+ save_settings
63
+ yaml_file = Milk::PAGES_DIR + "/" + @pagename + ".yaml"
64
+ data = YAML.dump(self)
65
+ File.open(yaml_file, "w") do |file|
66
+ file.write(data)
67
+ end
68
+ data
69
+ end
70
+
71
+ def self.json_unserialize(data, pagename=nil)
72
+ class_name = data.delete('class')
73
+ obj = class_name.constantize.allocate
74
+ data.each do |key, value|
75
+ if value.class == Array
76
+ value.collect! { |item| json_unserialize(item) }
77
+ end
78
+ obj.instance_variable_set("@#{key}", value)
79
+ end
80
+ obj.instance_variable_set("@pagename", pagename) if obj.class == Milk::Page
81
+ obj
82
+ end
83
+
84
+ def load_settings
85
+ @components.each do |component|
86
+ component.load_settings
87
+ end
88
+ end
89
+
90
+ def save_settings
91
+ @components.each do |component|
92
+ component.save_settings
93
+ end
94
+ end
95
+
96
+ def edit
97
+ haml(FIELDS_DIR + "/xhtml.haml", self)
98
+ end
99
+
100
+ def preview
101
+ haml(Milk::COMPONENTS_DIR + "/page.haml", self) do
102
+ (@components.collect do |component|
103
+ component.view
104
+ end).join("")
105
+ end
106
+ end
107
+
108
+ def view
109
+ haml(Milk::COMPONENTS_DIR + "/xhtml.haml", self) do
110
+ preview
111
+ end
112
+ end
113
+
114
+ def link_to
115
+ if @pagename == "Home"
116
+ "/"
117
+ else
118
+ "/#{@pagename}"
119
+ end
120
+ end
121
+
122
+ def link_to?(url)
123
+ (@pagename == "Home" && url == '/') || url == "/#{@pagename}"
124
+ end
125
+
126
+ def save_to_cache(html=nil)
127
+ html ||= view
128
+ folder = Milk::PUBLIC_DIR + "/cache/" + @pagename
129
+ cache_file = folder + "/index.html"
130
+ # Make the folder if it doesn't exist
131
+ FileUtils.mkdir_p folder
132
+ open(cache_file, "w") { |file| file.write html }
133
+ end
134
+
135
+ end
136
+ end
137
+
138
+
139
+
data/lib/milk/tasks.rb ADDED
@@ -0,0 +1,51 @@
1
+
2
+ desc "Loads the Milk environment, mainly used as a dependency"
3
+ task :environment do |t|
4
+ MILK_ROOT ||= t.application.original_dir
5
+ require "milk"
6
+ end
7
+
8
+ desc "Compile all the sass files in the component dir and merge into style.css"
9
+ task :sass => :environment do
10
+ style_file = Milk::PUBLIC_DIR + "/style/style.css"
11
+ puts "Updating #{style_file}..."
12
+ require 'haml'
13
+ open(style_file, "w") do |style|
14
+ Dir.glob(Milk::COMPONENTS_DIR + "/*.sass").sort.each do |c|
15
+ puts "Adding #{c}"
16
+ open(c, "r") do |file|
17
+ style.write Sass::Engine.new(file.read, :filename=>c, :style=>:compact, :load_paths => [Milk::COMPONENTS_DIR]).render.strip
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ desc "Rebuild the page cache files"
24
+ task :cache => :environment do
25
+ cachedir = Milk::PUBLIC_DIR+"/cache"
26
+ FileUtils.rm_rf(cachedir, :verbose=>true)
27
+ Milk::Page.each_page do |page|
28
+ puts "saving #{page.pagename}"
29
+ page.save_to_cache
30
+ end
31
+ end
32
+
33
+ desc "Start up an interactive ruby session with Milk preloaded"
34
+ task :console => :environment do
35
+ # Remove the task name from argv so irb doesn't explode
36
+ ARGV.shift
37
+
38
+ # Start an irb session with the environment loaded
39
+ require "irb"
40
+ IRB.start(__FILE__)
41
+ end
42
+
43
+ desc "Start up a development server using thin"
44
+ task :server do
45
+ exec "thin -R config.ru start"
46
+ end
47
+
48
+
49
+
50
+
51
+
data/milk.gemspec ADDED
@@ -0,0 +1,137 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{milk}
5
+ s.version = "0.0.9"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Tim Caswell"]
9
+ s.date = %q{2009-06-25}
10
+ s.default_executable = %q{milk}
11
+ s.email = %q{tim@creationix.com}
12
+ s.executables = ["milk"]
13
+ s.extra_rdoc_files = [
14
+ "LICENSE",
15
+ "README.rdoc"
16
+ ]
17
+ s.files = [
18
+ ".document",
19
+ ".gitignore",
20
+ "LICENSE",
21
+ "README.rdoc",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "bin/milk",
25
+ "lib/milk.rb",
26
+ "lib/milk/application.rb",
27
+ "lib/milk/component.rb",
28
+ "lib/milk/field.rb",
29
+ "lib/milk/fields/component.haml",
30
+ "lib/milk/fields/component_array.haml",
31
+ "lib/milk/fields/component_array.rb",
32
+ "lib/milk/fields/image_chooser.haml",
33
+ "lib/milk/fields/image_chooser.rb",
34
+ "lib/milk/fields/login.haml",
35
+ "lib/milk/fields/markdown_field.haml",
36
+ "lib/milk/fields/markdown_field.rb",
37
+ "lib/milk/fields/page_chooser.haml",
38
+ "lib/milk/fields/page_chooser.rb",
39
+ "lib/milk/fields/sprite_chooser.haml",
40
+ "lib/milk/fields/sprite_chooser.rb",
41
+ "lib/milk/fields/text_field.haml",
42
+ "lib/milk/fields/text_field.rb",
43
+ "lib/milk/fields/xhtml.haml",
44
+ "lib/milk/haxe.rb",
45
+ "lib/milk/page.rb",
46
+ "lib/milk/tasks.rb",
47
+ "milk.gemspec",
48
+ "site_template/Rakefile",
49
+ "site_template/config.ru",
50
+ "site_template/config/config.yaml",
51
+ "site_template/config/foot.yaml",
52
+ "site_template/config/head.yaml",
53
+ "site_template/config/users.yaml",
54
+ "site_template/design/0-reset.sass",
55
+ "site_template/design/1-text.sass",
56
+ "site_template/design/960.sass",
57
+ "site_template/design/body.haml",
58
+ "site_template/design/body.rb",
59
+ "site_template/design/button.haml",
60
+ "site_template/design/button.rb",
61
+ "site_template/design/foot.haml",
62
+ "site_template/design/foot.rb",
63
+ "site_template/design/foot.sass",
64
+ "site_template/design/head.haml",
65
+ "site_template/design/head.rb",
66
+ "site_template/design/head.sass",
67
+ "site_template/design/page.haml",
68
+ "site_template/design/page.sass",
69
+ "site_template/design/sprites.sass",
70
+ "site_template/design/xhtml.haml",
71
+ "site_template/pages/About.yaml",
72
+ "site_template/pages/Home.yaml",
73
+ "site_template/pages/News.yaml",
74
+ "site_template/pages/NotFound.yaml",
75
+ "site_template/pages/Products.yaml",
76
+ "site_template/public/cache/About/index.html",
77
+ "site_template/public/cache/Home/index.html",
78
+ "site_template/public/cache/News/index.html",
79
+ "site_template/public/cache/Products/index.html",
80
+ "site_template/public/favicon.ico",
81
+ "site_template/public/images/README.txt",
82
+ "site_template/public/js/jquery-1.3.2.min.js",
83
+ "site_template/public/js/jquery-ui-1.7.2.custom.min.js",
84
+ "site_template/public/js/jquery.json-1.3.min.js",
85
+ "site_template/public/robots.txt",
86
+ "site_template/public/skin/images/ui-bg_diagonals-thick_18_b81900_40x40.png",
87
+ "site_template/public/skin/images/ui-bg_diagonals-thick_20_666666_40x40.png",
88
+ "site_template/public/skin/images/ui-bg_flat_10_000000_40x100.png",
89
+ "site_template/public/skin/images/ui-bg_glass_100_f6f6f6_1x400.png",
90
+ "site_template/public/skin/images/ui-bg_glass_100_fdf5ce_1x400.png",
91
+ "site_template/public/skin/images/ui-bg_glass_65_ffffff_1x400.png",
92
+ "site_template/public/skin/images/ui-bg_gloss-wave_35_f6a828_500x100.png",
93
+ "site_template/public/skin/images/ui-bg_highlight-soft_100_eeeeee_1x100.png",
94
+ "site_template/public/skin/images/ui-bg_highlight-soft_75_ffe45c_1x100.png",
95
+ "site_template/public/skin/images/ui-icons_222222_256x240.png",
96
+ "site_template/public/skin/images/ui-icons_228ef1_256x240.png",
97
+ "site_template/public/skin/images/ui-icons_ef8c08_256x240.png",
98
+ "site_template/public/skin/images/ui-icons_ffd27a_256x240.png",
99
+ "site_template/public/skin/images/ui-icons_ffffff_256x240.png",
100
+ "site_template/public/skin/jquery-ui-1.7.2.custom.css",
101
+ "site_template/public/style/style.css",
102
+ "site_template/tmp/restart.txt",
103
+ "test/milk_test.rb",
104
+ "test/test_helper.rb"
105
+ ]
106
+ s.has_rdoc = true
107
+ s.homepage = %q{http://github.com/creationix/milk}
108
+ s.rdoc_options = ["--charset=UTF-8"]
109
+ s.require_paths = ["lib"]
110
+ s.required_ruby_version = Gem::Requirement.new(">= 1.9")
111
+ s.rubyforge_project = %q{milk}
112
+ s.rubygems_version = %q{1.3.1}
113
+ s.summary = %q{Milk is a rack based content management system built for ease of use and simplicity. Milk tastes great with and without cookies.}
114
+ s.test_files = [
115
+ "test/test_helper.rb",
116
+ "test/milk_test.rb"
117
+ ]
118
+
119
+ if s.respond_to? :specification_version then
120
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
121
+ s.specification_version = 2
122
+
123
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
124
+ s.add_runtime_dependency(%q<rack>, [">= 1.0.0"])
125
+ s.add_runtime_dependency(%q<maruku>, [">= 0.6.0"])
126
+ s.add_runtime_dependency(%q<haml>, [">= 2.0.9"])
127
+ else
128
+ s.add_dependency(%q<rack>, [">= 1.0.0"])
129
+ s.add_dependency(%q<maruku>, [">= 0.6.0"])
130
+ s.add_dependency(%q<haml>, [">= 2.0.9"])
131
+ end
132
+ else
133
+ s.add_dependency(%q<rack>, [">= 1.0.0"])
134
+ s.add_dependency(%q<maruku>, [">= 0.6.0"])
135
+ s.add_dependency(%q<haml>, [">= 2.0.9"])
136
+ end
137
+ end