outwood_labels 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 909ec8c91f83b4f1346d461fa33e5d8ba0cc28d63373f3671506f1d82b43f0de
4
+ data.tar.gz: 265635a5dcf6036e7240ff927bf6b558d314337b4bf213bfba58dbd22352e59a
5
+ SHA512:
6
+ metadata.gz: b979ddd2229525efbc24082b85b89041d8c3498303092186cd61f19e76a3ece3d7bb6ca7c6b6d7361e6cef6857540892fe7ec57c05722c06da6ccf9e92f953cb
7
+ data.tar.gz: faf363585a21f7e609a0b9a8738afc49fa07bf8168ba6d5b965ae8ba144a99e525669ee74e50837cfb8632b62137b8c927d2756fc13bd2146374aaf09dd81f69
@@ -0,0 +1,43 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ tags: [ 'v*.*.*' ]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build + Publish
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: write
14
+
15
+ steps:
16
+ - uses: actions/checkout@v3
17
+ - name: Set up Ruby 2.6
18
+ uses: actions/setup-ruby@v1
19
+ with:
20
+ ruby-version: 2.6.x
21
+
22
+ - name: Publish to GPR
23
+ run: |
24
+ mkdir -p $HOME/.gem
25
+ touch $HOME/.gem/credentials
26
+ chmod 0600 $HOME/.gem/credentials
27
+ printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
28
+ gem build *.gemspec
29
+ gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
30
+ env:
31
+ GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
32
+ OWNER: ${{ github.repository_owner }}
33
+
34
+ - name: Publish to RubyGems
35
+ run: |
36
+ mkdir -p $HOME/.gem
37
+ touch $HOME/.gem/credentials
38
+ chmod 0600 $HOME/.gem/credentials
39
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
40
+ gem build *.gemspec
41
+ gem push *.gem
42
+ env:
43
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
@@ -0,0 +1,31 @@
1
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
2
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
3
+
4
+ name: Ruby
5
+
6
+ on:
7
+ push:
8
+ branches: [ "main" ]
9
+ pull_request:
10
+ branches: [ "main" ]
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ test:
17
+
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ matrix:
21
+ ruby-version: ['2.7', '3.0', '3.1']
22
+
23
+ steps:
24
+ - uses: actions/checkout@v3
25
+ - name: Set up Ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby-version }}
29
+ bundler-cache: true
30
+ - name: Run tests
31
+ run: bundle exec rake
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /Gemfile.lock
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
13
+
14
+ .rubocop-*
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,12 @@
1
+ inherit_from:
2
+ - https://relaxed.ruby.style/rubocop.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.7
6
+
7
+ Layout/ArgumentAlignment:
8
+ EnforcedStyle: with_fixed_indentation
9
+ Layout/MultilineMethodCallIndentation:
10
+ EnforcedStyle: indented
11
+ Layout/MultilineOperationIndentation:
12
+ EnforcedStyle: indented
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in outwood_labels.gemspec
6
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020-2022 Outwood Grange Academies Trust
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # OutwoodLabels
2
+
3
+ Generate stickers from CSV data.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'outwood_labels'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```shell
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+
21
+ ```shell
22
+ $ gem install outwood_labels
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ```shell
28
+ $ outwood_labels infile.csv
29
+
30
+ $ cat infile.csv | outwood_labels -o outfile.csv
31
+ ```
32
+
33
+ ## Development
34
+
35
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
36
+
37
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
38
+
39
+ ## Contributing
40
+
41
+ Bug reports and pull requests are welcome on GitHub at https://github.com/outwood/outwood_labels.
42
+
43
+ ## License
44
+
45
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "outwood_labels"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ # frozen_string_literal: true
3
+
4
+ set -euo pipefail
5
+ IFS=$'\n\t'
6
+ set -vx
7
+
8
+ bundle install
9
+
10
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "outwood_labels"
6
+ require "outwood_labels/cli"
7
+
8
+ cli = OutwoodLabels::CLI.new
9
+ exit cli.run
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ # Callable mixin
5
+ module Callable
6
+ def self.included(base)
7
+ base.extend ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def call(...)
12
+ new(...).call
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'outwood_labels/options'
4
+ require 'outwood_labels/file_namer'
5
+ require 'outwood_labels/csv_loader'
6
+ require 'csv'
7
+
8
+ module OutwoodLabels
9
+ class CLI
10
+ STATUS_SUCCESS = 0
11
+ STATUS_ERROR = 1
12
+
13
+ def initialize
14
+ @options = {}
15
+ end
16
+
17
+ # @return [Integer] status
18
+ def run(args = ARGV, input = ARGF)
19
+ @options = Options.call(args)
20
+
21
+ option_actions || write_csv(input)
22
+
23
+ STATUS_SUCCESS
24
+ rescue OutwoodLabels::Error,
25
+ OutwoodLabels::OptionArgumentError,
26
+ OptionParser::InvalidOption,
27
+ OptionParser::MissingArgument => e
28
+ warn e.message
29
+ STATUS_ERROR
30
+ end
31
+
32
+ private
33
+
34
+ def write_csv(input)
35
+ output = @options[:output_path] || FileNamer.call("labels")
36
+ template = OutwoodLabels[@options[:style]]
37
+
38
+ data = CsvLoader.call(input.to_io, template, @options.fetch(:headers, true))
39
+ template ||= detect_template(data)
40
+ Generate.call(data, output, template, @options)
41
+ end
42
+
43
+ def detect_template(data)
44
+ template = OutwoodLabels.infer_template(data.headers)
45
+ raise Error, "No template found" unless template
46
+
47
+ warn "Inferred template: #{template.name}"
48
+ template
49
+ end
50
+
51
+ def option_actions
52
+ return false if (Options::EXIT_ACTIONS & @options.keys).empty?
53
+
54
+ list_styles if @options[:list]
55
+ puts OutwoodLabels::VERSION.to_s if @options[:version]
56
+ true
57
+ end
58
+
59
+ def list_styles
60
+ OutwoodLabels.default_mapping.reverse_each do |k, v|
61
+ puts "#{k}:"
62
+ puts v.columns.join(',').prepend(' ')
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ class CsvLoader
5
+ include Callable
6
+
7
+ # @param [IO]
8
+ # @param template [Template::Base]
9
+ # @param has_headers [Boolean]
10
+ def initialize(io, template, has_headers)
11
+ @io = io
12
+ @template = template
13
+ @has_headers = has_headers
14
+ end
15
+
16
+ # @return [CSV]
17
+ # @raise [Error] when no template or headers are given
18
+ def call
19
+ raise Error, "Missing template" unless @template || @has_headers
20
+
21
+ return CSV.new(@io, headers: @template.headers) unless @has_headers
22
+
23
+ data = CSV.new @io, headers: true, return_headers: true
24
+ data.shift
25
+ data
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ class FileNamer
5
+ include Callable
6
+
7
+ # @param root [String]
8
+ def initialize(root)
9
+ @root = root
10
+ end
11
+
12
+ # @return [String]
13
+ def call
14
+ return "#{@root}.pdf" unless File.exist?("#{@root}.pdf")
15
+
16
+ base_name = "#{@root}-1"
17
+ base_name = base_name.next while File.exist?("#{base_name}.pdf")
18
+ "#{base_name}.pdf"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'prawn/label_sheet'
5
+
6
+ module OutwoodLabels
7
+ class Generate
8
+ include Callable
9
+
10
+ # @param data [CSV]
11
+ # @param outfile [String]
12
+ # @param template [OutwoodLabels::Template::Base]
13
+ def initialize(data, outfile, template, config = {})
14
+ @config = config
15
+ @data = data
16
+ @outfile = outfile
17
+ @template = template
18
+ end
19
+
20
+ # Generate PDF and write to disk
21
+ # @raise [Error] when required columns are missing
22
+ def call
23
+ check_header if @template
24
+ config = @config.merge({ layout: @template.layout })
25
+ labels = Prawn::LabelSheet.new @data, **config, &@template.method(:evaluate)
26
+ labels.document.render_file(@outfile)
27
+ end
28
+
29
+ private
30
+
31
+ def check_header
32
+ return if @template.valid_for?(@data.headers)
33
+
34
+ raise Error, "Required columns: #{@template.columns.join(',')}"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'optparse'
4
+ require 'outwood_labels/options_validator'
5
+
6
+ module OutwoodLabels
7
+ class OptionArgumentError < StandardError; end
8
+
9
+ class Options
10
+ include Callable
11
+
12
+ EXIT_ACTIONS = %i[version list].freeze
13
+
14
+ # @param cli_args [<String>]
15
+ def initialize(cli_args)
16
+ @args = cli_args
17
+ @options = {}
18
+ end
19
+
20
+ # @return [{String => Object}]
21
+ def call
22
+ define_options.parse!(@args)
23
+ OptionsValidator.call(@options)
24
+
25
+ @options
26
+ end
27
+
28
+ private
29
+
30
+ def define_options
31
+ OptionParser.new do |opts|
32
+ opts.banner = "Usage: #{$PROGRAM_NAME} [OPTIONS]"
33
+ opts.separator ''
34
+ opts.separator 'OPTIONS'
35
+
36
+ opts.on('-o', '--out FILE', 'Output file') do |opt|
37
+ @options[:output_path] = opt
38
+ end
39
+
40
+ opts.on('--[no-]headers', 'Expect a header row') do |opt|
41
+ @options[:headers] = opt
42
+ end
43
+
44
+ opts.on('-b', '--break BREAK', 'Break column') do |opt|
45
+ @options[:break_on] = opt
46
+ end
47
+
48
+ opts.on('-s', '--style NAME', 'Label template') do |opt|
49
+ @options[:style] = opt
50
+ end
51
+
52
+ opts.on('-d', '--debug') do |opt|
53
+ @options[:debug] = opt
54
+ end
55
+
56
+ opts.on('--list', 'List templates') do |opt|
57
+ @options[:list] = opt
58
+ end
59
+
60
+ opts.on('--version') do |opt|
61
+ @options[:version] = opt
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ class OptionsValidator
5
+ include Callable
6
+
7
+ # @param opts [{Symbol => Object}]
8
+ def initialize(opts)
9
+ @options = opts
10
+ end
11
+
12
+ # @raise [OptionArgumentError] on errors
13
+ # @return [Boolean]
14
+ def call
15
+ validate_compatibility
16
+ validate_values
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def validate_values
23
+ return true unless @options.key?(:style) && !OutwoodLabels[@options[:style]]
24
+
25
+ raise OptionArgumentError, 'Unknown style'
26
+ end
27
+
28
+ def validate_compatibility
29
+ if !@options.fetch(:headers, true) && !@options[:style]
30
+ raise OptionArgumentError, 'Style must be specified'
31
+ end
32
+
33
+ return true if exclusive_options.size <= 1
34
+
35
+ raise OptionArgumentError, 'Incompatible options: ' \
36
+ "#{exclusive_options.join(', ')}"
37
+ end
38
+
39
+ def exclusive_options
40
+ @exclusive_options ||= @options.keys & Options::EXIT_ACTIONS
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ module Template
5
+ class Base
6
+ include Callable
7
+
8
+ class << self
9
+ attr_reader :columns, :name, :layout
10
+
11
+ # @param name [String] template name
12
+ def template_name(name)
13
+ @name = name
14
+ end
15
+
16
+ # @param columns [Array<String>] required column names
17
+ def accept_columns(*columns)
18
+ @columns = columns
19
+ end
20
+
21
+ # @param layout [String] label page layout
22
+ def page_layout(layout)
23
+ @layout = layout
24
+ end
25
+
26
+ # @param columns [Array<String>] verify required columns are present
27
+ # @return [Boolean] true when columns are present
28
+ def valid_for?(columns)
29
+ (@columns - columns).empty?
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ module Template
5
+ class EmailPassword < Base
6
+ PADDING = 6
7
+
8
+ template_name 'email-password'
9
+ page_layout 'Avery7160'
10
+ accept_columns(
11
+ 'admin',
12
+ 'lastname',
13
+ 'firstname',
14
+ 'vmg',
15
+ 'email',
16
+ 'password'
17
+ )
18
+
19
+ def self.password_label
20
+ "Password"
21
+ end
22
+
23
+ # @param data [#[]] data object
24
+ # @param pdf [Prawn::Document]
25
+ def self.evaluate(pdf, data)
26
+ b = pdf.bounds
27
+ full_width = b.width - (PADDING * 2)
28
+ col1 = (full_width / 3).floor - 1
29
+ col2 = (col1 * 2) - 1
30
+
31
+ pdf.font 'Helvetica'
32
+
33
+ pdf.move_down (PADDING * 2).round
34
+ pdf.indent(PADDING) do
35
+ pdf.text_box "#{data['firstname']} #{data['lastname']}",
36
+ at: [b.left, pdf.cursor],
37
+ width: full_width, height: 12,
38
+ overflow: :truncate
39
+ end
40
+ pdf.move_down 12
41
+ pdf.stroke_horizontal_rule
42
+ pdf.move_down 6
43
+ pdf.indent(PADDING) do
44
+ pdf.font "Helvetica", size: 7 do
45
+ pdf.text_box "Admin no.",
46
+ at: [b.left, pdf.cursor],
47
+ width: col1, height: 8
48
+ pdf.text_box "Group",
49
+ at: [b.right - col2, pdf.cursor],
50
+ width: col2, height: 8
51
+ end
52
+ pdf.move_down 9
53
+ pdf.text_box (data["admin"] || ""),
54
+ at: [b.left, pdf.cursor],
55
+ width: col1, height: 10,
56
+ overflow: :shrink_to_fit
57
+ pdf.text_box (data["vmg"] || ""),
58
+ at: [b.right - col2, pdf.cursor],
59
+ width: col2, height: 10,
60
+ overflow: :shrink_to_fit
61
+ pdf.move_down 16
62
+ pdf.font_size 7 do
63
+ pdf.text_box "Email",
64
+ at: [b.left, pdf.cursor],
65
+ width: full_width, height: 8
66
+ end
67
+ pdf.move_down 9
68
+ pdf.text_box (data["email"] || ""),
69
+ at: [b.left, pdf.cursor],
70
+ width: full_width, height: 12,
71
+ overflow: :shrink_to_fit
72
+ pdf.move_down 16
73
+ pdf.font_size 7 do
74
+ pdf.text_box password_label,
75
+ at: [b.left, pdf.cursor],
76
+ width: full_width, height: 8
77
+ end
78
+ pdf.move_down 9
79
+ pdf.font "Courier" do
80
+ pdf.text_box (data["password"] || ""),
81
+ at: [b.left, pdf.cursor],
82
+ width: full_width, height: 12,
83
+ overflow: :shrink_to_fit
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ module Template
5
+ class EmailPasswordInitial < EmailPassword
6
+ template_name 'email-initial-password'
7
+ page_layout 'Avery7160'
8
+ accept_columns(
9
+ 'admin',
10
+ 'lastname',
11
+ 'firstname',
12
+ 'vmg',
13
+ 'email',
14
+ 'password'
15
+ )
16
+
17
+ def self.password_label
18
+ "Initial password"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'outwood_labels/template/base'
4
+ require 'outwood_labels/template/email_password'
5
+ require 'outwood_labels/template/email_password_initial'
6
+
7
+ module OutwoodLabels
8
+ module Template
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OutwoodLabels
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+ require 'outwood_labels/callable'
5
+ require 'outwood_labels/generate'
6
+ require 'outwood_labels/template'
7
+ require 'outwood_labels/version'
8
+
9
+ module OutwoodLabels
10
+ class Error < StandardError; end
11
+
12
+ @templates = {}
13
+
14
+ # @param klass [Class] template class to add
15
+ def self.register(klass)
16
+ default_mapping[klass.name] = klass
17
+ end
18
+
19
+ # @param name [String] name of a template
20
+ def self.[](name)
21
+ default_mapping[name]
22
+ end
23
+
24
+ # @param columns [Array<String>] list of column names
25
+ # @return [Template::Base, nil]
26
+ def self.infer_template(columns = [])
27
+ default_mapping.each_value.reverse_each do |t|
28
+ return t if t.valid_for? columns
29
+ end
30
+ nil
31
+ end
32
+
33
+ # @return [{String => Template::Base}]
34
+ def self.default_mapping
35
+ @templates
36
+ end
37
+
38
+ # Register in ascending preference order
39
+ register(Template::EmailPasswordInitial)
40
+ register(Template::EmailPassword)
41
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "outwood_labels/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "outwood_labels"
9
+ spec.version = OutwoodLabels::VERSION
10
+ spec.authors = ["Tom Crouch"]
11
+ spec.email = ["t.crouch@outwood.com"]
12
+
13
+ spec.summary = "Sticker generator"
14
+ spec.homepage = "https://github.com/outwood/outwood_labels"
15
+ spec.license = "MIT"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.required_ruby_version = ">= 2.7.0"
27
+
28
+ spec.add_dependency "prawn-label_sheet", "~> 0.2"
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "rake", "~> 13.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: outwood_labels
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tom Crouch
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-10-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: prawn-label_sheet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description:
70
+ email:
71
+ - t.crouch@outwood.com
72
+ executables:
73
+ - outwood_labels
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".github/workflows/gem-push.yml"
78
+ - ".github/workflows/ruby.yml"
79
+ - ".gitignore"
80
+ - ".rspec"
81
+ - ".rubocop.yml"
82
+ - Gemfile
83
+ - LICENSE.txt
84
+ - README.md
85
+ - Rakefile
86
+ - bin/console
87
+ - bin/setup
88
+ - exe/outwood_labels
89
+ - lib/outwood_labels.rb
90
+ - lib/outwood_labels/callable.rb
91
+ - lib/outwood_labels/cli.rb
92
+ - lib/outwood_labels/csv_loader.rb
93
+ - lib/outwood_labels/file_namer.rb
94
+ - lib/outwood_labels/generate.rb
95
+ - lib/outwood_labels/options.rb
96
+ - lib/outwood_labels/options_validator.rb
97
+ - lib/outwood_labels/template.rb
98
+ - lib/outwood_labels/template/base.rb
99
+ - lib/outwood_labels/template/email_password.rb
100
+ - lib/outwood_labels/template/email_password_initial.rb
101
+ - lib/outwood_labels/version.rb
102
+ - outwood_labels.gemspec
103
+ homepage: https://github.com/outwood/outwood_labels
104
+ licenses:
105
+ - MIT
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: 2.7.0
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubygems_version: 3.0.3.1
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Sticker generator
126
+ test_files: []