piper-rb 0.3.2

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: bec60e8e1f0e658d2d2e301b35f7781a065efd690548357e1cdfe5092482111b
4
+ data.tar.gz: 3318869c3b540b1fd32d1ca514cccaa11c295729930113fc58f7c82078f3cf13
5
+ SHA512:
6
+ metadata.gz: f2d31fbd1f57669fbf39a13a43496f4ce665eb3c23d5328dfa0b2034ee64075407d14f4bd705b789602893b3ec0e746e9ac37c122db42693314bbbbd87c0c0c4
7
+ data.tar.gz: 4a64d16c9320ab422931e87a5f8668c4524968ce29c6cfd955b6fbdaa47cdf2068e0d3c1e5e86fbbd6260f064f21157531b2ce04faf5186aa9ec25aa82f5acaa
@@ -0,0 +1,20 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ build:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Build and test with RSpec
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rspec
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ Gemfile.lock
2
+ *.gem
3
+ .ruby-version
4
+ .bundle/
5
+ .yardoc/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --color
3
+ --order random
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rspec
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.5
7
+
8
+ # METRICS
9
+ MethodLength:
10
+ CountComments: false
11
+ Max: 15
12
+ Exclude:
13
+ - 'spec/**/*'
14
+ Metrics/LineLength:
15
+ Enabled: false
16
+ Metrics/AbcSize:
17
+ Max: 25
18
+ Exclude:
19
+ - 'spec/**/*'
20
+ Metrics/BlockLength:
21
+ Exclude:
22
+ - 'spec/**/*'
23
+
24
+ # LAYOUT
25
+ Layout/DotPosition:
26
+ EnforcedStyle: leading
27
+ Enabled: true
28
+ Layout/ExtraSpacing:
29
+ Enabled: false
30
+ Layout/SpaceAroundOperators:
31
+ Enabled: false
32
+ Layout/EmptyLinesAroundClassBody:
33
+ Enabled: false
34
+ Layout/AccessModifierIndentation:
35
+ Enabled: false
36
+ Layout/HashAlignment:
37
+ Enabled: false
38
+
39
+ # STYLE
40
+ Style/StringLiterals:
41
+ EnforcedStyle: double_quotes
42
+ Style/FrozenStringLiteralComment:
43
+ Enabled: false
44
+ rubocop: warning
45
+
46
+
47
+ # RSPEC
48
+ RSpec/ContextWording:
49
+ Enabled: false
50
+ RSpec/NamedSubject:
51
+ Enabled: false
52
+ RSpec/NestedGroups:
53
+ Max: 5
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # Piper.rb
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'piper-rb', git: 'https://github.com/ellmo/piper-rb.git'
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### super basic
14
+
15
+ The most basic element of `Piper` is a `pipe`.
16
+ Just think of it as a condition step. If no keywords are used, then (in accordance to Ruby
17
+ conventions) the last line of code is taken as the step's condition:
18
+
19
+ ```ruby
20
+ require "piper-rb"
21
+
22
+ class YourSuperbService < PiperService
23
+ attribute :input, Types::Any
24
+
25
+ pipe "input is Numeric" do
26
+ input.is_a? Numeric
27
+ end
28
+
29
+ pipe "input is greater than 100?" do
30
+ false
31
+
32
+ 200 == 100
33
+
34
+ input > 100
35
+ end
36
+
37
+ pipe "input is less than 1000?" do
38
+ input < 1000
39
+ end
40
+ end
41
+
42
+ YourSuperbService.new(input: 200).call
43
+ #=> Success(true)
44
+
45
+ YourSuperbService.new(input: "asd").call
46
+ #=> Failure({:service=>#<YourSuperbService input="asd">, :object=>false, :message=>nil})
47
+
48
+ ```
49
+
50
+ ### keywords for more control
51
+
52
+ If you want to specify the condition, object to be returned and the error message, there are
53
+ keywords for this:
54
+
55
+ * `condition` (aliase: `cond`)
56
+ * `result_object` (aliases: `object`, `rslt`)
57
+ * `message` (aliases: `fail_message`, `mssg`)
58
+
59
+
60
+ ```ruby
61
+ require "piper-rb"
62
+
63
+ class YourFineService < PiperService
64
+ attribute :input, Types::Any
65
+
66
+ pipe "input is Numeric" do
67
+ message { "The input must be `Numeric`." }
68
+
69
+ input.is_a? Numeric
70
+ end
71
+
72
+ pipe "input is greater than 100?" do
73
+ cond { input > 100 }
74
+
75
+ 200 == 100
76
+ end
77
+
78
+ pipe "input is less than 1000?" do
79
+ object { input }
80
+
81
+ input < 1000
82
+ end
83
+ end
84
+
85
+ YourFineService.new(input: 200).call
86
+ #=> Success(200)
87
+
88
+ YourFineService.new(input: "asd").call
89
+ #=> Failure({:service=>(...), :object=>false, :message=>"The input must be `Numeric`."})
90
+
91
+ ```
92
+
93
+ ### you can access last step's object with `last_result`:
94
+
95
+ ```ruby
96
+ require "piper-rb"
97
+
98
+ class YourGreatService < PiperService
99
+ attribute :input, Types::Any
100
+
101
+ pipe "this step`s result should be passed to..." do
102
+ input * 30
103
+ end
104
+
105
+ pipe "...to this step" do
106
+ cond { last_result == input * 30 }
107
+ object { last_result }
108
+ end
109
+ end
110
+
111
+ YourGreatService.new(input: 20).call
112
+ #=> Success(600)
113
+ ```
114
+
115
+ ### you can nest services, calling them in a pipe passes their result:
116
+
117
+ ```ruby
118
+ require "piper-rb"
119
+
120
+ class YourMajesticService < PiperService
121
+ attribute :input, Types::Any
122
+
123
+ pipe :nothing_to_see_here do
124
+ true
125
+ end
126
+
127
+ pipe :calling_nested_service do
128
+ YourFlamboyantService.new(nested_input: input * 20).call
129
+ end
130
+ end
131
+
132
+ class YourFlamboyantService < PiperService
133
+ attribute :nested_input, Types::Any
134
+
135
+ pipe :simple_step do
136
+ message { "I am the one who knocks!" }
137
+ nested_input >= 300
138
+ end
139
+
140
+ end
141
+
142
+ YourMajesticService.new(input: 20).call
143
+ #=> Success(true)
144
+
145
+ YourMajesticService.new(input: 2).call
146
+ #=> Failure({:service=>#<YourFlamboyantService nested_input=40>, :object=>false, :message=>"I am the one who knocks!"})
147
+ ```
data/bin/piper ADDED
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ require "piper-rb"
3
+ require "thor"
4
+ require "yaml"
5
+
6
+ require_relative "runner/test_helpers"
7
+
8
+ class PiperRunner < Thor
9
+ include Thor::Actions
10
+ include PiperRunnerHelpers::TestHelpers
11
+
12
+ BASE_SERVICE_FILE_NAME = "base_service.rb".freeze
13
+ CONFIG_FILE_NAME = ".piper.yml".freeze
14
+ DEFAULT_BASE_SERVICE = "base_service".freeze
15
+ DEFAULT_PIPER = "piper".freeze
16
+ NAMED_SERVICE_FILE_NAME = "named_service.rb".freeze
17
+
18
+ NOTE__NO_CUSTOM_CONF = "No custom config found. Using `PiperService` directly.".freeze
19
+ NOTE__DEFAULT_BASE = "No base service found. Using `PiperService` directly.".freeze
20
+ NOTE__CUSTOM_BASE = "Custom base service found. Using `%s`.".freeze
21
+
22
+ class_option :base_service, aliases: "-b", type: :string
23
+ class_option :steps, aliases: "-s", type: :numeric, default: 0
24
+ class_option :verbose, aliases: "-v", type: :boolean, default: true
25
+
26
+ def self.source_root
27
+ File.join(__dir__, "..", "lib", "piper")
28
+ end
29
+
30
+ desc "setup", "Setup config file and a base service."
31
+ def setup
32
+ display_version
33
+ @base_service = (options[:base_service] || DEFAULT_BASE_SERVICE).snakify
34
+
35
+ template "templates/#{CONFIG_FILE_NAME}", CONFIG_FILE_NAME
36
+ template "templates/#{BASE_SERVICE_FILE_NAME}", "app/services/#{base_service_filename}"
37
+ end
38
+
39
+ desc "new [SERVICE_NAME]", "Create a new named service in app/services."
40
+ def new(name, *attrs)
41
+ merged_options[:service_name] = name
42
+ merged_options[:attributes] = attrs
43
+
44
+ display_version
45
+ display_log
46
+
47
+ template "templates/#{NAMED_SERVICE_FILE_NAME}", "app/services/#{service_filename}.rb"
48
+
49
+ return unless defined?(Bundler)
50
+
51
+ build_spec_files || build_test_files
52
+ end
53
+
54
+ private
55
+
56
+ def attributes
57
+ @attributes ||= merged_options[:attributes]
58
+ end
59
+
60
+ def step_count
61
+ @step_count ||= merged_options[:steps]
62
+ end
63
+
64
+ def verbose?
65
+ @verbose ||= options[:verbose]
66
+ end
67
+
68
+ def config_file_exists?
69
+ File.exist?(CONFIG_FILE_NAME)
70
+ end
71
+
72
+ def base_service
73
+ @base_service ||= (merged_options[:base_service] || DEFAULT_PIPER.dup)
74
+ end
75
+
76
+ def base_service_class
77
+ @base_service_class ||= base_service.servicify.camelify(true)
78
+ end
79
+
80
+ def base_service_filename
81
+ @base_service_filename ||= (base_service.servicify << ".rb")
82
+ end
83
+
84
+ def service_name
85
+ @service_name ||= merged_options[:service_name].servicify.camelify(true)
86
+ end
87
+
88
+ def service_filename
89
+ @service_filename ||= service_name.snakify.servicify
90
+ end
91
+
92
+ def base_service_exists?
93
+ File.exist?("app/services/#{base_service_filename}")
94
+ end
95
+
96
+ def nondefault_base_service?
97
+ merged_options[:base_service] != DEFAULT_BASE_SERVICE
98
+ end
99
+
100
+ def merged_options
101
+ return @merged_options if @merged_options
102
+
103
+ @merged_options = if config_file_exists?
104
+ YAML.load_file(CONFIG_FILE_NAME)
105
+ .merge(options)
106
+ else
107
+ options
108
+ end.symbolize_keys
109
+ end
110
+
111
+ def display_version
112
+ say("Piper version #{PiperGem::VERSION}", [:white, :on_blue, :bold]) if verbose?
113
+ end
114
+
115
+ def display_log
116
+ return unless verbose?
117
+
118
+ if config_file_exists?
119
+ if base_service_exists?
120
+ say(NOTE__CUSTOM_BASE.dup.gsub(/%s/, base_service_class), :green)
121
+ else
122
+ say(NOTE__DEFAULT_BASE, :yellow)
123
+ end
124
+ else
125
+ say(NOTE__NO_CUSTOM_CONF, :yellow)
126
+ end
127
+ end
128
+ end
129
+
130
+ PiperRunner.start(ARGV)
@@ -0,0 +1,24 @@
1
+ module PiperRunnerHelpers
2
+ module TestHelpers
3
+ NAMED_SPEC_FILE = "named_service_spec.rb".freeze
4
+ NAMED_TEST_FILE = "named_service_test.rb".freeze
5
+
6
+ def build_spec_files
7
+ require("rspec/core")
8
+ say("RSpec detected", :green)
9
+ template "templates/#{NAMED_SPEC_FILE}", "spec/services/#{service_filename}_spec.rb"
10
+ true
11
+ rescue LoadError
12
+ nil
13
+ end
14
+
15
+ def build_test_files
16
+ require("minitest")
17
+ say("Minitest detected", :green)
18
+ template "templates/#{NAMED_TEST_FILE}", "test/services/#{service_filename}_test.rb"
19
+ true
20
+ rescue LoadError
21
+ nil
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ module PiperDSL
2
+ module PiperHelpers
3
+ FAIL__NO_BLOCK = "Expected a block. None given.".freeze
4
+
5
+ def bump(attribute)
6
+ raise ArgumentError, FAIL__NO_BLOCK unless block_given?
7
+
8
+ attributes[attribute] = yield
9
+ end
10
+
11
+ def message
12
+ return @__error_message unless block_given?
13
+
14
+ @__error_message = yield
15
+ end
16
+ alias fail_message message
17
+ alias mssg message
18
+
19
+ def result_object
20
+ return @__result_object unless block_given?
21
+
22
+ @__result_object = yield
23
+ end
24
+ alias object result_object
25
+ alias rslt result_object
26
+
27
+ def fail_object
28
+ return @__fail_object unless block_given?
29
+
30
+ @__fail_object = yield
31
+ end
32
+ alias fobj fail_object
33
+
34
+ def condition
35
+ return @__condition unless block_given?
36
+
37
+ @__condition = yield
38
+ end
39
+ alias cond condition
40
+
41
+ def condition_manual?
42
+ !defined?(@__condition).nil?
43
+ end
44
+
45
+ def last_result=(val)
46
+ @__last_result = val
47
+ end
48
+
49
+ def last_result
50
+ @__last_result
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,39 @@
1
+ module PiperDSL
2
+ class Pipe
3
+ include ::Dry::Monads[:result]
4
+
5
+ attr_reader :service
6
+
7
+ def initialize(step_name, &block)
8
+ @step_name = step_name
9
+ @block = block
10
+ end
11
+
12
+ def perform(service, last_result = nil)
13
+ @service = service
14
+ service.last_result = last_result
15
+ result = service.instance_eval(&@block)
16
+ condition = service.condition_manual? ? service.cond : result
17
+
18
+ @result_object = service.object || result
19
+ @fail_object = service.fail_object || service.object || result
20
+
21
+ return condition if condition.is_a? Dry::Monads::Result
22
+
23
+ prepare_response!(condition)
24
+ end
25
+
26
+ protected
27
+
28
+ def prepare_response!(condition)
29
+ if condition
30
+ Success(@result_object || true)
31
+ else
32
+ failure_object = { service: service, object: @fail_object, message: service.message }
33
+ failure_object[:step] = @step_name if service.class.debug_steps?
34
+
35
+ Failure(failure_object)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,45 @@
1
+ module PiperDSL
2
+ module PiperSteps
3
+
4
+ module ClassMethods
5
+ def service_steps
6
+ @service_steps || @service_steps = []
7
+ end
8
+
9
+ def debug_steps
10
+ @__debug_steps = true
11
+ end
12
+
13
+ def debug_steps?
14
+ !@__debug_steps.nil?
15
+ end
16
+ end
17
+
18
+ def self.included(base)
19
+ base.extend(ClassMethods)
20
+ end
21
+
22
+ def debug_steps?
23
+ self.class.debug_steps?
24
+ end
25
+
26
+ protected
27
+
28
+ def perform_steps
29
+ klass = self.class
30
+
31
+ return Success(true) if klass.service_steps.empty?
32
+
33
+ arr = klass.service_steps.dup
34
+ step = arr.shift
35
+
36
+ result = step.perform(self)
37
+ result = result.bind(proc_step(arr.shift)) until arr.empty?
38
+ result
39
+ end
40
+
41
+ def proc_step(step)
42
+ ->(result) { step.perform(self, result) }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,12 @@
1
+ class Hash
2
+
3
+ unless instance_methods.include? :symbolize_keys
4
+ def symbolize_keys
5
+ each_with_object({}) do |(key, val), hash|
6
+ hash[key.to_sym] = val
7
+ hash
8
+ end
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,47 @@
1
+ require "dry-monads"
2
+ require "dry-struct"
3
+ require "dry-types"
4
+
5
+ require_relative "./dsl/piper_helpers"
6
+ require_relative "./dsl/piper_pipe"
7
+ require_relative "./dsl/piper_steps"
8
+
9
+ class PiperService < Dry::Struct
10
+ include PiperDSL::PiperSteps
11
+ include PiperDSL::PiperHelpers
12
+ include Dry::Monads[:result]
13
+
14
+ module Types
15
+ include Dry.Types()
16
+ end
17
+
18
+ def initialize(_)
19
+ raise NotImplementedError unless self.class < PiperService
20
+
21
+ super
22
+ end
23
+
24
+ def call
25
+ result = nil
26
+
27
+ if defined? ActiveRecord::Base
28
+ ActiveRecord::Base.transaction do
29
+ result = perform_steps
30
+
31
+ raise ActiveRecord::Rollback if result.failure?
32
+ end
33
+ else
34
+ result = perform_steps
35
+ end
36
+
37
+ result
38
+ end
39
+
40
+ def self.pipe(desc, &block)
41
+ raise ArgumentError, "missing block" unless block_given?
42
+
43
+ pipepart = PiperDSL::Pipe.new(desc, &block)
44
+
45
+ service_steps << pipepart
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ # module Piper
2
+ # module RunnerHelpers
3
+ # def config_file_exists?
4
+ # File.exist?(CONFIG_FILE_NAME)
5
+ # end
6
+
7
+ # def base_service
8
+ # @base_service ||= (merged_options[:base_service] || DEFAULT_BASE_DRY_SERVICE).downcase
9
+ # end
10
+
11
+ # def base_service_filename
12
+ # @base_service_filename ||= (base_service.servicify << ".rb")
13
+ # end
14
+
15
+ # def base_service_exists?
16
+ # File.exist?("app/services/#{base_service_filename}")
17
+ # end
18
+
19
+ # def nondefault_base_service?
20
+ # merged_options[:base_service] != DEFAULT_DRY
21
+ # end
22
+
23
+ # def merged_options
24
+ # return options unless config_file_exists?
25
+
26
+ # YAML.load_file(CONFIG_FILE_NAME)
27
+ # .merge(options)
28
+ # end
29
+ # end
30
+ # end
@@ -0,0 +1,26 @@
1
+ class String
2
+ def servicify
3
+ snaked_self = snakify
4
+ return snaked_self if snaked_self.end_with?("_service")
5
+
6
+ snaked_self << "_service"
7
+ end
8
+
9
+ def camelify(classify = false)
10
+ if classify
11
+ capitalize
12
+ .gsub(%r{\/(\w)}) { "::" << Regexp.last_match(1).upcase }
13
+ .gsub(/_(\w)/) { Regexp.last_match(1).upcase }
14
+ else
15
+ split("_").collect(&:capitalize).join
16
+ end
17
+ end
18
+
19
+ def snakify
20
+ gsub(/:{1,2}/, "/")
21
+ .gsub(/([A-Z]+)([A-Z][a-z])/, "\\1_\\2")
22
+ .gsub(/([a-z\d])([A-Z])/, "\\1_\\2")
23
+ .tr("-", "_")
24
+ .downcase
25
+ end
26
+ end
@@ -0,0 +1,2 @@
1
+ base_service: <%= base_service %>
2
+ verbose: true
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= base_service_class %> < PiperService
4
+
5
+ def initialize(_)
6
+ raise NotImplementedError unless self.class < <%= base_service_class %>
7
+
8
+ super
9
+ end
10
+
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= service_name %> < <%= base_service_class %>
4
+ <%- attributes.each do |attr| -%>
5
+ attribute :<%= attr %>, Types::Any
6
+ <%- end -%>
7
+ <%- step_count.times do |step_number| %>
8
+ pipe :step_<%= step_number + 1 %> do
9
+ true
10
+ end
11
+ <%- end -%>
12
+ end
@@ -0,0 +1,41 @@
1
+ require "rails_helper"
2
+
3
+ describe <%= service_name %> do
4
+ subject { service.call }
5
+
6
+ <%- if attributes.any? -%>
7
+ let(:service) { described_class.new(params) }
8
+
9
+ <%- if attributes.size > 1 -%>
10
+ let(:params) do
11
+ {
12
+ <%- attributes.map do |atr| -%>
13
+ <%= atr %>: "1",
14
+ <%- end -%>
15
+ }
16
+ end
17
+ <%- else -%>
18
+ let(:params) { { <%=attributes.first%>: "1" } }
19
+ <%- end -%>
20
+
21
+ context "NO arguments passed" do
22
+ subject { described_class.new }
23
+
24
+ it "Raises DryStruct`s argument error" do
25
+ expect { subject }.to raise_error(Dry::Struct::Error)
26
+ end
27
+ end
28
+
29
+ context "arguments passed" do
30
+ it "is a success" do
31
+ expect(subject).to be_success
32
+ end
33
+ end
34
+ <%- else -%>
35
+ context "no arguments passed" do
36
+ it "is a success" do
37
+ expect(subject).to be_success
38
+ end
39
+ end
40
+ <%- end -%>
41
+ end
@@ -0,0 +1,17 @@
1
+ require "test_helper"
2
+
3
+ class <%= service_name %>Test < Minitest::Test
4
+ <%- if attributes.any? -%>
5
+ def setup
6
+ @subject = <%= service_name %>.new(<%= attributes.map {|a| "#{a}: 1" }.join(", ") %>)
7
+ end
8
+ <% else %>
9
+ def setup
10
+ @subject = <%= service_name %>.new
11
+ end
12
+ <% end -%>
13
+
14
+ def test_call
15
+ assert @subject.call.success?
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module PiperGem
2
+ VERSION = "0.3.2".freeze
3
+ end
data/lib/piper-rb.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "piper/version"
2
+ require "piper/piper_service"
3
+ require "piper/string_helpers"
4
+ require "piper/hash_helpers"
data/piper-rb.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "piper/version"
4
+
5
+ ERR_RG_2_REQUIRED = "RubyGems 2.0 or newer is required to protect against public gem pushes.".freeze
6
+
7
+ Gem::Specification.new do |spec|
8
+ # RubyGems < 2.0 does not allow to specify metadata. We do not want to use RubyGems < 2.0
9
+ raise ERR_RG_2_REQUIRED unless spec.respond_to?(:metadata)
10
+
11
+ spec.name = "piper-rb"
12
+ spec.version = PiperGem::VERSION.dup
13
+ spec.date = "2019-12-07"
14
+ spec.summary = ""
15
+ spec.authors = ["Jakub Żuchowski"]
16
+ spec.email = "ellmo@ellmo.net"
17
+ spec.homepage = "https://github.com/ellmo/piper-rb"
18
+ spec.license = "MIT"
19
+ # Fetch all git-versioned files, excluding all the default test locations.
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(test|spec|features)/})
22
+ end
23
+
24
+ spec.executables = "piper"
25
+
26
+ spec.required_ruby_version = ">= 2.5.0"
27
+
28
+ spec.add_dependency "dry-monads", "~> 1.3"
29
+ spec.add_dependency "dry-struct", "~> 1.1"
30
+ spec.add_dependency "dry-types", "~> 1.2"
31
+ spec.add_dependency "thor", ">= 0.19", "<= 2.0"
32
+
33
+ spec.add_development_dependency "rspec", "~> 3.9"
34
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: piper-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2
5
+ platform: ruby
6
+ authors:
7
+ - Jakub Żuchowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-monads
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-struct
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-types
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0.19'
62
+ - - "<="
63
+ - !ruby/object:Gem::Version
64
+ version: '2.0'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0.19'
72
+ - - "<="
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.9'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.9'
89
+ description:
90
+ email: ellmo@ellmo.net
91
+ executables:
92
+ - piper
93
+ extensions: []
94
+ extra_rdoc_files: []
95
+ files:
96
+ - ".github/workflows/ruby.yml"
97
+ - ".gitignore"
98
+ - ".rspec"
99
+ - ".rubocop.yml"
100
+ - Gemfile
101
+ - README.md
102
+ - bin/piper
103
+ - bin/runner/test_helpers.rb
104
+ - lib/piper-rb.rb
105
+ - lib/piper/dsl/piper_helpers.rb
106
+ - lib/piper/dsl/piper_pipe.rb
107
+ - lib/piper/dsl/piper_steps.rb
108
+ - lib/piper/hash_helpers.rb
109
+ - lib/piper/piper_service.rb
110
+ - lib/piper/runner_helpers.rb
111
+ - lib/piper/string_helpers.rb
112
+ - lib/piper/templates/.piper.yml.tt
113
+ - lib/piper/templates/base_service.rb.tt
114
+ - lib/piper/templates/named_service.rb.tt
115
+ - lib/piper/templates/named_service_spec.rb.tt
116
+ - lib/piper/templates/named_service_test.rb.tt
117
+ - lib/piper/version.rb
118
+ - piper-rb.gemspec
119
+ homepage: https://github.com/ellmo/piper-rb
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.5.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 3.0.3
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: ''
142
+ test_files: []