sapos-print 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 384234557dbd5bbb4d34a176bff5b7380aa504fdfc386bb85152a707877ed9e2
4
+ data.tar.gz: 3032008fbab84616cc3cab20e99020f5fafdbadfec367903147fbb56067c042c
5
+ SHA512:
6
+ metadata.gz: 24faed91618fc8dbeea8e2cb72397ef811e6edf43553e2670da63ec822df6e97c99ddda2c038fede60cbb1a849a2ad11494a49771c5b674bd90cd2c238cfce60
7
+ data.tar.gz: 4bd1addf3406a81a578548ee0ac4f3c4a10be72a3235ce17bdb203829aa6e06f4b74dfa1e9afb22e90c86a8892fff1b5e6ce8b168c657f0341c67f38cd642cc8
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2021-12-07
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in sapos-print.gemspec
6
+ gemspec
7
+
data/Gemfile.lock ADDED
@@ -0,0 +1,103 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sapos-print (1.0.0)
5
+ activesupport
6
+ awesome_print
7
+ json
8
+ pubnub
9
+ rest-client
10
+ thor
11
+
12
+ GEM
13
+ remote: https://rubygems.org/
14
+ specs:
15
+ activesupport (6.1.4.1)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ zeitwerk (~> 2.3)
21
+ addressable (2.8.0)
22
+ public_suffix (>= 2.0.2, < 5.0)
23
+ awesome_print (1.9.2)
24
+ concurrent-ruby (1.1.9)
25
+ concurrent-ruby-edge (0.5.0)
26
+ concurrent-ruby (~> 1.1.5)
27
+ domain_name (0.5.20190701)
28
+ unf (>= 0.0.5, < 1.0.0)
29
+ dry-configurable (0.13.0)
30
+ concurrent-ruby (~> 1.0)
31
+ dry-core (~> 0.6)
32
+ dry-container (0.9.0)
33
+ concurrent-ruby (~> 1.0)
34
+ dry-configurable (~> 0.13, >= 0.13.0)
35
+ dry-core (0.7.1)
36
+ concurrent-ruby (~> 1.0)
37
+ dry-inflector (0.2.1)
38
+ dry-initializer (3.0.4)
39
+ dry-logic (1.2.0)
40
+ concurrent-ruby (~> 1.0)
41
+ dry-core (~> 0.5, >= 0.5)
42
+ dry-schema (1.8.0)
43
+ concurrent-ruby (~> 1.0)
44
+ dry-configurable (~> 0.13, >= 0.13.0)
45
+ dry-core (~> 0.5, >= 0.5)
46
+ dry-initializer (~> 3.0)
47
+ dry-logic (~> 1.0)
48
+ dry-types (~> 1.5)
49
+ dry-types (1.5.1)
50
+ concurrent-ruby (~> 1.0)
51
+ dry-container (~> 0.3)
52
+ dry-core (~> 0.5, >= 0.5)
53
+ dry-inflector (~> 0.1, >= 0.1.2)
54
+ dry-logic (~> 1.0, >= 1.0.2)
55
+ dry-validation (1.7.0)
56
+ concurrent-ruby (~> 1.0)
57
+ dry-container (~> 0.7, >= 0.7.1)
58
+ dry-core (~> 0.5, >= 0.5)
59
+ dry-initializer (~> 3.0)
60
+ dry-schema (~> 1.8, >= 1.8.0)
61
+ http-accept (1.7.0)
62
+ http-cookie (1.0.4)
63
+ domain_name (~> 0.5)
64
+ httpclient (2.8.3)
65
+ i18n (1.8.11)
66
+ concurrent-ruby (~> 1.0)
67
+ json (2.6.1)
68
+ mime-types (3.4.1)
69
+ mime-types-data (~> 3.2015)
70
+ mime-types-data (3.2021.1115)
71
+ minitest (5.14.4)
72
+ netrc (0.11.0)
73
+ public_suffix (4.0.6)
74
+ pubnub (4.7.1)
75
+ addressable (>= 2.0.0)
76
+ concurrent-ruby (~> 1.1.5)
77
+ concurrent-ruby-edge (~> 0.5.0)
78
+ dry-validation (~> 1.0)
79
+ httpclient (~> 2.8, >= 2.8.3)
80
+ json (>= 2.2.0, < 3)
81
+ timers (>= 4.3.0)
82
+ rest-client (2.1.0)
83
+ http-accept (>= 1.7.0, < 2.0)
84
+ http-cookie (>= 1.0.2, < 2.0)
85
+ mime-types (>= 1.16, < 4.0)
86
+ netrc (~> 0.8)
87
+ thor (1.1.0)
88
+ timers (4.3.3)
89
+ tzinfo (2.0.4)
90
+ concurrent-ruby (~> 1.0)
91
+ unf (0.1.4)
92
+ unf_ext
93
+ unf_ext (0.0.8)
94
+ zeitwerk (2.5.1)
95
+
96
+ PLATFORMS
97
+ arm64-darwin-21
98
+
99
+ DEPENDENCIES
100
+ sapos-print!
101
+
102
+ BUNDLED WITH
103
+ 2.2.32
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Sapos::Print
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sapos/print`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'sapos-print'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle install
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install sapos-print
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ 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 the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/sapos-print.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/*_test.rb"]
10
+ end
11
+
12
+ task default: :test
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 "sapos/print"
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,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/sapos-print ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "sapos/print"
4
+ Sapos::Print::CLI.start(ARGV)
@@ -0,0 +1,63 @@
1
+ require "io/console"
2
+ module Sapos
3
+ module Print
4
+ include Thor::Actions
5
+ class CLI < Thor
6
+
7
+ desc "setup", "Setup Wizard"
8
+ def setup
9
+ info
10
+ config = {}
11
+
12
+ url = ask("Configuration URL")
13
+ response = RestClient.get(url)
14
+ data = JSON.parse(response)
15
+
16
+ config[:q] = data["channel"]
17
+ config[:key] = data["key"]
18
+ config[:printer] = ask("Printer Name: ")
19
+ config[:adapter] = ask("Printer Adapter: ", limited_to: ["console", "cups", "windows"])
20
+ config[:interface] = ask("Interface", limited_to: ["text", "escp"])
21
+
22
+ if yes?("Are you sure that you want to write the configuration file?")
23
+ Sapos::Print::Configuration.write(config)
24
+ ap config
25
+ say "Configuration Saved! Cheers"
26
+ end
27
+ end
28
+
29
+ desc "start", "run service"
30
+ def start
31
+ info
32
+ config = Sapos::Print.config
33
+ puts ["Q=#{config.q.to_s}", "Printer=#{config.printer.to_s}", "Adapter=#{config.adapter.to_s}", "Interface=#{config.interface}"].join("\n")
34
+
35
+ Sapos::Print::QReader.printer_config = config
36
+ Sapos::Print::QReader.verbose = options[:verbose]
37
+ Sapos::Print::QReader.run!
38
+ end
39
+
40
+ desc "print", "demo print"
41
+ def print
42
+ info
43
+ config = Sapos::Print.config
44
+ printer = Printer.new(config)
45
+ printer.print("This is a test\nprint page\nwithno special commands")
46
+ end
47
+
48
+ no_tasks do
49
+ def info
50
+ if @printed.nil?
51
+ @printed ||= begin
52
+ print_wrapped("=+" * 40)
53
+ say("SaposPrint v#{Sapos::Print::VERSION}")
54
+ say "... by Agile Software Development [Copyright © 2016-#{Time.now.year}]"
55
+ print_wrapped("=+" * 40)
56
+ puts "\n"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,51 @@
1
+ require 'yaml'
2
+ require 'erb'
3
+
4
+
5
+ module Sapos
6
+ module Print
7
+ class Configuration
8
+
9
+ attr_accessor :printer, :adapter, :interface, :q, :key, :emv_path, :emv_terminal
10
+
11
+ def self.write(args = {})
12
+ config_file = "#{Sapos::Print.app_directory}/config.yml"
13
+ File.write(config_file, args.to_yaml)
14
+ end
15
+
16
+ def initialize
17
+ config_file = "#{Sapos::Print.app_directory}/config.yml"
18
+ if File.exist?(config_file)
19
+ template = ERB.new(File.read(config_file))
20
+ result = YAML.load(template.result(binding))
21
+ ap result
22
+ @printer = result[:printer]
23
+ @adapter = result[:adapter]
24
+ @interface = result[:interface]
25
+ @q = result[:q]
26
+ @key = result[:key]
27
+ @emv_path = result[:emv_path]
28
+ @emv_terminal = result[:emv_terminal]
29
+ else
30
+ raise Sapos::Print::Error, "Configuration is missing. Make sure to create this file: #{config_file}"
31
+ end
32
+ end
33
+
34
+ def server?
35
+ @mode.eql?("server")
36
+ end
37
+
38
+ def queue?
39
+ @mode.eql?("queue")
40
+ end
41
+
42
+ def verify?
43
+ @verify == true
44
+ end
45
+
46
+ def to_h
47
+ {printer: @printer, adapter: @adapter, interface: @interface, q: @q, key: @key, emv_path: @emv_path, emv_terminal: @emv_terminal }
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,84 @@
1
+ module Sapos
2
+ module Print
3
+ class Printer
4
+
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def print(raw_message)
10
+ puts "Print =>"
11
+ filename = SecureRandom.hex
12
+ result = false
13
+ raw = raw_message.force_encoding("UTF-8")
14
+ begin
15
+ printable = data(raw_message)
16
+ File.open(filename, 'w'){|f| f.write(printable)}
17
+ result = send_to_printer({file: filename})
18
+ puts "Result: #{result}"
19
+ rescue => e
20
+ puts "#{e.message}"
21
+ self.errors = e.message
22
+ result = false
23
+ ensure
24
+ File.delete(filename) if File.exists?(filename)
25
+ return result
26
+ end
27
+
28
+ end
29
+
30
+ def data(raw_message)
31
+ puts "data: #{@config.interface}"
32
+ case @config.interface
33
+ when 'text'
34
+ return raw_message
35
+ when 'escp'
36
+ esc = "\x1B" #ESC byte in hex notation
37
+ newLine = "\x0A" #LF byte in hex notation
38
+ cmds = esc + "@"
39
+ cmds += esc + "!"+"\00"
40
+ cmds += raw_message
41
+ cmds += newLine + newLine
42
+ cmds += "\x1D\x56\x42\x03" # Cut Paper
43
+ cmds += "\x1B\x70\x00\x19\xFA" # Open drawer
44
+ return cmds
45
+ else
46
+ raise "Unknown interface: #{@config.interface}"
47
+ end
48
+ end
49
+
50
+ def send_to_printer(opts = {})
51
+ case @config.adapter
52
+ when 'console'
53
+ puts "=> CONSOLE: file: #{opts[:file]}<="
54
+ puts File.read(opts[:file])
55
+ puts "=> END CONSOLE =<"
56
+ return true
57
+ when 'cups'
58
+ file = opts.delete(:file)
59
+ command_options = []
60
+ command_options << "-d #{@printer_name}"
61
+ command_options << "-o raw" if opts[:raw].present?
62
+ command = "lp #{command_options.join(" ")} #{file}"
63
+ puts "CMD => #{command}"
64
+ if !system(command)
65
+ puts "Not executed"
66
+ return false
67
+ end
68
+ return true
69
+
70
+ when 'windows'
71
+ command = "copy #{opts[:file]} "+'"\\\\%COMPUTERNAME%\\'+@config.printer
72
+ if !system(command)
73
+ puts "Not executed"
74
+ return false
75
+ end
76
+ return true
77
+
78
+ end
79
+ end
80
+
81
+ end
82
+ end
83
+ end
84
+
@@ -0,0 +1,41 @@
1
+ require_relative 'printer'
2
+
3
+ module Sapos
4
+ module Print
5
+ class QReader
6
+ class << self
7
+ attr_accessor :printer_config, :verbose
8
+ end
9
+
10
+ attr_accessor :pubnub, :printer, :config
11
+
12
+ def self.run!
13
+ reader = QReader.new
14
+ callback = Pubnub::SubscribeCallback.new(
15
+ message: -> (envelope){
16
+ document = Base64.decode64(envelope.result[:data][:message]['document'])
17
+ if reader.printer.print(document)
18
+ puts "OK"
19
+ else
20
+ puts "Printer Error".red
21
+ end
22
+ },
23
+ presence: ->(envelope){},
24
+ status: ->(envelope){}
25
+ )
26
+ reader.pubnub.add_listener(callback: callback)
27
+ reader.pubnub.subscribe(channels: reader.config.q)
28
+ ARGV.clear
29
+ while line = gets do
30
+ #Wait forever ;-)
31
+ end
32
+ end
33
+
34
+ def initialize
35
+ @config = QReader.printer_config
36
+ @printer = Printer.new(@config)
37
+ @pubnub = Pubnub.new(subscribe_key: @config.key)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sapos
4
+ module Print
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ require 'thor'
3
+ require 'rest-client'
4
+ require 'json'
5
+ require 'awesome_print'
6
+ require 'pubnub'
7
+
8
+
9
+ module Sapos
10
+ module Print
11
+ class Error < StandardError; end
12
+
13
+
14
+ def self.home_dir
15
+ Dir.home
16
+ end
17
+
18
+ def self.app_directory
19
+ dir = File.join(Sapos::Print.home_dir,".sapos-print")
20
+ FileUtils.mkdir_p dir unless File.exists?(dir)
21
+ dir
22
+ end
23
+
24
+ def self.config
25
+ @config ||= Sapos::Print::Configuration.new
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ require_relative "print/version"
32
+ require_relative "print/configuration"
33
+ require_relative "print/q_reader"
34
+ require_relative "print/cli"
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/sapos/print/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sapos-print"
7
+ spec.version = Sapos::Print::VERSION
8
+ spec.authors = ["Josef Sauter"]
9
+ spec.email = ["Josef.Sauter@gmail.com"]
10
+
11
+ spec.summary = "SAPOSCLOUD PRINT"
12
+ spec.description = "SAPOSCLOUD Print"
13
+ spec.homepage = "http://www.agilesd.com"
14
+ spec.required_ruby_version = ">= 2.6.0"
15
+
16
+ #spec.metadata["allowed_push_host"] = "https://gems.agilesd.com"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://www.agilesd.com"
20
+ spec.metadata["changelog_uri"] = "https://agilesd.com"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject do |f|
26
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
27
+ end
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ # Uncomment to register a new dependency of your gem
34
+ # spec.add_dependency "example-gem", "~> 1.0"
35
+
36
+ # For more information and examples about making a new gem, checkout our
37
+ # guide at: https://bundler.io/guides/creating_gem.html
38
+
39
+ spec.add_dependency "thor"
40
+ spec.add_dependency "pubnub"
41
+ spec.add_dependency "rest-client"
42
+ spec.add_dependency "awesome_print"
43
+ spec.add_dependency "activesupport"
44
+ spec.add_dependency "json"
45
+
46
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sapos-print
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Josef Sauter
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-12-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pubnub
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rest-client
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: awesome_print
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'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: SAPOSCLOUD Print
98
+ email:
99
+ - Josef.Sauter@gmail.com
100
+ executables:
101
+ - sapos-print
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - CHANGELOG.md
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - exe/sapos-print
113
+ - lib/sapos/print.rb
114
+ - lib/sapos/print/cli.rb
115
+ - lib/sapos/print/configuration.rb
116
+ - lib/sapos/print/printer.rb
117
+ - lib/sapos/print/q_reader.rb
118
+ - lib/sapos/print/version.rb
119
+ - sapos-print.gemspec
120
+ homepage: http://www.agilesd.com
121
+ licenses: []
122
+ metadata:
123
+ homepage_uri: http://www.agilesd.com
124
+ source_code_uri: https://www.agilesd.com
125
+ changelog_uri: https://agilesd.com
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 2.6.0
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubygems_version: 3.1.4
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: SAPOSCLOUD PRINT
145
+ test_files: []