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 +89 -27
- data/bin/pgxn_utils +5 -1
- data/lib/pgxn_utils/cli.rb +103 -23
- data/lib/pgxn_utils/templates/root/META.json.tt +1 -1
- data/lib/pgxn_utils/templates/root/sql/%extension_name%.sql.tt +1 -1
- data/lib/pgxn_utils/version.rb +1 -1
- data/lib/pgxn_utils.rb +3 -0
- data/pgxn_utils.gemspec +8 -1
- data/spec/cli_spec.rb +11 -5
- data/spec/spec_helper.rb +6 -0
- metadata +38 -5
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
|
-
|
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
|
-
|
20
|
-
Usage:
|
21
|
-
pgxn_utils skeleton extension_name
|
19
|
+
It is all about tasks. Let's see what tasks we have:
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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!
|
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
|
-
|
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 )
|
data/lib/pgxn_utils/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module PgxnUtils
|
2
2
|
class CLI < Thor
|
3
|
-
attr_accessor :extension_name, :target, :maintainer
|
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 => ".",
|
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,
|
15
|
-
method_option :maintainer_mail, :aliases => "-e", :type => :string,
|
16
|
-
method_option :abstract, :aliases => "-a", :type => :string,
|
17
|
-
method_option :license, :aliases => "-l", :type => :string,
|
18
|
-
method_option :version, :aliases => "-v", :type => :string,
|
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,
|
22
|
-
method_option :generated_by, :aliases => "-b", :type => :string,
|
23
|
-
method_option :tags, :aliases => "-t", :type => :array,
|
24
|
-
method_option :release_status, :aliases => "-r", :type => :string,
|
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.
|
37
|
-
self.
|
38
|
-
self.
|
39
|
-
self.
|
40
|
-
self.
|
41
|
-
|
42
|
-
|
43
|
-
self.
|
44
|
-
self.
|
45
|
-
self.
|
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 %>
|
6
|
+
"maintainer": "<%= maintainer %>",
|
7
7
|
"license": "<%= license %>",
|
8
8
|
"provides": {
|
9
9
|
"<%= extension_name %>": {
|
data/lib/pgxn_utils/version.rb
CHANGED
data/lib/pgxn_utils.rb
CHANGED
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 "
|
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
|
-
|
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 "
|
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.
|
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:
|
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: *
|
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.
|
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
|
|