mappy 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 97a895fb24535f400ea8d29194014cc1839a70c4
4
- data.tar.gz: 89f0e15d65ab2e4bf6185b050bdb50bccfa8af22
3
+ metadata.gz: 4bbb59217a36e78e7771bc6cfb785ee4e98927df
4
+ data.tar.gz: 95c90b75b8e56c6db422fc253fbc0f176813666c
5
5
  SHA512:
6
- metadata.gz: 5853e1dd86267941c97ddbb948bb302f1a72c64c4d4b296465c1da318dd6796289eda87a563e8b811ffca8a5bd6fa05a49ae7f53370933052402bf78fef400f6
7
- data.tar.gz: f4911345c74c394b58ff32359da4a378917fa0c01579a77a4d41059e489f68b2bd8c8c8876794e7aefeee370a1fe02be057e54f8fd10e3453c1a514725398c67
6
+ metadata.gz: f0c28bc091328590967f0e28d3828877822fd3ee53fe28ef6f986764337c7bad65d1a4d886c71ba272eb51e29260f8b81b109026eb0f6a1c3b2deafb507586c6
7
+ data.tar.gz: c240762fa3bee3d3caa09078c0ea6fab1f56612fbc995906fa0937a78bd7c0adb85244f1fa91f1afee560dffa5a378d470b6cd22d197df1127fef39c682c7025
data/README.md CHANGED
@@ -3,21 +3,6 @@
3
3
  Map one object to another. Apsiring to be a DSL for mapping one object's "data
4
4
  structure" onto another object's "data structure".
5
5
 
6
- ## Why?
7
-
8
- Because I have discovered that I am regularly working with a heterogenious set of
9
- objects that need to be handled via some other service. And that service has its
10
- expected data structure. And there are quite a few services.
11
-
12
- That is to say, I'm attempting to submit a work to my Orcid Profile. I need some
13
- method for defining how to map my home grown "Article" object to the attributes
14
- that are needed for an Orcide work. And I don't want to infect my Article class
15
- with a #to_orcid_profile_attributes method.
16
-
17
- Or I want to create a DOI for my Article.
18
-
19
- In essence, Mappy provides a configurable seam in an application.
20
-
21
6
  ## Installation
22
7
 
23
8
  Add this line to your application's Gemfile:
@@ -31,3 +16,53 @@ And then execute:
31
16
  Or install it yourself as:
32
17
 
33
18
  $ gem install mappy
19
+
20
+ ## Usage
21
+
22
+ You can certainly read the documentation. In particular the [Mappy module](lib/mappy.rb).
23
+ But if you are like me, you won't trust the documentation.
24
+ Instead I would recommend reading the specs, especially [mappy_spec](spec/mappy_spec.rb)
25
+
26
+ ### TL;DR
27
+
28
+ ```ruby
29
+ class Book
30
+ attr_accessor :name
31
+ def initialize(attributes = {})
32
+ attributes.each {|key, value| send("#{key}=", value) if respond_to?("#{key}=") }
33
+ end
34
+ end
35
+
36
+ class Orcid::Work
37
+ attr_accessor :title
38
+ def initialize(attributes = {})
39
+ attributes.each {|key, value| send("#{key}=", value) if respond_to?("#{key}=") }
40
+ end
41
+ end
42
+
43
+ Mappy.configure do |config|
44
+ config.register(source: 'book', target: 'orcid/work', legend: [:name, :title])
45
+ end
46
+
47
+ book = Book.new(title: 'Hello World')
48
+ orcid_work = Mappy.map(book, target: 'orcid/work')
49
+
50
+ assert_equal orcid_work.title, book.name
51
+ ```
52
+
53
+
54
+
55
+ ## Why?
56
+
57
+ Because I have discovered that I am regularly working with a heterogenious set of
58
+ objects that need to be handled via some other service. And that service has its
59
+ expected data structure. And there are quite a few services.
60
+
61
+ That is to say, I'm attempting to submit a work to my Orcid Profile. I need some
62
+ method for defining how to map my home grown "Article" object to the attributes
63
+ that are needed for an Orcide work. And I don't want to infect my Article class
64
+ with a #to_orcid_profile_attributes method.
65
+
66
+ Or I want to create a DOI for my Article.
67
+
68
+ In essence, Mappy provides a configurable seam in an application.
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'yard'
3
+
4
+ YARD::Rake::YardocTask.new do |t|
5
+ t.files = ['lib/**/*.rb', 'lib/mappy.rb', '-', 'README.md', 'LICENSE']
6
+ t.options = ['--no-private']
7
+ end
@@ -3,43 +3,66 @@ require "mappy/configuration"
3
3
 
4
4
  module Mappy
5
5
  class << self
6
- attr_accessor :configuration
6
+ attr_writer :configuration
7
+ def configuration
8
+ @configuration ||= Configuration.new
9
+ end
10
+ private :configuration
11
+
7
12
  end
8
13
 
9
14
  module_function
10
-
15
+ # Determines the object's Mappy type
16
+ #
17
+ # @param object [Object] the source object
18
+ # @return [String] the Mappy type which should be used in configuring Mappy
19
+ # @see Mappy.configure
11
20
  def to_type(object)
12
21
  return object.to_mappy_type if object.respond_to?(:to_mappy_type)
13
22
  object.class.to_s.underscore
14
23
  end
15
24
 
16
- # Used for configuring available RemoteService and any additional
17
- # initialization requirements for those RemoteServices (i.e. credentials)
25
+ # Registers a collection of maps.
18
26
  #
19
27
  # @example
28
+ # Mappy.configure do |config|
29
+ # config.register(source: 'book', target: 'orcid/work', legend: [:name, :title])
30
+ # end
20
31
  #
21
32
  # @yieldparam config [Configuration]
22
33
  # @see Mappy::Railtie
23
34
  def configure(&block)
24
- @configuration_block = block
25
-
26
- # The Rails load sequence means that some of the configured Targets may
27
- # not be loaded; As such I am not calling configure! instead relying on
28
- # Mappy::Railtie to handle the configure! call
29
- finalize! unless defined?(Rails)
35
+ yield(configuration)
30
36
  end
31
37
 
38
+ # Converts the source object to an instance of the options[:target].
39
+ #
40
+ # @example
41
+ # Mappy.configure do |config|
42
+ # config.register(source: 'book', target: 'orcid/work', legend: [:name, :title])
43
+ # end
44
+ # book = Book.new(title: 'Hello World')
45
+ # orcid_work = Mappy.map(book, target: 'orcid/work')
46
+ #
47
+ # assert_equal orcid_work.title, book.name
48
+ #
49
+ # @param source [Object] :source - the instance of a class that you are mapping from
50
+ # @param options [Hash]
51
+ # @options options [String] :target - the class name of the target that you are mapping to.
52
+ # @return [Object] an instance of the :target that has been instantiated by mapping the :source object
53
+ #
54
+ # @see Mappy.configure
32
55
  def map(source, options = {})
33
56
  configuration.map(source, options)
34
57
  end
35
58
 
59
+ # @deprecated
36
60
  def finalize!
37
- if @configuration_block.respond_to?(:call)
38
- self.configuration ||= Configuration.new
39
- @configuration_block.call(configuration)
40
- end
41
61
  end
42
62
 
63
+ # Because sometimes, when you are testing things, you might want a new
64
+ # configuration.
65
+ # :nodoc:
43
66
  def reset!
44
67
  self.configuration = Configuration.new
45
68
  end
@@ -7,16 +7,16 @@ module Mappy
7
7
  class Configuration
8
8
  attr_reader :map_store
9
9
  def initialize(config = {})
10
- @map_store = config.fetch(:map_store) { Mappy::MapStore.new }
10
+ @map_store = config.fetch(:map_store) { MapStore.new }
11
11
  end
12
12
 
13
- def legend(options = {})
13
+ def register(options = {})
14
14
  map_store.write(options)
15
15
  end
16
16
 
17
17
  def map(source_instance, options = {})
18
18
  target = options.fetch(:target)
19
- target_builder_finder = options.fetch(:target_builder_finder) { Mappy::TargetBuilderFactory }
19
+ target_builder_finder = options.fetch(:target_builder_finder) { TargetBuilderFactory }
20
20
  target_builder = target_builder_finder.call(target)
21
21
 
22
22
  return source_instance if source_instance.is_a?(target_builder)
@@ -43,4 +43,5 @@ module Mappy
43
43
  end
44
44
  end
45
45
 
46
+ private_constant :Configuration
46
47
  end
@@ -1,5 +1,8 @@
1
1
  module Mappy
2
2
 
3
+ class InvalidTargetBuilder < RuntimeError
4
+ end
5
+
3
6
  class MapNotFound < RuntimeError
4
7
  def initialize(map_store, keys)
5
8
  super("#{keys.inspect} not found in #{map_store.inspect}")
@@ -26,4 +26,6 @@ module Mappy
26
26
  end
27
27
 
28
28
  end
29
+
30
+ private_constant :MapStore
29
31
  end
@@ -35,4 +35,6 @@ module Mappy
35
35
  end
36
36
  end
37
37
  end
38
+
39
+ private_constant :Resolver
38
40
  end
@@ -1,8 +1,7 @@
1
1
  require 'active_support/inflector'
2
+ require File.expand_path('../exceptions', __FILE__)
2
3
 
3
4
  module Mappy
4
- class InvalidTargetBuilder < RuntimeError
5
- end
6
5
 
7
6
  # Responsible for taking a symbol, finding the appropriate class then
8
7
  # verifying that the class is "well formed."
@@ -34,4 +33,6 @@ module Mappy
34
33
 
35
34
  end
36
35
  end
36
+
37
+ private_constant :TargetBuilderFactory
37
38
  end
@@ -1,3 +1,3 @@
1
1
  module Mappy
2
- VERSION = "0.0.5"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rspec"
25
25
  spec.add_development_dependency "byebug"
26
+ spec.add_development_dependency 'yard'
26
27
  end
@@ -2,14 +2,16 @@ require File.expand_path('../../../../lib/mappy/configuration', __FILE__)
2
2
 
3
3
  module Mappy
4
4
  describe Configuration do
5
- let(:map_store) { Mappy::MapStore.new }
5
+ let(:map_store) { MapStore.new }
6
6
  let(:legend) { [[:title, :title]] }
7
7
 
8
8
  subject { described_class.new(map_store: map_store) }
9
9
 
10
- context '#legend' do
10
+ context '#register' do
11
+ before(:each) do
12
+ end
11
13
  it 'should yield a map storage' do
12
- subject.legend(source: :article, target: :document, legend: legend)
14
+ subject.register(source: :article, target: :document, legend: legend)
13
15
  expect(map_store.read(source: :article, target: :document)).to eq(legend)
14
16
  end
15
17
  end
@@ -22,7 +24,7 @@ module Mappy
22
24
  let(:target_builder_finder) { double("Finder") }
23
25
 
24
26
  before(:each) do
25
- subject.legend(source: source_type, target: target_type, legend: legend)
27
+ subject.register(source: source_type, target: target_type, legend: legend)
26
28
  end
27
29
  it 'should yield a map storage' do
28
30
  target_builder_finder.should_receive(:call).with(target_type).and_return(target_builder)
@@ -19,7 +19,7 @@ describe Mappy do
19
19
  context '.map' do
20
20
  before(:each) do
21
21
  Mappy.configure do |config|
22
- config.legend(
22
+ config.register(
23
23
  source: :journal,
24
24
  target: 'mappy/mock_valid_model',
25
25
  legend: [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mappy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Friesen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-19 00:00:00.000000000 Z
11
+ date: 2014-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Map one object to another
84
98
  email:
85
99
  - jeremy.n.friesen@gmail.com
@@ -138,3 +152,4 @@ test_files:
138
152
  - spec/lib/mappy/target_builder_factory_spec.rb
139
153
  - spec/lib/mappy_spec.rb
140
154
  - spec/lib/model_support.rb
155
+ has_rdoc: