Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions changeset/lib/rom/changeset/pipe.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
# frozen_string_literal: true

require 'transproc/transformer'

require 'rom/changeset/pipe_registry'

module ROM
class Changeset
# Composable data transformation pipe used by default in changesets
#
# @api private
class Pipe < Transproc::Transformer[PipeRegistry]
class Pipe < Dry::Transformer[PipeRegistry]
extend Initializer

define!(&:identity)
Expand Down
10 changes: 5 additions & 5 deletions changeset/lib/rom/changeset/pipe_registry.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
# frozen_string_literal: true

require 'transproc/all'
require 'transproc/registry'
require 'dry/transformer/all'
require 'dry/transformer/registry'

module ROM
class Changeset
# Transproc Registry useful for pipe
#
# @api private
module PipeRegistry
extend Transproc::Registry
extend Dry::Transformer::Registry

import Transproc::Coercions
import Transproc::HashTransformations
import Dry::Transformer::Coercions
import Dry::Transformer::HashTransformations

def self.add_timestamps(data)
now = Time.now
Expand Down
6 changes: 3 additions & 3 deletions changeset/lib/rom/changeset/stateful.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ class Stateful < Changeset
# end
# end
#
# @return [Array<Pipe>, Transproc::Function>]
# @return [Array<Pipe>, Dry::Transformer::Function>]
#
# @see https://github.com/solnic/transproc Transproc
# @see https://github.com/dry-rb/dry-transformer
#
# @api public
def self.map(**options, &block)
Expand All @@ -70,7 +70,7 @@ def self.map(**options, &block)
# @see Changeset::Stateful.map
# @see Changeset::Stateful#extend
#
# @return [Array<Pipe>, Transproc::Function>]
# @return [Array<Pipe>, Dry::Transformer::Function>]
#
# @api public
def self.extend(*, &block)
Expand Down
2 changes: 1 addition & 1 deletion changeset/rom-changeset.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ Gem::Specification.new do |gem|
}

gem.add_runtime_dependency 'dry-core', '~> 0.4'
gem.add_runtime_dependency 'dry-transformer', '~> 0.1'
gem.add_runtime_dependency 'rom-core', '~> 5.1', '>= 5.1.2'
gem.add_runtime_dependency 'transproc', '~> 1.0', '>= 1.1.0'

gem.add_development_dependency 'rake', '~> 11.2'
gem.add_development_dependency 'rspec', '~> 3.5'
Expand Down
2 changes: 1 addition & 1 deletion core/lib/rom/core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
require 'rom/schema_plugin'
require 'rom/relation'
require 'rom/mapper'
require 'rom/processor/transproc'
require 'rom/processor/transformer'
require 'rom/commands'

# rom Global
Expand Down
4 changes: 2 additions & 2 deletions core/lib/rom/mapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def self.headers(header)
# @return [Mapper]
#
# @api private
def self.build(header = self.header, processor = :transproc)
def self.build(header = self.header, processor = :transformer)
new(header, processor)
end

Expand All @@ -74,7 +74,7 @@ def self.registry(descendants)
end

# @api private
def initialize(header, processor = :transproc)
def initialize(header, processor = :transformer)
processor = Mapper.processors.fetch(processor)
@transformers = self.class.headers(header).map do |hdr|
processor.build(self, hdr)
Expand Down
37 changes: 37 additions & 0 deletions core/lib/rom/processor/composer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# frozen_string_literal: true

module ROM
class Processor
# @api private
module Composer
# @api private
class Factory
attr_reader :fns, :default

# @api private
def initialize(default = nil)
@fns = []
@default = default
end

# @api private
def <<(other)
fns.concat(Array(other).compact)
self
end

# @api private
def to_fn
fns.reduce(:+) || default
end
end

# @api private
def compose(default = nil)
factory = Factory.new(default)
yield(factory)
factory.to_fn
end
end
end
end
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
# frozen_string_literal: true

require 'transproc/all'
require 'dry/transformer/all'

require 'rom/processor'
require 'rom/processor/composer'

module ROM
class Processor
# Data mapping transformer builder using Transproc
# Data mapping transformer builder using dry-transformer
#
# This builds a transproc function that is used to map a whole relation
# This builds a transformer object that is used to map a whole relation
#
# @see https://github.com/solnic/transproc too
# @see https://github.com/dry-rb/dry-transformer
#
# @private
class Transproc < Processor
include ::Transproc::Composer
class Transformer < Processor
include Composer

module Functions
extend ::Transproc::Registry
extend Dry::Transformer::Registry

import ::Transproc::Coercions
import ::Transproc::ArrayTransformations
import ::Transproc::HashTransformations
import ::Transproc::ClassTransformations
import ::Transproc::ProcTransformations
INVALID_INJECT_UNION_VALUE = "%s attribute: block is required for :from with union value.".freeze
import Dry::Transformer::Coercions
import Dry::Transformer::ArrayTransformations
import Dry::Transformer::HashTransformations
import Dry::Transformer::ClassTransformations
import Dry::Transformer::ProcTransformations

def self.identity(tuple)
tuple
end
INVALID_INJECT_UNION_VALUE = '%s attribute: block is required for :from with union value.'

def self.get(arr, idx)
arr[idx]
Expand All @@ -39,7 +37,7 @@ def self.filter_empty(arr)
end

def self.inject_union_value(tuple, name, keys, coercer)
raise ROM::MapperMisconfiguredError, INVALID_INJECT_UNION_VALUE % [name] if !coercer
raise ROM::MapperMisconfiguredError, INVALID_INJECT_UNION_VALUE % [name] unless coercer

values = tuple.values_at(*keys)
result = coercer.call(*values)
Expand Down Expand Up @@ -73,15 +71,15 @@ def self.inject_union_value(tuple, name, keys, coercer)
# @api private
attr_reader :row_proc

# Build a transproc function from the header
# Build a transformer object from the header
#
# @param [ROM::Header] header
#
# @return [Transproc::Function]
# @return [Dry::Transformer::Pipe]
#
# @api private
def self.build(mapper, header)
new(mapper, header).to_transproc
new(mapper, header).call
end

# @api private
Expand All @@ -93,12 +91,12 @@ def initialize(mapper, header)
initialize_row_proc
end

# Coerce mapper header to a transproc data mapping function
# Coerce mapper header to a transformer object
#
# @return [Transproc::Function]
# @return [Dry::Transformer::Pipe]
#
# @api private
def to_transproc
def call
compose(t(:identity)) do |ops|
combined = header.combined
ops << t(:combine, combined.map(&method(:combined_args))) if combined.any?
Expand Down Expand Up @@ -315,22 +313,22 @@ def visit_fold(attribute, preprocess = false)
#
# @api private
def visit_unfold(attribute, preprocess = false)
if preprocess
name = attribute.name
header = attribute.header
keys = attribute.pop_keys
key = keys.first
return unless preprocess

others = header.postprocessed
name = attribute.name
header = attribute.header
keys = attribute.pop_keys
key = keys.first

compose do |ops|
ops << others.map { |attr|
t(:map_array, t(:map_value, name, visit(attr, true)))
}
ops << t(:map_array, t(:map_value, name, t(:insert_key, key)))
ops << t(:map_array, t(:reject_keys, [key] - [name]))
ops << t(:ungroup, name, [key])
end
others = header.postprocessed

compose do |ops|
ops << others.map { |attr|
t(:map_array, t(:map_value, name, visit(attr, true)))
}
ops << t(:map_array, t(:map_value, name, t(:insert_key, key)))
ops << t(:map_array, t(:reject_keys, [key] - [name]))
ops << t(:ungroup, name, [key])
end
end

Expand Down
9 changes: 4 additions & 5 deletions core/lib/rom/transformer.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
# frozen_string_literal: true

require 'dry/core/class_attributes'
require 'transproc/transformer'
require 'dry/transformer'

require 'rom/processor/transproc'
require 'rom/processor/transformer'

module ROM
# Transformer is a data mapper which uses Transproc's transformer DSL to define
# transformations.
# Transformer is a data mapper which uses `Dry::Transformer`'s DSL to define transformations.
#
# @api public
class Transformer < Transproc::Transformer[ROM::Processor::Transproc::Functions]
class Transformer < Dry::Transformer[Processor::Transformer::Functions]
extend Dry::Core::ClassAttributes

# @!method self.register_as
Expand Down
2 changes: 1 addition & 1 deletion core/rom-core.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Gem::Specification.new do |gem|
gem.add_runtime_dependency 'dry-types', '~> 1.0'
gem.add_runtime_dependency 'dry-struct', '~> 1.0'
gem.add_runtime_dependency 'dry-initializer', '~> 3.0', '>= 3.0.1'
gem.add_runtime_dependency 'transproc', '~> 1.0', '>= 1.1.0'
gem.add_runtime_dependency 'dry-transformer', '~> 0.1'

gem.add_development_dependency 'rake', '~> 10.3'
gem.add_development_dependency 'rspec', '~> 3.5'
Expand Down
Loading