prigner 0.1.0

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 (52) hide show
  1. data/CHANGELOG +248 -0
  2. data/COPYING +21 -0
  3. data/README.mkd +90 -0
  4. data/Rakefile +211 -0
  5. data/bin/prign +65 -0
  6. data/lib/prigner/builder.rb +51 -0
  7. data/lib/prigner/cli/copy.rb +0 -0
  8. data/lib/prigner/cli/list.rb +54 -0
  9. data/lib/prigner/cli/new.rb +96 -0
  10. data/lib/prigner/cli.rb +102 -0
  11. data/lib/prigner/extensions.rb +67 -0
  12. data/lib/prigner/model.rb +97 -0
  13. data/lib/prigner/project.rb +71 -0
  14. data/lib/prigner/template.rb +148 -0
  15. data/lib/prigner.rb +186 -0
  16. data/prigner.gemspec +120 -0
  17. data/share/templates/ruby/default/models/CHANGELOG +13 -0
  18. data/share/templates/ruby/default/models/COPYING +21 -0
  19. data/share/templates/ruby/default/models/README.rdoc +4 -0
  20. data/share/templates/ruby/default/models/module.rb +5 -0
  21. data/share/templates/ruby/default/specfile +16 -0
  22. data/share/templates/ruby/gem/models/CHANGELOG +13 -0
  23. data/share/templates/ruby/gem/models/COPYING +21 -0
  24. data/share/templates/ruby/gem/models/README.mkd +5 -0
  25. data/share/templates/ruby/gem/models/Rakefile +213 -0
  26. data/share/templates/ruby/gem/models/empty_test.rb +16 -0
  27. data/share/templates/ruby/gem/models/gemspec +67 -0
  28. data/share/templates/ruby/gem/models/module.rb +71 -0
  29. data/share/templates/ruby/gem/specfile +20 -0
  30. data/test/builder_test.rb +38 -0
  31. data/test/fixtures/model.rb.erb +12 -0
  32. data/test/fixtures/templates/shared/ruby/default/README.mkd +2 -0
  33. data/test/fixtures/templates/shared/ruby/default/models/README.mkd +2 -0
  34. data/test/fixtures/templates/shared/ruby/default/models/Rakefile +7 -0
  35. data/test/fixtures/templates/shared/ruby/default/models/empty_test.rb +21 -0
  36. data/test/fixtures/templates/shared/ruby/default/models/module.rb +6 -0
  37. data/test/fixtures/templates/shared/ruby/default/specfile +18 -0
  38. data/test/fixtures/templates/user/bash/default/specfile +0 -0
  39. data/test/fixtures/templates/user/ruby/program/models/README.erb +2 -0
  40. data/test/fixtures/templates/user/ruby/program/models/cli.rb.erb +5 -0
  41. data/test/fixtures/templates/user/ruby/program/models/module.rb.erb +6 -0
  42. data/test/fixtures/templates/user/ruby/program/models/program.rb.erb +3 -0
  43. data/test/fixtures/templates/user/ruby/program/specfile +18 -0
  44. data/test/fixtures/templates/user/vim/default/specfile +0 -0
  45. data/test/fixtures/templates/user/vim/plugin/specfile +0 -0
  46. data/test/fixtures/templates/user/vim/syntax/specfile +0 -0
  47. data/test/helpers.rb +22 -0
  48. data/test/model_test.rb +82 -0
  49. data/test/project_test.rb +46 -0
  50. data/test/spec_test.rb +64 -0
  51. data/test/template_test.rb +88 -0
  52. metadata +142 -0
@@ -0,0 +1,67 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.platform = Gem::Platform::RUBY
3
+
4
+ #about
5
+ spec.name = "<%=project.name%>"
6
+ spec.summary = "Say anything about <%=project.name%>"
7
+ spec.description = "Describes <%=project.name%>"
8
+ spec.author = "<%=project.author%>"
9
+ spec.email = ""
10
+ spec.homepage = "http://rubygems.org/gems/<%=project.name%>"
11
+ #spec.executables = [ "" ]
12
+ #spec.default_executable = ""
13
+ #
14
+
15
+ #version
16
+ spec.version = "0.0.1"
17
+ spec.date = "<%=date%>"
18
+ #
19
+
20
+ #dependencies
21
+ #spec.add_dependency ""
22
+ #
23
+
24
+ #manifest
25
+ spec.files = [
26
+ "CHANGELOG",
27
+ "COPYING",
28
+ "README.mkd",
29
+ "Rakefile",
30
+ "lib/<%=project.name%>.rb",
31
+ "<%=project.name%>.gemspec",
32
+ "test/<%=project.name%>_test.rb",
33
+ ]
34
+ #
35
+
36
+ spec.test_files = spec.files.select{ |path| path =~ /^test\/*test*/ }
37
+
38
+ spec.require_paths = ["lib"]
39
+
40
+ #documentation
41
+ spec.has_rdoc = true
42
+ spec.extra_rdoc_files = [
43
+ "README.mkd",
44
+ "COPYING",
45
+ "CHANGELOG"
46
+ ]
47
+ spec.rdoc_options = [
48
+ "--inline-source",
49
+ "--line-numbers",
50
+ "--charset", "utf8",
51
+ "--main", "<%=project.class_name%>",
52
+ "--title", "<%=project.class_name%> v#{spec.version} API Documentation"
53
+ ]
54
+
55
+ #rubygems
56
+ spec.rubyforge_project = spec.name
57
+ spec.post_install_message = <<-end_message.gsub(/^[ ]{4}/,'')
58
+ #{'-'*78}
59
+ <%=project.class_name%> v#{spec.version}
60
+
61
+ Thanks for use <%=project.class_name%>.
62
+
63
+ #{'-'*78}
64
+ end_message
65
+ #
66
+ end
67
+
@@ -0,0 +1,71 @@
1
+ #@ ---
2
+ #@ :tag: 0.0.1
3
+ #@ :date: <%=date%>
4
+ #@ :milestone: Pre-Alpha
5
+ #@ :timestamp: <%=Time.now.strftime "%F %T %z"%>
6
+
7
+ # encoding: UTF-8
8
+
9
+ module <%=project.upper_camel_case_namespace%>
10
+
11
+ # RubyGems
12
+ require "rubygems" unless $LOADED_FEATURES.include? "rubygems.rb"
13
+
14
+ # Standard library requirements
15
+ require "pathname"
16
+ require "yaml"
17
+
18
+ # Return the current version.
19
+ def self.version
20
+ @version ||= Version.current
21
+ end
22
+
23
+ class Version #:nodoc:
24
+
25
+ FILE = Pathname.new(__FILE__).freeze
26
+
27
+ attr_accessor :tag, :date, :milestone
28
+ attr_reader :timestamp
29
+
30
+ def initialize(attributes = {})
31
+ attributes.each do |attribute, value|
32
+ send("#{attribute}=", value) if respond_to? "#{attribute}="
33
+ end
34
+ @timestamp = attributes[:timestamp]
35
+ end
36
+
37
+ def to_hash
38
+ [:tag, :date, :milestone, :timestamp].inject({}) do |hash, key|
39
+ hash[key] = send(key)
40
+ hash
41
+ end
42
+ end
43
+
44
+ def save!
45
+ @date = Date.today
46
+ source = FILE.readlines
47
+ source[0..4] = self.to_hash.to_yaml.to_s.gsub(/^/, '#@ ')
48
+ FILE.open("w+") do |file|
49
+ file << source.join("")
50
+ end
51
+ self
52
+ end
53
+
54
+ class << self
55
+ def current
56
+ yaml = FILE.readlines[0..4].
57
+ join("").
58
+ gsub(/\#@ /,'')
59
+ new(YAML.load(yaml))
60
+ end
61
+
62
+ def to_s
63
+ name.match(/(.*?)::.*/)
64
+ "#{$1} v#{current.tag}, #{current.date} (#{current.milestone})"
65
+ end
66
+ end # self
67
+
68
+ end # Version
69
+
70
+ end
71
+
@@ -0,0 +1,20 @@
1
+ author : Hallison Batista
2
+ email : hallison@codigorama.com
3
+ version : 0.1.0
4
+ description : Default template for RubyGem projects
5
+
6
+ options:
7
+
8
+ directories:
9
+ - lib/(project)
10
+ - test/fixtures
11
+
12
+ files:
13
+ CHANGELOG:
14
+ COPYING:
15
+ README.mkd:
16
+ Rakefile:
17
+ gemspec: (project).gemspec
18
+ module.rb: lib/(project).rb
19
+ empty_test.rb: test/(project)_test.rb
20
+
@@ -0,0 +1,38 @@
1
+ require "test/unit"
2
+ require "test/helpers"
3
+ require "lib/prigner"
4
+
5
+ class BuilderTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @template = Prigner::Template.load(:ruby)
9
+ @project = Prigner::Project.new("#{FIXTURES}/project/duck")
10
+ @builder = Prigner::Builder.new(@project, @template)
11
+ end
12
+
13
+ def teardown
14
+ FileUtils.remove_dir @project.path if File.exist? @project.path
15
+ end
16
+
17
+ should "create project path" do
18
+ @builder.make_project_path.each do |path, status|
19
+ assert status, "Project path #{path} not created"
20
+ end
21
+ end
22
+
23
+ should "create project directories" do
24
+ directories = @builder.make_project_directories
25
+ directories.each do |directory, status|
26
+ assert status, "Directory #{directory} not created"
27
+ end
28
+ end
29
+
30
+ should "create project files" do
31
+ files = @builder.make_project_files
32
+ files.each do |file, status|
33
+ assert status, "File #{file} not created"
34
+ end
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/ruby
2
+ # name : <%=name%>
3
+ # version: <%=version%>
4
+ # author : <%=author%>
5
+
6
+ module Project
7
+ <%for function in functions%>
8
+ def <%=function%>
9
+ # type code for <%=function%>
10
+ end
11
+ <%end%>
12
+ end
@@ -0,0 +1,2 @@
1
+ <%=project.class_name%>
2
+ <%='=' * project.class_name.size%>
@@ -0,0 +1,7 @@
1
+ <%= '# $Id$' if option.svn.enabled %>
2
+ require "lib/<%=project.name%>"
3
+
4
+ task :test do |spec, args|
5
+ sh "testrb -v test/*_test.rb"
6
+ end
7
+
@@ -0,0 +1,21 @@
1
+ <%= '# $Id$' if option.svn.enabled %>
2
+ BASE_PATH = "#{File.expand_path(File.dirname(__FILE__))}/.."
3
+
4
+ $LOAD_PATH.unshift(BASE_PATH) unless $LOAD_PATH.include? BASE_PATH
5
+
6
+ require "test/unit"
7
+ require "test/helpers"
8
+ require "lib/<%=project.name%>"
9
+
10
+ class <%=project.class_name%>Test < Test::Unit::TestCase
11
+
12
+ def setup
13
+ # start here
14
+ end
15
+
16
+ should "check the truth" do
17
+ assert true
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,6 @@
1
+ <%= '# $Id$' if option.svn.enabled %>
2
+ module <%=project.upper_camel_case_namespace%>
3
+
4
+ # codify
5
+
6
+ end
@@ -0,0 +1,18 @@
1
+ author : John Doe
2
+ email : john.doe@se7en.com
3
+ version : 0.1.0
4
+ description : Default template for Ruby projects
5
+
6
+ options:
7
+ svn: Include Subversion keywords in code.
8
+ git: Enable Git flags in templates.
9
+
10
+ directories:
11
+ - test/fixtures
12
+ - lib/(project)
13
+
14
+ files:
15
+ README.mkd :
16
+ module.rb : lib/(project).rb
17
+ empty_test.rb : test/(project)_test.rb
18
+
@@ -0,0 +1,2 @@
1
+ <%=name.capitalize%>
2
+ <%='=' * name.size%>
@@ -0,0 +1,5 @@
1
+ module <%=name.capitalize%>::CLI
2
+ def self.run(*args)
3
+ # codify
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ <%= '# $Id$' if option.svn.enabled -%>
2
+ module <%=name.capitalize%>
3
+
4
+ # codify
5
+
6
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ <%=name.capitalize%>::CLI.run(*ARGV)
@@ -0,0 +1,18 @@
1
+ author : John Doe
2
+ email : john.doe@se7en.com
3
+ version : 0.1.0
4
+ description : Default template for Ruby projects
5
+
6
+ options:
7
+ svn: Include Subversion keywords in code.
8
+ git: Enable Git flags in templates.
9
+
10
+ directories:
11
+ - test/fixtures
12
+ - lib/(project)
13
+
14
+ files:
15
+ README.mkd.erb :
16
+ module.rb.erb : lib/(project).rb
17
+ empty_test.rb.erb : test/(project)_test.rb
18
+
File without changes
File without changes
File without changes
data/test/helpers.rb ADDED
@@ -0,0 +1,22 @@
1
+ # This code extracted from book "Ruby Best Practices" and the code be found
2
+ # in http://github.com/sandal/rbp/blob/master/testing/test_unit_extensions.rb
3
+
4
+ FIXTURES = File.expand_path(File.join(File.dirname(__FILE__), "fixtures")) unless defined? FIXTURES
5
+
6
+ module Test::Unit
7
+ class TestCase
8
+ def self.should(description, &block)
9
+ test_name = "test_#{description.gsub(/\s+/,'_')}".downcase.to_sym
10
+ defined = instance_method(test_name) rescue false
11
+ raise "#{test_name} is already defined in #{self}" if defined
12
+ if block_given?
13
+ define_method(test_name, &block)
14
+ else
15
+ define_method(test_name) do
16
+ flunk "No implementation provided for #{description}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,82 @@
1
+ require "test/unit"
2
+ require "test/helpers"
3
+ require "lib/prigner"
4
+
5
+ class ModelTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @binds = {
9
+ :name => "project",
10
+ :version => "0.1.0",
11
+ :author => "John Doe",
12
+ :functions => [
13
+ :create,
14
+ :recover,
15
+ :update,
16
+ :delete
17
+ ]
18
+ }
19
+ @file = "#{FIXTURES}/model-result.rb"
20
+ @model = Prigner::Model.new("#{FIXTURES}/model.rb.erb", @binds)
21
+ end
22
+
23
+ def teardown
24
+ File.delete(@file) if File.exist?(@file)
25
+ end
26
+
27
+ should "check bind values" do
28
+ @binds.map do |key, value|
29
+ assert_equal value, @model.binder.send(key)
30
+ end
31
+ end
32
+
33
+ should "build contents" do
34
+ @model.build!
35
+
36
+ assert_equal <<-end_result.gsub(/^[ ]{6}/, ''), @model.contents
37
+ #!/usr/bin/ruby
38
+ # name : project
39
+ # version: 0.1.0
40
+ # author : John Doe
41
+
42
+ module Project
43
+
44
+ def create
45
+ # type code for create
46
+ end
47
+
48
+ def recover
49
+ # type code for recover
50
+ end
51
+
52
+ def update
53
+ # type code for update
54
+ end
55
+
56
+ def delete
57
+ # type code for delete
58
+ end
59
+
60
+ end
61
+ end_result
62
+ end
63
+
64
+ should "write file using contents parsed" do
65
+ @model.write @file
66
+ assert File.exist?(@file)
67
+ assert_equal @model.contents, File.read(@file)
68
+ end
69
+
70
+ should "write result file" do
71
+ file = "#{FIXTURES}/models/should-exist-new-project.rb"
72
+ @model.write file
73
+
74
+ assert_equal file, @model.file_written
75
+ assert_equal @model.contents, File.read(file)
76
+ assert File.exist?(file)
77
+
78
+ File.delete(file)
79
+ end
80
+
81
+ end
82
+
@@ -0,0 +1,46 @@
1
+ require "test/unit"
2
+ require "test/helpers"
3
+ require "lib/prigner"
4
+
5
+ class ProjectTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @project = Prigner::Project.new("#{FIXTURES}/project/ruby-tagger")
9
+ end
10
+
11
+ should "check basic attributes of project" do
12
+ assert_equal "#{FIXTURES}/project/ruby-tagger", @project.path
13
+ assert_equal "ruby-tagger", @project.name
14
+ end
15
+
16
+ should "split name" do
17
+ assert_equal %w{ruby tagger}, @project.name_splited
18
+ end
19
+
20
+ should "naming to upper camel case" do
21
+ assert_equal "RubyTagger", @project.upper_camel_case_name
22
+ assert_equal "rubyTagger", @project.lower_camel_case_name
23
+ end
24
+
25
+ should "naming to namespace with upper camel case" do
26
+ assert_equal "Ruby::Tagger", @project.upper_camel_case_namespace("::")
27
+ assert_equal "Ruby.Tagger", @project.upper_camel_case_namespace(".")
28
+ end
29
+
30
+ should "naming to namespace with lower camel case" do
31
+ assert_equal "ruby::Tagger", @project.lower_camel_case_namespace("::")
32
+ assert_equal "ruby.Tagger", @project.lower_camel_case_namespace(".")
33
+ end
34
+
35
+ should "naming to namespace with upper case" do
36
+ assert_equal "RUBY::TAGGER", @project.upper_case_namespace("::")
37
+ assert_equal "RUBY.TAGGER", @project.upper_case_namespace(".")
38
+ end
39
+
40
+ should "naming to namespace with lower case" do
41
+ assert_equal "ruby::tagger", @project.lower_case_namespace("::")
42
+ assert_equal "ruby.tagger", @project.lower_case_namespace(".")
43
+ end
44
+
45
+ end
46
+
data/test/spec_test.rb ADDED
@@ -0,0 +1,64 @@
1
+ require "test/unit"
2
+ require "test/helpers"
3
+ require "lib/prigner"
4
+
5
+ class SpecTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @info = {
9
+ "author" => "John Doe",
10
+ "email" => "john.doe@se7en.com",
11
+ "version" => "0.1.0",
12
+ "description" => "Default template for Ruby projects"
13
+ }
14
+ @options = {
15
+ "svn" => "Include Subversion keywords in code.",
16
+ "git" => "Enable Git flags in templates."
17
+ }
18
+ @directories = [
19
+ "test/fixtures",
20
+ "lib/(project)"
21
+ ]
22
+ @files = {
23
+ "README.mkd" => nil,
24
+ "module.rb" => "lib/(project).rb",
25
+ "empty_test.rb" => "test/(project)_test.rb"
26
+ }
27
+ specfile = "#{FIXTURES}/templates/shared/ruby/default/specfile"
28
+ @spec = Prigner::Spec.load(specfile)
29
+ end
30
+
31
+ should "check basic informatio about template" do
32
+ @info.each do |attribute, value|
33
+ assert_equal value, @spec.send(attribute)
34
+ end
35
+
36
+ assert_equal @directories.sort, @spec.directories.sort
37
+
38
+ %w{options files}.each do |checker|
39
+ instance_variable_get("@#{checker}").each do |attribute, value|
40
+ assert_equal value, @spec.send(checker)[attribute]
41
+ end
42
+ end
43
+ end
44
+
45
+ should "set default values when initialize with emtpy attributes" do
46
+ spec = Prigner::Spec.new(nil)
47
+ assert_kind_of Array, spec.directories
48
+ assert_kind_of Hash, spec.files
49
+ assert_kind_of Hash, spec.options
50
+ end
51
+
52
+ should "raise runtime error if specfile is nil" do
53
+ assert_raises RuntimeError do
54
+ Prigner::Spec.load(nil)
55
+ end
56
+ end
57
+
58
+ should "raise runtime error if specfile not exist" do
59
+ assert_raises RuntimeError do
60
+ Prigner::Spec.load("not/found")
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,88 @@
1
+ require "test/unit"
2
+ require "test/helpers"
3
+ require "lib/prigner"
4
+
5
+ class Prigner::Template
6
+ def self.shared_path
7
+ [ "#{FIXTURES}/templates/user",
8
+ "#{FIXTURES}/templates/shared" ]
9
+ end
10
+ end
11
+
12
+ class TemplateTest < Test::Unit::TestCase
13
+
14
+ def setup
15
+ @options = {
16
+ :svn => "Include Subversion keywords in code.",
17
+ :git => "Enable Git flags in templates."
18
+ }
19
+ @path = "#{FIXTURES}/templates/shared/ruby/default"
20
+ @project_path = "#{FIXTURES}/project/foo"
21
+ @template = Prigner::Template.new(@path)
22
+ end
23
+
24
+ def teardown
25
+ FileUtils.remove_dir @project_path if File.exist? @project_path
26
+ end
27
+
28
+ should "load basic attributes from directory name" do
29
+ assert_equal "ruby", @template.namespace
30
+ assert_equal "default", @template.name
31
+ end
32
+
33
+ should "load options" do
34
+ @options.keys.each do |option|
35
+ assert_equal @options[option], @template.options[option].description
36
+ end
37
+ end
38
+
39
+ should "disable all options by default" do
40
+ @options.keys.each do |option|
41
+ assert !@template.options[option].enabled
42
+ end
43
+ end
44
+
45
+ should "load a template using namespace" do
46
+ template = Prigner::Template.load(:ruby)
47
+ assert_equal @path, template.path.to_s
48
+ assert_equal "ruby", template.namespace
49
+ assert_equal "default", template.name
50
+ end
51
+
52
+ should "load a template looking home user directory" do
53
+ ENV['HOME'] = "#{FIXTURES}/templates/user"
54
+ template = Prigner::Template.load(:ruby, :program)
55
+ assert_equal "ruby", template.namespace
56
+ assert_equal "program", template.name
57
+ end
58
+
59
+ should "check number of models and directories" do
60
+ assert_equal 2, @template.directories.size
61
+ assert_equal 3, @template.models.size, "Models size not matched"
62
+ end
63
+
64
+ should "list all template paths from shared path" do
65
+ assert_equal 6, Prigner::Template.all_template_paths.size
66
+ end
67
+
68
+ should "list all templates grouped by namespace" do
69
+ assert_equal 3, Prigner::Template.all.keys.size
70
+ assert_equal 1, Prigner::Template.all["bash"].size
71
+ assert_equal 2, Prigner::Template.all["ruby"].size
72
+ assert_equal 3, Prigner::Template.all["vim"].size
73
+ end
74
+
75
+ should "raise runtime error when specfile not found" do
76
+ assert_raises RuntimeError do
77
+ Prigner::Template.new("not/exist")
78
+ end
79
+ end
80
+
81
+ should "raise runtime error when nil values to namespace and/or template" do
82
+ assert_raises RuntimeError do
83
+ Prigner::Template.load(nil, nil)
84
+ end
85
+ end
86
+
87
+ end
88
+