qrpm 0.1.0 → 0.3.1

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.
data/lib/qrpm/rpm.rb CHANGED
@@ -2,64 +2,104 @@ require 'erb'
2
2
  require 'fileutils'
3
3
 
4
4
  module Qrpm
5
+ # Knows the following RPM fields:
6
+ #
7
+ # name Package name (mandatory)
8
+ # version Version (mandatory)
9
+ # release Release
10
+ # summary Short one-line description of package (mandatory)
11
+ # description Description
12
+ # packager Name of the packager (defaults to the name of the user or
13
+ # $USER@$HOSTNAME if not found)
14
+ # license License (defaults to GPL)
15
+ # require Array of required packages
16
+ # make Controls the build process:
17
+ # null Search the top-level directory for configure or
18
+ # make files and runs them. Skip building if not
19
+ # found. This is the default
20
+ # true Expect the top-level directory to contain
21
+ # configure or make files and runs them. It is an
22
+ # error if the Makefile is missing
23
+ # (array of commands)
24
+ # Runs the commands to build the project
25
+ #
26
+ # Each field has a dynamically generated accessor method that can be
27
+ # referenced in the template file
5
28
  class Rpm
6
- # Defines the following member methods:
7
- #
8
- # name Package name
9
- # version Version
10
- # release Release
11
- # license License (defaults to GPL)
12
- # summary Short one-line description of package
13
- # description Description
14
- # packager Name of the packager (defaults to the name of the current
15
- # user or the value of the $USER environment variable if not
16
- # found)
17
- # require Array of required packages
18
- # make Controls the build process:
19
- # null Search the top-level directory for configure or
20
- # make files and runs them. Skip building if not
21
- # found. This is the default
22
- # true Expect the top-level directory to contain
23
- # configure make files and runs them. It is an
24
- # error if the Makefile is missing
25
- # (array of commands)
26
- # Runs the commands to build the project
27
- #
28
- FIELDS = %w(name version release group license summary description packager requires make)
29
- MANDATORY_FIELDS = %w(name summary version)
30
- TEMPLATE = "#{::File.dirname(__FILE__)}/template.erb"
29
+ MANDATORY_FIELDS = %w(name version summary)
30
+
31
+ # Maps from field name to array of allowed types for that field
32
+ FIELDS = MANDATORY_FIELDS.map { |f| [f, [String]] }.to_h.merge({
33
+ "release" => [String],
34
+ "description" => [String],
35
+ "packager" => [String],
36
+ "license" => [String],
37
+ "group" => [String],
38
+ "include" => [Array, String],
39
+ "require" => [Array, String],
40
+ "make" => [Array, String]
41
+ })
31
42
 
32
43
  RPM_DIRS = %w(SOURCES BUILD RPMS SPECS SRPMS tmp)
33
44
 
34
- # Field accessor methods
35
- FIELDS.each { |f| eval "def #{f}() @fields[\"#{f}\"] end" }
45
+ # Field accessor methods. FIXME Value should have been resolved
46
+ FIELDS.each { |f,ts|
47
+ if ts.include? Array
48
+ eval <<-EOS
49
+ def #{f}()
50
+ case v = @fields["#{f}"]
51
+ when ValueNode
52
+ v.value
53
+ when ArrayNode
54
+ v.values.map(&:value)
55
+ when NilClass
56
+ nil
57
+ else
58
+ raise ArgumentError, "Can this even happen?"
59
+ end
60
+ end
61
+ EOS
62
+ else
63
+ eval "def #{f}() @fields[\"#{f}\"]&.value end"
64
+ end
65
+ }
36
66
 
37
67
  attr_reader :fields
38
68
  attr_reader :nodes
39
69
 
70
+ # The source directory
71
+ attr_reader :srcdir
72
+
40
73
  # The content of the SPEC file
41
74
  attr_reader :spec
42
75
 
43
76
  def files() @files ||= nodes.select(&:file?) end
44
- def links() @lines ||= nodes.select(&:link?) end
45
-
46
- def verbose?() @verbose end
47
-
48
- def initialize(fields, nodes, template: TEMPLATE, verbose: false)
77
+ def links() @links ||= nodes.select(&:link?) end
78
+ def reflinks() @reflinks ||= nodes.select(&:reflink?) end
79
+ def symlinks() @symlinks ||= nodes.select(&:symlink?) end
80
+
81
+ def initialize(srcdir, fields, nodes, template: QRPM_ERB_FILE)
82
+ constrain srcdir, String
83
+ constrain fields, String => Node
84
+ constrain nodes, [FileNode]
49
85
  @fields, @nodes = fields, nodes
86
+ @srcdir = srcdir
50
87
  @template = template
51
- @verbose = verbose
52
- @verb = verbose ? "" : "&>/dev/null"
53
88
  end
54
89
 
55
- def has_configure?() ::File.exist? "configure" end
56
- def has_make?() ::File.exist? "make" end
90
+ def has_configure?() ::File.exist? "#{srcdir}/configure" end
91
+ def has_make?() ::File.exist? "#{srcdir}/Makefile" end
57
92
 
58
- def build(target: :rpm, file: nil, verbose: false, destdir: ".")
93
+ def build(target: :rpm, file: nil, verbose: false, destdir: ".", builddir: nil)
59
94
  verb = verbose ? "" : "&>/dev/null"
60
- Dir.mktmpdir { |rootdir|
61
- FileUtils.rm_rf(rootdir)
62
- FileUtils.mkdir_p(rootdir)
95
+ begin
96
+ if builddir
97
+ rootdir = builddir
98
+ FileUtils.rm_rf(rootdir)
99
+ FileUtils.mkdir_p(rootdir)
100
+ else
101
+ rootdir = Dir.mktmpdir
102
+ end
63
103
 
64
104
  spec_file = file || "#{name}.spec"
65
105
  tar_file = "#{name}.tar.gz"
@@ -69,47 +109,51 @@ module Qrpm
69
109
  # Create directories
70
110
  RPM_DIRS.each { |dir| FileUtils.mkdir_p "#{rootdir}/#{dir}" }
71
111
 
72
- # Directory for tarball creation. This lives inside the RPM directory
73
- # structure and is removed before we start rpmbuild
74
- tarroot = "#{rootdir}/tmp/#{name}"
75
- FileUtils.mkdir(tarroot)
76
-
77
- # Copy files
78
- FileUtils.cp_r(".", tarroot, preserve: true)
79
-
80
- # Roll tarball and put it in the SOURCES directory
81
- system "tar zcf #{tar_path} -C #{rootdir}/tmp #{name} #{verb}" or raise "Can't roll tarball"
82
-
83
- # Remove temporary tar dir
84
- FileUtils.rm_rf tarroot
85
-
86
- # Create spec file
112
+ # Roll tarball
113
+ #
114
+ # It is a bad idea to use git-archive to roll a tarball because we may
115
+ # have configuration files/scripts that are not included in the git
116
+ # repository. If needed then see
117
+ # https://gist.github.com/arteymix/03702e3eb05c2c161a86b49d4626d21f
118
+ #
119
+ # Alternatively use the --add-file option? Then we need to know if
120
+ # files are in the git repo or not
121
+ system "tar zcf #{tar_path} --transform=s%^\./%#{name}/% ." # FIXME FIXME
122
+
123
+ # Create spec file. Initial blanks are removed from each line in the file
87
124
  renderer = ERB.new(IO.read(@template).sub(/^__END__\n.*/m, ""), trim_mode: "-")
88
- @spec = renderer.result(binding)
125
+ @spec = renderer.result(binding).gsub(/^[[:blank:]]*/, "")
89
126
 
90
127
  # Emit spec or build RPM
91
128
  if target == :spec
92
- IO.write("#{destdir}/#{spec_file}", @spec)
129
+ destfiles = ["#{destdir}/#{spec_file}"]
130
+ IO.write(destfiles.first, @spec)
93
131
  else
94
132
  IO.write(spec_path, @spec)
95
133
  system "rpmbuild -v -ba --define \"_topdir #{rootdir}\" #{rootdir}/SPECS/#{name}.spec #{verb}" or
96
134
  raise "Failed building RPM file. Re-run with -v option to see errors"
97
135
  if target == :srpm
98
- system "cp #{rootdir}/SRPMS/* #{destdir}" or raise "Failed copying SRPM file"
136
+ destfiles = Dir["#{rootdir}/SRPMS/*"]
137
+ !destfiles.empty? or raise Error, "No SRPM file found"
99
138
  elsif target == :rpm
100
- system "cp #{rootdir}/RPMS/*/#{name}-[0-9]* #{destdir}" or raise "Failed copying RPM file"
139
+ destfiles = Dir["#{rootdir}/RPMS/*/#{name}-[0-9]*"]
140
+ !destfiles.empty? or raise Error, "No RPM file found"
101
141
  else
102
142
  raise ArgumentError, "Not a valid value for :target - #{target.inspect}"
103
143
  end
144
+ system "cp #{destfiles.join " "} #{destdir}" or raise "Failed copying SRPM file"
104
145
  end
105
- }
146
+ return destfiles
147
+ ensure
148
+ FileUtils.remove_entry_secure rootdir if !builddir
149
+ end
106
150
  end
107
151
 
108
152
  def dump
109
153
  puts self.class
110
154
  indent {
111
155
  puts "fields"
112
- indent { fields.each { |k,v| puts "#{k}: #{v.inspect}" } }
156
+ indent { fields.sort_by(&:first).each { |k,v| puts "#{k}: #{v.value}" } }
113
157
  puts "nodes"
114
158
  indent { nodes.map(&:dump) }
115
159
  }
@@ -1,4 +1,3 @@
1
-
2
1
  Name: <%= name %>
3
2
  Summary: <%= summary %>
4
3
  Version: <%= version %>
@@ -6,13 +5,12 @@ Release: <%= release %>
6
5
  License: <%= license %>
7
6
  Packager: <%= packager %>
8
7
  <% if group -%>
9
- Group: <%= group %>
8
+ Group: <%= group %>
10
9
  <% end -%>
11
- <% for pck in requires || [] -%>
12
- Requires: <%= pck %>
10
+ <% for pck in require || [] -%>
11
+ Requires: <%= pck %>
13
12
  <% end -%>
14
13
  Source: %{name}.tar.gz
15
- BuildRoot: <%= rootdir %>/tmp/%{name}-%{version}
16
14
 
17
15
  %description
18
16
  <%= description %>
@@ -21,55 +19,56 @@ BuildRoot: <%= rootdir %>/tmp/%{name}-%{version}
21
19
  %setup -n <%= name %>
22
20
 
23
21
  %build
22
+ cd <%= srcdir %>
24
23
  <% if make.nil? -%>
25
- <% if has_configure? -%>
26
- ./configure
27
- <% end -%>
28
- <% if has_make? -%>
29
- make
30
- <% end -%>
24
+ <% if has_configure? -%>
25
+ ./configure
26
+ <% end -%>
27
+ <% if has_make? -%>
28
+ make
29
+ <% end -%>
31
30
  <% elsif make == false -%>
32
31
  <% elsif make == true -%>
33
- <% if has_configure? -%>
34
- ./configure
35
- <% end -%>
36
- make
32
+ <% if has_configure? -%>
33
+ ./configure
34
+ <% end -%>
35
+ make
37
36
  <% elsif make.is_a? Array -%>
38
- <% for cmd in make -%>
39
- <%= cmd %>
40
- <% end -%>
37
+ <% for cmd in make -%>
38
+ <%= cmd.value %>
39
+ <% end -%>
41
40
  <% end -%>
42
41
 
43
42
  %install
44
43
  <% if !nodes.empty? -%>
45
44
  mkdir -p <%= nodes.map { |f| "%{buildroot}#{f.directory}" }.uniq.join(" ") %>
46
45
  <% for file in files -%>
47
- cp <%= file.file %> %{buildroot}<%= file.path %>
46
+ cp <%= file.srcpath %> %{buildroot}<%= file.dstpath %>
48
47
  <% end -%>
49
48
  <% for link in links -%>
50
- touch %{buildroot}<%= link.path %>
49
+ touch %{buildroot}<%= link.dstpath %>
51
50
  <% end -%>
52
51
  <% end -%>
53
52
 
54
53
  %files
55
54
  <% for file in files -%>
56
- <%= file.path %>
55
+ <%= file.dstpath %>
57
56
  <% end -%>
58
57
  <% for link in links -%>
59
- %ghost <%= link.path %>
58
+ %ghost <%= link.dstpath %>
60
59
  <% end -%>
61
60
 
62
61
  %clean
63
- %if "%{clean}" != ""
64
- rm -rf %{_topdir}/BUILD/%{name}
65
- [ $(basename %{buildroot}) == "%{name}-%{version}-%{release}.%{_target_cpu}" ] && rm -rf %{buildroot}
66
- %endif
62
+ true # no-op
67
63
 
68
64
  %post
69
65
  <% for file in files.select(&:perm) -%>
70
- chmod <%= file.perm %> <%= file.path %>
66
+ chmod <%= file.perm %> <%= file.dstpath %>
67
+ <% end -%>
68
+ <% for file in reflinks -%>
69
+ ln -sf <%= link.reflink %> <%= link.dstpath %>
71
70
  <% end -%>
72
- <% for file in links -%>
73
- ln -sf <%= link.link %> <%= link.path %>
71
+ <% for file in symlinks -%>
72
+ ln -sf <%= link.symlink %> <%= link.dstpath %>
74
73
  <% end -%>
75
74
 
@@ -45,7 +45,7 @@ make: null # make can be undefined or null (use make if present), false
45
45
  #
46
46
  # It is used like this
47
47
  #
48
- # /opt/my_files
48
+ # /opt/my_files:
49
49
  # - name: data
50
50
  # file: src/my_data
51
51
  # perm: 600
@@ -53,18 +53,17 @@ make: null # make can be undefined or null (use make if present), false
53
53
  # This will copy src/my_data to a 'data' file in the /opt/my_files directory
54
54
  # with permissions 0600
55
55
  #
56
- # Links can only be specified using attributes
56
+ # Link files are specified using the :link attribute that is a path on the
57
+ # target system:
57
58
  #
58
- # name: Destination file name. Default is the last path component in :link
59
- # link: Path to the file that will be pointed to by the link
59
+ # /opt/my_files:
60
+ # - name: linked_data
61
+ # link: /opt/my_files/data
60
62
  #
61
- # To create a symbolic link in /var/lib/ from my_app to /opt/my_files/data:
63
+ # Default name for link files is the basename of of :link
62
64
  #
63
- # libdir:
64
- # - name: my_app
65
- # link: /opt/my_files/data
66
65
  #
67
- # The following standard directories are defined:
66
+ # The following standard directories are defined: FIXME Outdated
68
67
  #
69
68
  # etcdir /etc Configuration files
70
69
  # bindir /usr/bin Executables
@@ -72,16 +71,20 @@ make: null # make can be undefined or null (use make if present), false
72
71
  # libdir /usr/lib Libraries (both binary and clear text)
73
72
  # libexecdir /usr/libexec Executable subprograms (not meant to be
74
73
  # called indepentently)
75
- # sharedir /usr/share Constant data files. FIXME: Always a subdir
74
+ # sharedir /usr/share Constant data files
76
75
  # vardir /var/lib Variable data files
77
76
  # spooldir /var/spool Spool files
78
77
  # rundir /var/run Run files
79
78
  # lockdir /var/lock Lock files
80
79
  # cachedir /var/cache Cache directory
81
- # tmpdir /tmp Temporary directory (deleted when the '
82
- # machine starts)
80
+ # tmpdir /tmp Temporary directory (deleted between restarts)
81
+ # vartmpdir /var/tmp TODO
83
82
  # logdir /var/log Log directory
84
83
  #
84
+ # pckdir <package-name> Name of package directory. It is always the
85
+ # name of the directory in /usr/share
86
+ #
87
+ #
85
88
  # Each standard directory can also be prefixed a 'pck'. That will create a
86
89
  # subdirectory with the package's name in the base standard directory. Eg.
87
90
  # 'pcketcdir' will create the directory '/etc/<name>'
data/lib/qrpm/utils.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Qrpm
2
+ # Get full name of user, defaults to username '@' hostname
3
+ def self.fullname
4
+ s = Etc.getpwnam(ENV['USER'])&.gecos
5
+ if s.nil? || s == ""
6
+ s = "#{ENV['USER']}@#{ENV['HOSTNAME']}"
7
+ end
8
+ s
9
+ end
10
+ end
data/lib/qrpm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Qrpm
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/qrpm.rb CHANGED
@@ -1,16 +1,122 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'etc'
4
+
5
+ require 'indented_io'
6
+ require "constrain"
7
+ require "forward_to"
8
+
9
+ include Constrain
10
+ include ForwardTo
11
+
3
12
  require_relative "qrpm/version"
4
13
  require_relative "qrpm/node.rb"
14
+ require_relative "qrpm/fragment.rb"
15
+ require_relative "qrpm/lexer.rb"
16
+ require_relative "qrpm/compiler.rb"
17
+ require_relative "qrpm/qrpm.rb"
5
18
  require_relative "qrpm/rpm.rb"
6
- require_relative "qrpm/parser.rb"
19
+ require_relative "qrpm/utils.rb"
7
20
 
8
21
  module Qrpm
9
22
  class Error < RuntimeError; end
23
+ class CompileError < StandardError; end
24
+ class AbstractMethodError < StandardError; end
25
+ def abstract_method = raise AbstractMethodError.new "Abstract method called"
10
26
 
11
27
  QRPM_CONFIG_FILE = "qrpm.yml"
12
28
 
13
29
  QRPM_SHARE_DIR = "#{::File.dirname(__FILE__)}/../lib/qrpm"
14
30
  QRPM_CONFIG_FILE_TEMPLATE = "#{QRPM_SHARE_DIR}/template.yml"
15
31
  QRPM_ERB_FILE = "#{QRPM_SHARE_DIR}/template.erb"
32
+
33
+ # Should be defined and non-empty
34
+ MANDATORY_FIELDS = Rpm::MANDATORY_FIELDS
35
+
36
+ # Maps from field name to array of allowed types for that field
37
+ FIELDS = Rpm::FIELDS.map { |k,ts|
38
+ nts = ts.map { |t|
39
+ if t == String
40
+ ValueNode
41
+ elsif t == Array
42
+ ArrayNode
43
+ else
44
+ raise ArgumentError, "Illegal type: #{t.inspect}"
45
+ end
46
+ }
47
+ [k, nts]
48
+ }.to_h
49
+
50
+ STANDARD_DIRS = %w(
51
+ etcdir bindir sbindir libdir libexecdir sharedir docdir vardir spooldir
52
+ rundir lockdir cachedir logdir tmpdir
53
+ )
54
+
55
+ ROOT_DIRS = {
56
+ rootdir: "/",
57
+ rootconfdir: "$rootdir/etc",
58
+ rootexecdir: "$rootdir/usr",
59
+ rootlibdir: "$rootdir/usr",
60
+ rootconstdir: "$rootdir/usr/share",
61
+ rootdocdir: "$rootconstdir",
62
+ rootdatadir: "$rootdir/var"
63
+ }
64
+
65
+ SYSTEM_DIRS = {
66
+ sysetcdir: "$rootconfdir",
67
+ sysbindir: "$rootexecdir/bin",
68
+ syssbindir: "$rootexecdir/sbin",
69
+ syslibdir: "$rootlibdir/lib64",
70
+ syslibexecdir: "$rootexecdir/libexec",
71
+ syssharedir: "$rootconstdir/$pckdir", # Always a subdir of /usr/share
72
+ sysdocdir: "$syssharedir",
73
+ sysvardir: "$rootdatadir/lib",
74
+ sysspooldir: "$rootdatadir/spool",
75
+ sysrundir: "$rootdatadir/run",
76
+ syslockdir: "$rootdatadir/lock",
77
+ syscachedir: "$rootdatadir/cache",
78
+ syslogdir: "$rootdatadir/log",
79
+ systmpdir: "/tmp" # Always /tmp because of security
80
+ }
81
+
82
+ # There are no package-specific versions of bindir and sbindir
83
+ PACKAGE_DIRS = {
84
+ pcketcdir: "$sysetcdir/$pckdir",
85
+ pckbindir: "$sysbindir", # No subdir
86
+ pcksbindir: "$syssbindir", # No subdir
87
+ pcklibdir: "$syslibdir/$pckdir",
88
+ pcklibexecdir: "$syslibexecdir/$pckdir",
89
+ pcksharedir: "$syssharedir/$pckdir",
90
+ pckdocdir: "$sysdocdir/$pckdir",
91
+ pckvardir: "$sysvardir/$pckdir",
92
+ pckspooldir: "$sysspooldir/$pckdir",
93
+ pckrundir: "$sysrundir/$pckdir",
94
+ pcklockdir: "$syslockdir/$pckdir",
95
+ pckcachedir: "$syscachedir/$pckdir",
96
+ pcklogdir: "$syslogdir/$pckdir",
97
+ pcktmpdir: "$systmpdir/$pckdir"
98
+ }
99
+
100
+ INSTALL_DIRS = ROOT_DIRS.merge SYSTEM_DIRS.merge PACKAGE_DIRS
101
+
102
+ DEFAULTS = {
103
+ "name" => "$(basename $PWD)",
104
+ "summary" => "The $name RPM package",
105
+ "version" => "$(cd ${{srcdir}} && git tag -l 2>/dev/null | tail -1 | tr -dc '.0-9' || echo 0.0.0)",
106
+ "description" => "$summary",
107
+ "release" => "1",
108
+ "license" => "GPL",
109
+ "packager" => ::Qrpm.fullname,
110
+ "currdir" => ".", # The directory from where the qrpm was run. Initialized by the client program
111
+ "qrpmdir" => ".", # The directory containing the qrpm file. Initialized by the client program
112
+ "srcdir" => ".",
113
+ "pckdir" => "$name",
114
+ "make" => nil
115
+ }
116
+
117
+ IDENT_RE = /(?:[\w_][\w\d_]*)/
118
+ PATH_RE = /(?:[\w_][\w\d_.]*)/
119
+
120
+ FILE_KEYS = %w(name file symlink reflink perm)
16
121
  end
122
+
data/qrpm.gemspec CHANGED
@@ -11,8 +11,6 @@ Gem::Specification.new do |spec|
11
11
  spec.summary = "Gem qrpm"
12
12
  spec.description = "Gem qrpm"
13
13
  spec.homepage = "http://www.nowhere.com/"
14
- spec.required_ruby_version = ">= 2.4.0"
15
-
16
14
 
17
15
  spec.metadata["homepage_uri"] = spec.homepage
18
16
 
@@ -27,8 +25,10 @@ Gem::Specification.new do |spec|
27
25
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
26
  spec.require_paths = ["lib"]
29
27
 
30
- spec.add_dependency "shellopts", "~> 2.0.0"
28
+ spec.add_dependency "shellopts", "~> 2.1.1"
31
29
  spec.add_dependency "indented_io"
30
+ spec.add_dependency "constrain"
31
+ spec.add_dependency "forward_to"
32
32
 
33
33
  # Uncomment to register a new dependency of your gem
34
34
  # spec.add_dependency "example-gem", "~> 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qrpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-08 00:00:00.000000000 Z
11
+ date: 2022-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shellopts
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.0
19
+ version: 2.1.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.0
26
+ version: 2.1.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: indented_io
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: constrain
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: forward_to
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: Gem qrpm
42
70
  email:
43
71
  - claus.l.rasmussen@gmail.com
@@ -49,27 +77,39 @@ files:
49
77
  - ".rspec"
50
78
  - ".ruby-version"
51
79
  - Gemfile
80
+ - NOTES
52
81
  - README.md
53
82
  - Rakefile
83
+ - TODO
54
84
  - bin/console
55
85
  - bin/setup
56
86
  - clean
57
87
  - cmd
88
+ - doc/pg.yml
89
+ - doc/qrpm2.rb
90
+ - doc/qrpm2.yml
58
91
  - example.yml
59
92
  - example/bin/a_file
60
93
  - example/bin/another_file
94
+ - example/configure
95
+ - example/make
96
+ - example/my_package_name-1.2.3-4.x86_64.rpm
97
+ - example/my_package_name.spec
61
98
  - example/qrpm.yml
62
99
  - example/share/some_data
63
100
  - example/share/some_other_data
64
101
  - exe/qrpm
65
102
  - lib/qrpm.rb
103
+ - lib/qrpm/compiler.rb
104
+ - lib/qrpm/fragment.rb
105
+ - lib/qrpm/lexer.rb
66
106
  - lib/qrpm/node.rb
67
- - lib/qrpm/parser.rb
68
107
  - lib/qrpm/qrpm.rb
69
108
  - lib/qrpm/render.rb
70
109
  - lib/qrpm/rpm.rb
71
110
  - lib/qrpm/template.erb
72
111
  - lib/qrpm/template.yml
112
+ - lib/qrpm/utils.rb
73
113
  - lib/qrpm/version.rb
74
114
  - packager.sh
75
115
  - packager.yml
@@ -79,7 +119,7 @@ homepage: http://www.nowhere.com/
79
119
  licenses: []
80
120
  metadata:
81
121
  homepage_uri: http://www.nowhere.com/
82
- post_install_message:
122
+ post_install_message:
83
123
  rdoc_options: []
84
124
  require_paths:
85
125
  - lib
@@ -87,15 +127,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
127
  requirements:
88
128
  - - ">="
89
129
  - !ruby/object:Gem::Version
90
- version: 2.4.0
130
+ version: '0'
91
131
  required_rubygems_version: !ruby/object:Gem::Requirement
92
132
  requirements:
93
133
  - - ">="
94
134
  - !ruby/object:Gem::Version
95
135
  version: '0'
96
136
  requirements: []
97
- rubygems_version: 3.1.4
98
- signing_key:
137
+ rubygems_version: 3.3.18
138
+ signing_key:
99
139
  specification_version: 4
100
140
  summary: Gem qrpm
101
141
  test_files: []