visionmedia-drupal 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,11 @@
1
+ === 0.0.2 / 2008-10-02
2
+
3
+ * 2 Bug Fixes:
4
+
5
+ * Executable
6
+ * Fixed template filepath errors
7
+
8
+ === 0.0.1 / 2008-09-27
9
+
10
+ * Initial release
11
+
data/Manifest.txt ADDED
@@ -0,0 +1,22 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/drupal
6
+ lib/drupal.rb
7
+ lib/drupal/todo_list.rb
8
+ lib/drupal/create_module.rb
9
+ lib/drupal/install.rb
10
+ lib/drupal/templates/comments/file
11
+ lib/drupal/templates/comments/large
12
+ lib/drupal/templates/hooks/block
13
+ lib/drupal/templates/hooks/boot
14
+ lib/drupal/templates/hooks/cron
15
+ lib/drupal/templates/hooks/form_alter
16
+ lib/drupal/templates/hooks/init
17
+ lib/drupal/templates/hooks/menu
18
+ lib/drupal/templates/hooks/perm
19
+ lib/drupal/templates/hooks/schema
20
+ lib/drupal/templates/hooks/theme
21
+ lib/drupal/templates/txt/changelog
22
+ lib/drupal/templates/txt/readme
data/README.txt ADDED
@@ -0,0 +1,83 @@
1
+ = drupal
2
+
3
+ http://vision-media.ca/resources/ruby/drupal-module-builder-gem
4
+
5
+ == DESCRIPTION:
6
+
7
+ Drupal is an open source Ruby development tool allowing developers
8
+ to quickly generate and manage Drupal modules.
9
+
10
+ == SYNOPSIS:
11
+
12
+ drupal [options] [arguments]
13
+
14
+ == REQUIREMENTS:
15
+
16
+ none
17
+
18
+ == ARGUMENTS:
19
+
20
+ create module <module_name> Generates a module skeleton from an interactive wizard.
21
+ todo list [total] Displays list of todo items or a total.
22
+
23
+ == OPTIONS:
24
+
25
+ -h, --help Display this help information.
26
+ -V, --version Display version of the Drupal development tool.
27
+
28
+ == EXAMPLES:
29
+
30
+ Create a new module in the current directory.
31
+ drupal create module my_module
32
+
33
+ Create a new module in a specific directory.
34
+ drupal create module my_module ./sites/all/modules
35
+
36
+ View todo list for current directory.
37
+ drupal todo list
38
+
39
+ View todo list for multiple files or directories.
40
+ drupal todo list ./sites/all/modules/mymodule
41
+
42
+ View total todo items only.
43
+ drupal todo list total ./sites/all/modules
44
+
45
+ == TODO:
46
+
47
+ * Add formatted help option
48
+ * Add download of Drupal core install via 'install core [version]'
49
+ * Support versions for installer
50
+ * Support version prompt for project installation
51
+ * Add graceful error handling
52
+ * Add tests
53
+
54
+ == AUTHOR:
55
+
56
+ TJ Holowaychuk
57
+ tj@vision-media.ca
58
+ http://vision-media.ca
59
+
60
+ == LICENSE:
61
+
62
+ (The MIT License)
63
+
64
+ Copyright (c) 2008 FIX
65
+
66
+ Permission is hereby granted, free of charge, to any person obtaining
67
+ a copy of this software and associated documentation files (the
68
+ 'Software'), to deal in the Software without restriction, including
69
+ without limitation the rights to use, copy, modify, merge, publish,
70
+ distribute, sublicense, and/or sell copies of the Software, and to
71
+ permit persons to whom the Software is furnished to do so, subject to
72
+ the following conditions:
73
+
74
+ The above copyright notice and this permission notice shall be
75
+ included in all copies or substantial portions of the Software.
76
+
77
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
78
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
79
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
80
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
81
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
82
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
83
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require File.dirname(__FILE__) + '/lib/drupal'
5
+
6
+ desc 'Build and install ruby gem.'
7
+ task :build do
8
+ sh "sudo gem build ./drupal.gemspec"
9
+ sh "sudo gem install drupal-#{Drupal::VERSION}.gem"
10
+ end
11
+
12
+ desc 'Remove ruby gem build data.'
13
+ task :remove do
14
+ sh "sudo gem uninstall drupal"
15
+ sh "sudo rm drupal-#{Drupal::VERSION}.gem"
16
+ end
data/bin/drupal ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'drupal'
4
+ Drupal.new.run(ARGV)
data/drupal.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "drupal"
3
+ s.version = "0.0.2"
4
+ s.date = "2008-09-29"
5
+ s.summary = "Drupal development kit"
6
+ s.email = "tj@vision-media.ca"
7
+ s.homepage = "http://vision-media.ca/resources/drupal/drupal-module-builder-gem"
8
+ s.description = "Drupal is an open source Ruby development tool allowing developers to quickly generate and manage Drupal modules."
9
+ s.has_rdoc = true
10
+ s.require_path = "lib"
11
+ s.authors = ["tj@vision-media.ca"]
12
+ s.files = ["History.txt",
13
+ "Manifest.txt",
14
+ "README.txt",
15
+ "Rakefile",
16
+ "drupal.gemspec",
17
+ "lib/drupal.rb",
18
+ "lib/drupal/create_module.rb",
19
+ "lib/drupal/todo_list.rb",
20
+ "lib/drupal/install.rb",
21
+ "lib/drupal/templates/comments/file",
22
+ "lib/drupal/templates/comments/large",
23
+ "lib/drupal/templates/hooks/block",
24
+ "lib/drupal/templates/hooks/boot",
25
+ "lib/drupal/templates/hooks/cron",
26
+ "lib/drupal/templates/hooks/form_alter",
27
+ "lib/drupal/templates/hooks/init",
28
+ "lib/drupal/templates/hooks/menu",
29
+ "lib/drupal/templates/hooks/perm",
30
+ "lib/drupal/templates/hooks/schema",
31
+ "lib/drupal/templates/hooks/theme",
32
+ "lib/drupal/templates/txt/changelog",
33
+ "lib/drupal/templates/txt/readme",
34
+ "bin/drupal"]
35
+ s.executables = ["drupal"]
36
+ s.test_files = ["test/test_drupal.rb"]
37
+ s.rdoc_options = ["--main", "README.txt"]
38
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
39
+ end
data/lib/drupal.rb ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # == SYNOPSIS:
4
+ #
5
+ # drupal [options] [arguments]
6
+ #
7
+ # == ARGUMENTS:
8
+ #
9
+ # create module Generates a module skeleton from an interactive wizard.
10
+ # todo list [total] Displays list of todo items or a total.
11
+ #
12
+ # == OPTIONS:
13
+ #
14
+ # -h, --help Display this help information.
15
+ # -V, --version Display version of the Drupal development tool.
16
+ #
17
+ # == EXAMPLES:
18
+ #
19
+ # Create a new module in the current directory.
20
+ # drupal create module my_module
21
+ #
22
+ # Create a new module in a specific directory.
23
+ # drupal create module my_module ./sites/all/modules
24
+ #
25
+ # View todo list for current directory.
26
+ # drupal todo list
27
+ #
28
+ # View todo list for multiple files or directories.
29
+ # drupal todo list ./sites/all/modules/mymodule
30
+ #
31
+ # View total todo items only.
32
+ # drupal todo list total ./sites/all/modules
33
+
34
+ require 'optparse'
35
+ require 'ostruct'
36
+ require File.dirname(__FILE__) + '/drupal/create_module'
37
+ require File.dirname(__FILE__) + '/drupal/todo_list'
38
+ require File.dirname(__FILE__) + '/drupal/install'
39
+
40
+ class Drupal
41
+
42
+ MAJOR = 0
43
+ MINOR = 0
44
+ TINY = 2
45
+ VERSION = [MAJOR, MINOR, TINY].join('.')
46
+
47
+ # Run the drupal development tool.
48
+ def run(arguments)
49
+ @arguments = arguments || []
50
+ @options = OpenStruct.new
51
+ abort 'Arguments required. Use --help for additional information.' if @arguments.empty?
52
+ parse_options
53
+ determine_handler
54
+ execute_handler
55
+ end
56
+
57
+ # Parse stdin for options.
58
+ def parse_options
59
+ opts = OptionParser.new
60
+ opts.on('-h', '--help') { output_help }
61
+ opts.on('-V', '--version') { output_version }
62
+ opts.parse!(@arguments)
63
+ end
64
+
65
+ # Determine handler based on the current arguments.
66
+ def determine_handler
67
+ @handler = @arguments.shift.capitalize
68
+ while !@arguments.empty? && !is_handler(@handler) do
69
+ @handler << '_' + @arguments.shift.capitalize
70
+ end
71
+ end
72
+
73
+ # Execute the handler if it was found.
74
+ def execute_handler
75
+ abort 'Invalid command.' if !is_handler(@handler)
76
+ eval("Drupal::#{@handler}.new.run(@arguments)")
77
+ end
78
+
79
+ # Check existance of a handler.
80
+ def is_handler(klass)
81
+ Drupal.const_defined?(klass)
82
+ end
83
+
84
+ # Output help information.
85
+ def output_help
86
+ # TODO: utilize RDoc
87
+ puts <<-USAGE
88
+
89
+ SYNOPSIS:
90
+
91
+ drupal [options] [arguments]
92
+
93
+ ARGUMENTS:
94
+
95
+ create module <module_name> [dir] Generates a module skeleton from an interactive wizard. Current directory unless [dir] is specified.
96
+ todo list [total] Displays list of todo items or a total.
97
+
98
+ EXAMPLES:
99
+
100
+ Create a new module in the current directory.
101
+ drupal create module my_module
102
+
103
+ Create a new module in a specific directory.
104
+ drupal create module my_module ./sites/all/modules
105
+
106
+ View todo list for current directory.
107
+ drupal todo list
108
+
109
+ View todo list for multiple files or directories.
110
+ drupal todo list ./sites/all/modules/mymodule
111
+
112
+ View total todo items only.
113
+ drupal todo list total ./sites/all/modules
114
+
115
+ USAGE
116
+ exit
117
+ end
118
+
119
+ # Output version information.
120
+ def output_version
121
+ puts "Version #{Drupal::VERSION}"
122
+ exit
123
+ end
124
+ end
125
+
126
+
127
+
@@ -0,0 +1,202 @@
1
+
2
+ class Drupal
3
+ class Create_Module
4
+
5
+ # Create a module using the module builing wizard.
6
+ def run(arguments)
7
+ @arguments = arguments
8
+ @dir = @arguments[1] || '.' # TODO remove trailing slash, check validity, and existance
9
+ self.check_module_name
10
+ self.run_wizard
11
+ end
12
+
13
+ # Ensure module name is supplied and that it is
14
+ # formatted correctly as module names must be alphanumeric
15
+ # and must begin with a letter.
16
+ def check_module_name
17
+ case
18
+ when @arguments.empty?; puts 'Module name required.'; exit 3
19
+ when !@arguments[0].match(/^[a-z][\w]+/); puts 'Invalid module name.'; exit 4
20
+ else @module = @arguments[0]
21
+ end
22
+ end
23
+
24
+ # Run module generation wizard.
25
+ def run_wizard
26
+ # TODO create self.log() with padding to even output
27
+ # Info
28
+ @author = self.ask('What is your name?:')
29
+ @link = self.ask('What is the URI to your companies website?:')
30
+ @email = self.ask('What is your email?:')
31
+ @module_name = self.ask('Enter a human readable name for your module:')
32
+ @module_description = self.ask('Enter a short description of your module:')
33
+ @module_dependencies = self.ask('Enter a list of dependencies for your module:', true)
34
+ # Hooks
35
+ puts self.list_templates('Hooks:', 'hooks')
36
+ @hooks = self.ask('Which hooks would you like to implement?:', true)
37
+ # Files
38
+ puts self.list_templates('Files:', 'txt')
39
+ @files = self.ask('Which additional files would you like to include?:', true)
40
+ # Dirs
41
+ puts "\nCommon directories:"
42
+ puts ['js', 'images', 'css'].collect{ |d| " - " << d }
43
+ @dirs = self.ask('Which directories would you like to create?:', true)
44
+ # Finish
45
+ self.create_tokens
46
+ self.create_hook_weights
47
+ self.create_module
48
+ end
49
+
50
+ # Create global tokens.
51
+ def create_tokens
52
+ @tokens = {
53
+ :module => @module,
54
+ :link => @link,
55
+ :email => @email,
56
+ :author => @author,
57
+ :module_name => @module_name,
58
+ :module_description => @module_description,
59
+ :module_dependencies => @module_dependencies,
60
+ }
61
+ end
62
+
63
+ # Register hook weights
64
+ def create_hook_weights
65
+ @hook_weights = [
66
+ 'perm',
67
+ 'cron',
68
+ 'boot',
69
+ 'init',
70
+ 'menu',
71
+ 'schema',
72
+ 'theme',
73
+ 'form_alter',
74
+ 'block',
75
+ ]
76
+ end
77
+
78
+ # Create module from wizard results.
79
+ def create_module
80
+ puts "\n... Creating module '#{@module}' in '#{@dir}'"
81
+ # TODO: map hooks to specific order...usort equiv
82
+ # Base directory
83
+ create_dir("#{@module}")
84
+ self.create_module_dirs
85
+ self.create_module_files
86
+ self.create_module_file
87
+ self.create_module_install_file
88
+ self.create_module_info_file
89
+ puts 'Module created :)'
90
+ end
91
+
92
+ # Create directories.
93
+ def create_module_dirs
94
+ @dirs.each{ |dir| create_dir("#{@module}/#{dir}") }
95
+ end
96
+
97
+ # Create file templates.
98
+ def create_module_files
99
+ @files.each do |file|
100
+ filepath = "#{file.upcase}.txt"
101
+ create_file(filepath)
102
+ append_template(filepath, "txt/#{file}", @tokens)
103
+ end
104
+ end
105
+
106
+ # Create .module file.
107
+ def create_module_file
108
+ create_file("#{@module}.module", "<?php\n")
109
+ append_template("#{@module}.module", 'comments/file', @tokens)
110
+ append_template("#{@module}.module", 'comments/large', {'title' => 'Hook Implementations'})
111
+ for hook in @hook_weights
112
+ if @hooks.include?(hook)
113
+ append_template("#{@module}.module", "hooks/#{hook}", @tokens) unless hook.match /^install|schema/
114
+ end
115
+ end
116
+ end
117
+
118
+ # Create .install file.
119
+ def create_module_install_file
120
+ if @hooks.include?('schema') || @hooks.include?('schema')
121
+ create_file("#{@module}.install", "<?php\n")
122
+ append_template("#{@module}.install", 'comments/file', @tokens)
123
+ @hooks.each do |hook|
124
+ append_template("#{@module}.install", "hooks/#{hook}", @tokens) if hook.match /^install|schema/
125
+ end
126
+ end
127
+ end
128
+
129
+ # Create info file.
130
+ def create_module_info_file
131
+ contents = '; $Id$'
132
+ contents << "\nname = #{@module_name}"
133
+ contents << "\ndescription = #{@module_description}"
134
+ contents << "\ncore = 6.x"
135
+ @module_dependencies.each do |dependency|
136
+ contents << "\ndependencies[] = #{dependency}"
137
+ end
138
+ create_file("#{@module}.info", contents)
139
+ end
140
+
141
+ # Create a new directory.
142
+ def create_dir(dir)
143
+ dir = "#{@dir}/#{dir}"
144
+ puts "... Creating directory '#{dir}'"
145
+ Dir.mkdir(dir)
146
+ end
147
+
148
+ # Create a new file.
149
+ def create_file(filepath, contents = '')
150
+ filepath = "#{@dir}/#{@module}/#{filepath}"
151
+ puts "... Creating file '#{filepath}'"
152
+ File.open(filepath, 'w') do |f|
153
+ f.write contents
154
+ end
155
+ end
156
+
157
+ # Append a tokenized template template to a file.
158
+ def append_template(filepath, template, tokens = {})
159
+ # TODO: ensure template exists
160
+ # TODO: is \n included with STDIN?
161
+ _template = template
162
+ filepath = "#{@dir}/#{@module}/#{filepath}"
163
+ template = File.dirname(__FILE__) + "/templates/#{template}"
164
+ puts "... Adding template '#{_template}' to '#{filepath}'"
165
+ contents = File.read(template)
166
+ tokens.each_pair do |token, value|
167
+ if value.class == String && contents.include?("[#{token}]")
168
+ contents.gsub!(/\[#{token}\]/, value)
169
+ end
170
+ end
171
+ File.open(filepath, 'a') do |f|
172
+ f.write contents
173
+ end
174
+ end
175
+
176
+ # Prompt user for input
177
+ def ask(question, list = false)
178
+ puts "\n" << question
179
+ # TODO: support 'all'
180
+ # TODO: why is gets not working?
181
+ # TODO: not catching exception when CTRL+C ?
182
+ begin
183
+ case list
184
+ when true; STDIN.gets.split
185
+ when false; STDIN.gets.gsub!(/\n/, '')
186
+ end
187
+ rescue => e
188
+ puts ':)'
189
+ end
190
+ end
191
+
192
+ # List templates available of a certain type.
193
+ def list_templates(title, type)
194
+ "\n" << title << self.get_templates(type).collect{ |t| "\n - " << File.basename(t) }.join
195
+ end
196
+
197
+ # Get array of templates of a certain type.
198
+ def get_templates(type)
199
+ Dir[File.dirname(__FILE__) + '/templates/' << type << '/*']
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,55 @@
1
+
2
+ require 'open-uri'
3
+
4
+ class Drupal
5
+ class Install
6
+
7
+ # Attempt to download core installation or module.
8
+ def run(arguments)
9
+ @project = arguments[0]
10
+ @dest = arguments[1] || '.'
11
+ abort 'Project name required (core | <project>).' if arguments.empty?
12
+ print "Destination '#{@dest}' is not empty, are you sure you want continue installation? (yes|no): " unless destination_empty?
13
+ confirmation = STDIN.gets unless destination_empty?
14
+ abort 'Installation aborted.' unless confirmation =~ /y|yes/
15
+ check_core
16
+ install_project if project_exists?
17
+ end
18
+
19
+ def debug(message)
20
+ puts '... ' + message
21
+ end
22
+
23
+ # Check if the destination is empty.
24
+ def destination_empty?
25
+ Dir['*'].length == 0
26
+ end
27
+
28
+ # Allow users to type 'core' instead of 'drupal install drupal'
29
+ def check_core
30
+ @project = 'drupal' if @project =~ /^core|drupal$/
31
+ end
32
+
33
+ # Determine if the project passed actually exists as a module.
34
+ def project_exists?
35
+ debug 'Locating project page'
36
+ if !uri_available?("http://drupal.org/project/#{@project}")
37
+ abort "Failed to find #{@project}."
38
+ end
39
+ end
40
+
41
+ # Check if a uri is available.
42
+ def uri_available?(uri)
43
+ open(uri) rescue false
44
+ end
45
+
46
+ # Install project.
47
+ def install_project
48
+ debug "Located #{@project} page"
49
+ @markup = open("http://drupal.org/project/#{@project}") { |f| f.read }
50
+ @markup.match /#{@project}-6\.x-[\d]\.[\d](?:\.\d)?(?:-\w+)?\.tar\.gz/
51
+ # TODO: make sure markup works..
52
+ # TODO: make sure match works..
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ // $Id$
2
+
3
+ /**
4
+ * @file
5
+ * [module_description]
6
+ * @author [author] <[email]>
7
+ * @link [link]
8
+ * @package [module]
9
+ */
@@ -0,0 +1,6 @@
1
+
2
+ /* -----------------------------------------------------------------
3
+
4
+ [title]
5
+
6
+ ------------------------------------------------------------------ */
@@ -0,0 +1,45 @@
1
+
2
+ /**
3
+ * Implementation of hook_block().
4
+ */
5
+ function [module]_block($op = 'list', $delta = 0, $edit = array()) {
6
+ switch($op) {
7
+ case 'list':
8
+ $blocks = array();
9
+ $blocks[0] = array(
10
+ 'info' => t('Block desc in listing'),
11
+ 'cache' => BLOCK_CACHE_PER_ROLE | BLOCK_CACHE_PER_PAGE,
12
+ );
13
+ return $blocks;
14
+
15
+ case 'configure':
16
+ $form = array();
17
+ switch($delta){
18
+ default:
19
+ $form['item'] = array(
20
+ '#type' => 'textfield',
21
+ '#title' => t('Form Item'),
22
+ '#default_value' => variable_get('item_var', 0),
23
+ );
24
+ }
25
+ return $form;
26
+
27
+ case 'save':
28
+ switch($delta){
29
+ default:
30
+ variable_set('item_var', $edit['item_var']);
31
+ }
32
+ break;
33
+
34
+ case 'view':
35
+ $block = array();
36
+ switch($delta) {
37
+ case 0:
38
+ $block = array(
39
+ 'subject' => t('Block title'),
40
+ 'content' => 'content here',
41
+ );
42
+ }
43
+ return $block;
44
+ }
45
+ }
@@ -0,0 +1,7 @@
1
+
2
+ /**
3
+ * Implementation of hook_boot().
4
+ */
5
+ function [module]_boot() {
6
+
7
+ }
@@ -0,0 +1,7 @@
1
+
2
+ /**
3
+ * Implementation of hook_cron().
4
+ */
5
+ function [module]_cron() {
6
+
7
+ }
@@ -0,0 +1,11 @@
1
+
2
+ /**
3
+ * Implementation of hook_form_alter().
4
+ */
5
+ function [module]_form_alter(&$form, $form_state, $form_id) {
6
+ switch($form_id) {
7
+ case '':
8
+ // @todo: do something
9
+ break;
10
+ }
11
+ }
@@ -0,0 +1,7 @@
1
+
2
+ /**
3
+ * Implementation of hook_init().
4
+ */
5
+ function [module]_init() {
6
+
7
+ }
@@ -0,0 +1,17 @@
1
+
2
+ /**
3
+ * Implementation of hook_menu().
4
+ */
5
+ function [module]_menu() {
6
+ $items = array();
7
+
8
+ $items['admin/settings/[module]'] = array(
9
+ 'title' => '[module]',
10
+ 'page callback' => 'drupal_get_form',
11
+ 'page arguments' => array('[module]_settings'),
12
+ 'access arguments' => array('administer [module]'),
13
+ 'file' => '[module].admin.inc',
14
+ );
15
+
16
+ return $items;
17
+ }
@@ -0,0 +1,7 @@
1
+
2
+ /**
3
+ * Implementation of hook_perm().
4
+ */
5
+ function [module]_perm() {
6
+ return array('administer [module]');
7
+ }
@@ -0,0 +1,37 @@
1
+
2
+ /**
3
+ * Implementation of hook_schema().
4
+ */
5
+ function [module]_schema() {
6
+ $schema = array();
7
+
8
+ $schema['[module]'] = array(
9
+ 'description' => t('Table description here.'),
10
+ 'fields' => array(
11
+ 'id' => array(
12
+ 'description' => t('Primary identifier.'),
13
+ 'type' => 'serial',
14
+ 'unsigned' => TRUE,
15
+ 'not null' => TRUE),
16
+ 'status' => array(
17
+ 'description' => t('Status. 0 = unpublished, 1 = published.'),
18
+ 'type' => 'int',
19
+ 'size' => 'tiny',
20
+ 'not null' => FALSE,
21
+ 'default' => 0),
22
+ 'created' => array(
23
+ 'description' => t('The Unix timestamp when the row was created.'),
24
+ 'type' => 'int',
25
+ 'not null' => TRUE,
26
+ 'default' => 0),
27
+ ),
28
+ 'indexes' => array(
29
+ 'status' => array('status'),
30
+ 'created' => array('created'),
31
+ 'id_status' => array('id', 'status'),
32
+ ),
33
+ 'primary key' => array('id'),
34
+ );
35
+
36
+ return $schema;
37
+ }
@@ -0,0 +1,11 @@
1
+
2
+ /**
3
+ * Implementation of hook_theme().
4
+ */
5
+ function [module]_theme($existing, $type, $theme, $path) {
6
+ return array(
7
+ 'forum_topic_navigation' => array(
8
+ 'arguments' => array('node' => NULL),
9
+ ),
10
+ );
11
+ }
@@ -0,0 +1,8 @@
1
+
2
+ $Id$
3
+
4
+
5
+ -------------------------------------------------------------------------------
6
+ [module] 6.4-1.0, YYYY-MM-DD
7
+ -------------------------------------------------------------------------------
8
+ - Initial release
@@ -0,0 +1,36 @@
1
+
2
+ $Id$
3
+
4
+
5
+ [module]
6
+ Provided by [link]
7
+ Developed by [author]
8
+
9
+ -------------------------------------------------------------------------------
10
+ INSTALLATION
11
+ -------------------------------------------------------------------------------
12
+
13
+ todo
14
+
15
+ -------------------------------------------------------------------------------
16
+ PERMISSIONS
17
+ -------------------------------------------------------------------------------
18
+
19
+ permission
20
+ - description
21
+
22
+
23
+ -------------------------------------------------------------------------------
24
+ PUBLIC API
25
+ -------------------------------------------------------------------------------
26
+
27
+ todo
28
+
29
+ -------------------------------------------------------------------------------
30
+ CONVENTIONS
31
+ -------------------------------------------------------------------------------
32
+
33
+ todo
34
+
35
+
36
+
@@ -0,0 +1,40 @@
1
+
2
+ class Drupal
3
+ class Todo_List
4
+
5
+ # Run todo list
6
+ def run(arguments)
7
+ @total = 0
8
+ @arguments = arguments
9
+ @total_only = true if @arguments[0] == 'total'
10
+ @arguments.shift if @total_only == true
11
+ parse_dir('.') if @arguments.empty?
12
+ for argument in @arguments
13
+ parse_file(argument) if File.file?(argument)
14
+ parse_dir(argument) if File.directory?(argument)
15
+ end
16
+ puts "Total todo items: #{@total}" if @total_only == true
17
+ end
18
+
19
+ # Parse file for todo items.
20
+ def parse_file(filepath)
21
+ File.open(filepath) do |file|
22
+ items = []
23
+ file.each_line do |line|
24
+ matches = line.match /(?:#|\/\/|\/\*)[\s]*todo:?[\s]*(.+)$/i
25
+ items << matches[1] unless matches.nil? || matches.length <= 0
26
+ @total += 1 unless matches.nil? || matches.length <= 0
27
+ end
28
+ puts "\n" + filepath unless items.empty? || @total_only == true
29
+ items.each{ |item| puts " - #{item}" } unless @total_only == true
30
+ end
31
+ end
32
+
33
+ # Parse directory for todo items.
34
+ def parse_dir(dir)
35
+ Dir["#{dir == '.' ? '.' : dir}/**/*"].each do |file|
36
+ parse_file(file) if File.file?(file)
37
+ end
38
+ end
39
+ end
40
+ end
File without changes
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: visionmedia-drupal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - tj@vision-media.ca
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-09-29 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Drupal is an open source Ruby development tool allowing developers to quickly generate and manage Drupal modules.
17
+ email: tj@vision-media.ca
18
+ executables:
19
+ - drupal
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - History.txt
24
+ - Manifest.txt
25
+ - README.txt
26
+ files:
27
+ - History.txt
28
+ - Manifest.txt
29
+ - README.txt
30
+ - Rakefile
31
+ - drupal.gemspec
32
+ - lib/drupal.rb
33
+ - lib/drupal/create_module.rb
34
+ - lib/drupal/todo_list.rb
35
+ - lib/drupal/install.rb
36
+ - lib/drupal/templates/comments/file
37
+ - lib/drupal/templates/comments/large
38
+ - lib/drupal/templates/hooks/block
39
+ - lib/drupal/templates/hooks/boot
40
+ - lib/drupal/templates/hooks/cron
41
+ - lib/drupal/templates/hooks/form_alter
42
+ - lib/drupal/templates/hooks/init
43
+ - lib/drupal/templates/hooks/menu
44
+ - lib/drupal/templates/hooks/perm
45
+ - lib/drupal/templates/hooks/schema
46
+ - lib/drupal/templates/hooks/theme
47
+ - lib/drupal/templates/txt/changelog
48
+ - lib/drupal/templates/txt/readme
49
+ - bin/drupal
50
+ has_rdoc: true
51
+ homepage: http://vision-media.ca/resources/drupal/drupal-module-builder-gem
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --main
55
+ - README.txt
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: Drupal development kit
77
+ test_files:
78
+ - test/test_drupal.rb