pgxn_utils 0.0.4 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  pgxn utils
2
2
  ==========
3
3
 
4
- What is?
4
+ What is it?
5
5
  --------
6
6
 
7
- This is a set of task that aims to help PostgreSQL developers to focus more on the problem that they wants to solve than in the all structure and files and control files need to PGXS to build the extension.
7
+ It aims to be a set of task that aims to help PostgreSQL extension's developers to focus more on the problem that they wants to solve than in the all structure and files and control files need to PGXS to build the extension.
8
8
 
9
9
  It's a WIP but very functional. Please use it and help me improve it.
10
10
 
@@ -16,31 +16,17 @@ How to install it?
16
16
  How it works?
17
17
  -------------
18
18
 
19
- $ pgxn_utils help skeleton
20
- Usage:
21
- pgxn_utils skeleton extension_name
19
+ It is all about tasks. Let's see what tasks we have:
22
20
 
23
- Options:
24
- -p, [--target=TARGET] # Define the target directory
25
- # Default: .
26
- -m, [--maintainer=MAINTAINER] # Maintainer's name
27
- # Default: The maintainer's name
28
- -e, [--maintainer-mail=MAINTAINER_MAIL] # Maintainer's mail
29
- # Default: maintainer@email.here
30
- -a, [--abstract=ABSTRACT] # Defines a short description to abstract
31
- # Default: A short description
32
- -l, [--license=LICENSE] # The extension license.
33
- # Default: postgresql
34
- -v, [--version=VERSION] # Initial version
35
- # Default: 0.0.1
36
- -d, [--description=DESCRIPTION] # A long text that contains more information about extension
37
- # Default: A long description
38
- -b, [--generated-by=GENERATED_BY] # Name of extension's generator
39
- -t, [--tags=one two three] # Defines extension's tags
40
- -r, [--release-status=RELEASE_STATUS] # Initial extension's release status
41
- # Default: unstable
42
-
43
- See in action...
21
+ $ pgxn_utils help
22
+ Tasks:
23
+ pgxn_utils bundle [extension_name] # Bundles an extension
24
+ pgxn_utils change [extension_name] # Change META's attributes in current extension
25
+ pgxn_utils help [TASK] # Describe available tasks or one specific task
26
+ pgxn_utils skeleton extension_name # Creates an extension skeleton in current directory
27
+
28
+
29
+ # Creating a new extension
44
30
 
45
31
  $ pgxn_utils skeleton my_cool_extension
46
32
  create my_cool_extension
@@ -54,7 +40,83 @@ See in action...
54
40
  create my_cool_extension/test/expected/base.out
55
41
  create my_cool_extension/test/sql/base.sql
56
42
 
57
- Thats it! Start coding! ":)
43
+ Thats it! Just start coding! ":)
44
+
45
+ # Changing something
46
+
47
+ Well suppose you want to change the default maintainer's name and the license, well just do:
48
+
49
+ $ pgxn_utils change my_cool_extension --maintainer "Dickson Guedes" --license bsd
50
+ exist my_cool_extension
51
+ identical my_cool_extension/my_cool_extension.control
52
+ conflict my_cool_extension/META.json
53
+ Overwrite /home/guedes/extensions/my_cool_extension/META.json? (enter "h" for help) [Ynaqdh] d
54
+ {
55
+ "name": "my_cool_extension",
56
+ "abstract": "A short description",
57
+ "description": "A long description",
58
+ "version": "0.0.1",
59
+ - "maintainer": "The maintainer's name",
60
+ + "maintainer": "Dickson Guedes",
61
+ - "license": "postgresql",
62
+ + "license": "bsd",
63
+ "provides": {
64
+ "my_cool_extension": {
65
+ "abstract": "A short description",
66
+ "file": "sql/my_cool_extension.sql",
67
+ "docfile": "doc/my_cool_extension.md",
68
+ "version": "0.0.1"
69
+ }
70
+ },
71
+ "release_status": "unstable",
72
+
73
+ "generated_by": "The maintainer's name",
74
+
75
+
76
+ "meta-spec": {
77
+ "version": "1.0.0",
78
+ "url": "http://pgxn.org/meta/spec.txt"
79
+ }
80
+ }
81
+ Retrying...
82
+ Overwrite /home/guedes/extensions/my_cool_extension/META.json? (enter "h" for help) [Ynaqdh]
83
+ force my_cool_extension/META.json
84
+ identical my_cool_extension/Makefile
85
+ ...
86
+ ...
87
+ ...
88
+
89
+ It will wait you decide what to do.
90
+
91
+ For all switches that you can use with *change*, type:
92
+
93
+ $ pgxn_utils help change
94
+ Usage:
95
+ pgxn_utils change [extension_name]
96
+
97
+ Options:
98
+ -m, [--maintainer=MAINTAINER] # Maintainer's name <maintainer@email>
99
+ -a, [--abstract=ABSTRACT] # Defines a short description to abstract
100
+ -l, [--license=LICENSE] # The extension license.
101
+ -v, [--version=VERSION] # Initial version
102
+ -d, [--description=DESCRIPTION] # A long text that contains more information about extension
103
+ -b, [--generated-by=GENERATED_BY] # Name of extension's generator
104
+ -t, [--tags=one two three] # Defines extension's tags
105
+ -r, [--release-status=RELEASE_STATUS] # Initial extension's release status
106
+
107
+
108
+ # Bundle it!
109
+
110
+ Well, since you finished your work you can bundle it to send to [PGXN](http://pgxn.org).
111
+
112
+ Just type:
113
+
114
+ $ pgxn_utils bundle my_cool_extension
115
+ Extension generated at: /home/guedes/extensions/my_cool_extension-0.0.1.zip
116
+
117
+ # Working in progress
118
+
119
+ I'm working in an option to release the bundled extension, sending it to [PGXN](http://pgxn.org).
58
120
 
59
121
  Copyright and License
60
122
  ---------------------
data/bin/pgxn_utils CHANGED
@@ -2,4 +2,8 @@
2
2
  $:.unshift File.expand_path('..', __FILE__)
3
3
  $:.unshift File.expand_path('../../lib', __FILE__)
4
4
  require 'pgxn_utils'
5
- PgxnUtils::CLI.start
5
+
6
+ task = __FILE__.split('-')[1] if File.basename(__FILE__) != 'pgxn_utils'
7
+ command_args = [ task ] + ARGV if task
8
+
9
+ PgxnUtils::CLI.start( command_args || ARGV )
@@ -1,6 +1,6 @@
1
1
  module PgxnUtils
2
2
  class CLI < Thor
3
- attr_accessor :extension_name, :target, :maintainer, :maintainer_mail
3
+ attr_accessor :extension_name, :target, :maintainer #, :maintainer_mail
4
4
  attr_accessor :abstract, :description, :version, :tags
5
5
  attr_accessor :license, :release_status, :generated_by
6
6
 
@@ -8,42 +8,122 @@ module PgxnUtils
8
8
 
9
9
  desc "skeleton extension_name", "Creates an extension skeleton in current directory."
10
10
 
11
- method_option :target, :aliases => "-p", :default => ".", :desc => "Define the target directory"
11
+ method_option :target, :aliases => "-p", :default => ".", :desc => "Define the target directory"
12
12
 
13
13
  # META required fields
14
- method_option :maintainer, :aliases => "-m", :type => :string, :default => "The maintainer's name", :desc => "Maintainer's name"
15
- method_option :maintainer_mail, :aliases => "-e", :type => :string, :default => "maintainer@email.here", :desc => "Maintainer's mail"
16
- method_option :abstract, :aliases => "-a", :type => :string, :default => "A short description", :desc => "Defines a short description to abstract"
17
- method_option :license, :aliases => "-l", :type => :string, :default => "postgresql", :desc => "The extension license."
18
- method_option :version, :aliases => "-v", :type => :string, :default => "0.0.1", :desc => "Initial version"
14
+ method_option :maintainer, :aliases => "-m", :type => :string, :desc => "Maintainer's name <maintainer@email>"
15
+ #method_option :maintainer_mail, :aliases => "-e", :type => :string, :desc => "Maintainer's mail"
16
+ method_option :abstract, :aliases => "-a", :type => :string, :desc => "Defines a short description to abstract"
17
+ method_option :license, :aliases => "-l", :type => :string, :desc => "The extension license."
18
+ method_option :version, :aliases => "-v", :type => :string, :desc => "Initial version"
19
19
 
20
20
  # META optional fields
21
- method_option :description, :aliases => "-d", :type => :string, :default => "A long description", :desc => "A long text that contains more information about extension"
22
- method_option :generated_by, :aliases => "-b", :type => :string, :desc => "Name of extension's generator"
23
- method_option :tags, :aliases => "-t", :type => :array, :desc => "Defines extension's tags"
24
- method_option :release_status, :aliases => "-r", :type => :string, :default => "unstable", :desc => "Initial extension's release status"
21
+ method_option :description, :aliases => "-d", :type => :string, :desc => "A long text that contains more information about extension"
22
+ method_option :generated_by, :aliases => "-b", :type => :string, :desc => "Name of extension's generator"
23
+ method_option :tags, :aliases => "-t", :type => :array, :desc => "Defines extension's tags"
24
+ method_option :release_status, :aliases => "-r", :type => :string, :desc => "Initial extension's release status"
25
25
 
26
- def skeleton(extension_name)
26
+ def skeleton(extension_name,target=nil)
27
+ self.target = options[:target] || target || "."
27
28
  self.set_accessors extension_name
28
29
 
29
30
  directory "root", extension_name
30
31
  end
31
32
 
33
+ desc "change [extension_name]", "Change META's attributes in current extension."
34
+
35
+ # META required fields
36
+ method_option :maintainer, :aliases => "-m", :type => :string, :desc => "Maintainer's name <maintainer@email>"
37
+ #method_option :maintainer_mail, :aliases => "-e", :type => :string, :desc => "Maintainer's mail"
38
+ method_option :abstract, :aliases => "-a", :type => :string, :desc => "Defines a short description to abstract"
39
+ method_option :license, :aliases => "-l", :type => :string, :desc => "The extension license."
40
+ method_option :version, :aliases => "-v", :type => :string, :desc => "Initial version"
41
+
42
+ # META optional fields
43
+ method_option :description, :aliases => "-d", :type => :string, :desc => "A long text that contains more information about extension"
44
+ method_option :generated_by, :aliases => "-b", :type => :string, :desc => "Name of extension's generator"
45
+ method_option :tags, :aliases => "-t", :type => :array, :desc => "Defines extension's tags"
46
+ method_option :release_status, :aliases => "-r", :type => :string, :desc => "Initial extension's release status"
47
+
48
+ def change(extension_name=".")
49
+ path = File.expand_path(extension_name)
50
+
51
+ target = File.expand_path('..', path)
52
+ extension_name = File.basename(path)
53
+
54
+ skeleton(extension_name, target)
55
+ end
56
+
57
+ desc "bundle [extension_name]", "Bundles an extension."
58
+
59
+ def bundle(extension_name=".")
60
+ unless is_extension?(extension_name)
61
+ say "'#{extension_name}' isn't a valid extension"
62
+ else
63
+ path = File.expand_path(extension_name)
64
+ extension_name = File.basename(path)
65
+
66
+ self.target = path
67
+ archive_name = "#{path}-#{config_options['version']}"
68
+ ext = "zip"
69
+ archive = "#{archive_name}.#{ext}"
70
+
71
+ if can_zip?(archive)
72
+ Zippy.create(archive) do |zip|
73
+ Dir["#{path}/**/**"].each do |file|
74
+ zip["#{extension_name}-#{config_options['version']}/#{file.sub(path+'/','')}"] = File.open(file) unless File.directory?(file)
75
+ end
76
+ end
77
+ say "Extension generated at: #{archive}"
78
+ end
79
+ end
80
+ end
81
+
32
82
  no_tasks do
83
+ def can_zip?(archive)
84
+ can_zip = false
85
+
86
+ if File.exists?(archive)
87
+ if yes? "#{archive} found! Overwrite? [yN]"
88
+ can_zip = true
89
+ else
90
+ can_zip = false
91
+ end
92
+ else
93
+ can_zip = true
94
+ end
95
+ end
96
+
97
+ def is_extension?(dir=".")
98
+ File.directory?(dir) && File.exists?("#{dir}/META.json")
99
+ end
100
+
101
+ def config_options
102
+ file = ""
103
+ file = File.join(file, self.target) if self.target != "."
104
+ file = File.join(file, self.extension_name) if self.extension_name
105
+ file = File.join(file, "META.json")
106
+
107
+ if File.exist?(file)
108
+ @@config_options ||= JSON.load(File.read(file))
109
+ else
110
+ {}
111
+ end
112
+ end
113
+
33
114
  def set_accessors(extension_name="your_extension_name")
34
115
  self.extension_name = extension_name
35
116
 
36
- self.target = options[:target]
37
- self.maintainer = options[:maintainer]
38
- self.maintainer_mail = options[:maintainer_mail]
39
- self.abstract = options[:abstract]
40
- self.license = options[:license]
41
- self.version = options[:version]
42
-
43
- self.description = options[:description]
44
- self.generated_by = options[:generated_by]
45
- self.tags = options[:tags]
46
- self.release_status = options[:release_status]
117
+ self.maintainer = options[:maintainer] || config_options["maintainer"] || "The maintainer's name"
118
+ #self.maintainer_mail = options[:maintainer_mail] || config_options["maintainer_mail"] || "maintainer@email.here"
119
+ self.abstract = options[:abstract] || config_options["abstract"] || "A short description"
120
+ self.license = options[:license] || config_options["license"] || "postgresql"
121
+ self.version = options[:version] || config_options["version"] || "0.0.1"
122
+
123
+ self.description = options[:description] || config_options["description"] || "A long description"
124
+ self.generated_by = options[:generated_by] || config_options["generated_by"] || maintainer
125
+ self.tags = options[:tags] || config_options["tags"]
126
+ self.release_status = options[:release_status] || config_options["release_status"] || "unstable"
47
127
 
48
128
  self.destination_root = target
49
129
  end
@@ -3,7 +3,7 @@
3
3
  "abstract": "<%= abstract %>",
4
4
  "description": "<%= description %>",
5
5
  "version": "<%= version %>",
6
- "maintainer": "<%= maintainer %> <<%= maintainer_mail %>>",
6
+ "maintainer": "<%= maintainer %>",
7
7
  "license": "<%= license %>",
8
8
  "provides": {
9
9
  "<%= extension_name %>": {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Author: <%= maintainer %> <<%= maintainer_mail %>>
2
+ * Author: <%= maintainer %>
3
3
  * Created at: <%= Time.now %>
4
4
  *
5
5
  */
@@ -1,3 +1,3 @@
1
1
  module PgxnUtils
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/pgxn_utils.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require 'thor'
2
+ require 'json'
3
+ require 'zip/zip'
4
+ require 'zippy'
2
5
 
3
6
  module PgxnUtils
4
7
  autoload :CLI, 'pgxn_utils/cli'
data/pgxn_utils.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.authors = ["Dickson S. Guedes"]
11
11
  s.email = ["guedes@guedesoft.net"]
12
12
  s.homepage = "http://github.com/guedes/pgxn-utils"
13
- s.summary = %q{A PGXN set of tools to developers}
13
+ s.summary = %q{A PGXN set of tools to PostgreSQL extension's developers}
14
14
  s.description = %q{A PGXN set of tools to help developers create and publish your PostgreSQL extensions without pain}
15
15
 
16
16
  s.rubyforge_project = "pgxn_utils"
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  # dev
24
24
  s.add_development_dependency "rspec"
25
+ s.add_development_dependency "simplecov", ">= 0.4.0"
25
26
 
26
27
  # prod
27
28
  if s.respond_to? :specification_version then
@@ -29,10 +30,16 @@ Gem::Specification.new do |s|
29
30
 
30
31
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
31
32
  s.add_runtime_dependency(%q<thor>, ["~> 0.14"])
33
+ s.add_runtime_dependency(%q<rubyzip>, ["~> 0.9.4"])
34
+ s.add_runtime_dependency(%q<zippy>, ["~> 0.1.0"])
32
35
  else
33
36
  s.add_dependency(%q<thor>, ["~> 0.14"])
37
+ s.add_runtime_dependency(%q<rubyzip>, ["~> 0.9.4"])
38
+ s.add_runtime_dependency(%q<zippy>, ["~> 0.1.0"])
34
39
  end
35
40
  else
36
41
  s.add_dependency(%q<thor>, ["~> 0.14"])
42
+ s.add_runtime_dependency(%q<rubyzip>, ["~> 0.9.4"])
43
+ s.add_runtime_dependency(%q<zippy>, ["~> 0.1.0"])
37
44
  end
38
45
  end
data/spec/cli_spec.rb CHANGED
@@ -7,7 +7,7 @@ describe PgxnUtils::CLI do
7
7
  system "rm -rf extension.*"
8
8
  end
9
9
 
10
- context "create skeleton" do
10
+ context "#skeleton" do
11
11
  before(:each) do
12
12
  @cli = PgxnUtils::CLI.new
13
13
  end
@@ -42,10 +42,12 @@ describe PgxnUtils::CLI do
42
42
  meta.should match(/"version": "#{expected_version}"/)
43
43
  meta.should match(/"license": "postgresql"/)
44
44
  meta.should match(/"release_status": "unstable"/)
45
- meta.should match(/"#{expected_name} <#{expected_mail}>"/)
45
+ #TODO: I want define how split this from META
46
+ #meta.should match(/"#{expected_name} <#{expected_mail}>"/)
47
+ meta.should match(/"#{expected_name}"/)
46
48
  meta.should match(/"file": "sql\/#{expected_extension}.sql"/)
47
49
  meta.should match(/"docfile": "doc\/#{expected_extension}.md"/)
48
- meta.should_not match(/"generated_by":/)
50
+ meta.should_not match(/"generated_by": #{expected_name}/)
49
51
  meta.should match(/"tags": \[ "one","two","tree" \],/)
50
52
 
51
53
  makefile = File.read("/tmp/#{expected_extension}/Makefile")
@@ -81,12 +83,16 @@ describe PgxnUtils::CLI do
81
83
  it "should generates a git repo"
82
84
  end
83
85
 
84
- context "bundle" do
86
+ context "#change" do
87
+ it "should change things"
88
+ end
89
+
90
+ context "#bundle" do
85
91
  it "should bundle to zip by default"
86
92
  it "should create the name in semver spec"
87
93
  end
88
94
 
89
- context "release" do
95
+ context "#release" do
90
96
  it "should send the bundle to PGXN"
91
97
  end
92
98
 
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,8 @@ $:.unshift File.expand_path('..', __FILE__)
2
2
  $:.unshift File.expand_path('../../lib', __FILE__)
3
3
 
4
4
  require 'rspec'
5
+ require 'simplecov'
6
+ SimpleCov.start
5
7
  require 'pgxn_utils'
6
8
 
7
9
  $counter = 0
@@ -21,6 +23,10 @@ def skeleton(extension_name, args=nil)
21
23
  run_pgxn_utils(:skeleton, "#{extension_name} #{args}")
22
24
  end
23
25
 
26
+ def change(extension_name, args=nil)
27
+ run_pgxn_utils(:skeleton, "#{extension_name} #{args}")
28
+ end
29
+
24
30
  def run_pgxn_utils(task, args)
25
31
  system "#{BIN_PATH} #{task.to_s} #{args} >/dev/null"
26
32
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: pgxn_utils
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.4
5
+ version: 0.1.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dickson S. Guedes
@@ -25,16 +25,49 @@ dependencies:
25
25
  type: :development
26
26
  version_requirements: *id001
27
27
  - !ruby/object:Gem::Dependency
28
- name: thor
28
+ name: simplecov
29
29
  prerelease: false
30
30
  requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 0.4.0
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: thor
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
31
42
  none: false
32
43
  requirements:
33
44
  - - ~>
34
45
  - !ruby/object:Gem::Version
35
46
  version: "0.14"
36
47
  type: :runtime
37
- version_requirements: *id002
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: rubyzip
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: 0.9.4
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: zippy
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.0
69
+ type: :runtime
70
+ version_requirements: *id005
38
71
  description: A PGXN set of tools to help developers create and publish your PostgreSQL extensions without pain
39
72
  email:
40
73
  - guedes@guedesoft.net
@@ -89,9 +122,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
122
  requirements: []
90
123
 
91
124
  rubyforge_project: pgxn_utils
92
- rubygems_version: 1.5.2
125
+ rubygems_version: 1.6.2
93
126
  signing_key:
94
127
  specification_version: 3
95
- summary: A PGXN set of tools to developers
128
+ summary: A PGXN set of tools to PostgreSQL extension's developers
96
129
  test_files: []
97
130