rom-relation 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/.gitignore +17 -0
  2. data/.rspec +3 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +21 -0
  6. data/.yardopts +4 -0
  7. data/Gemfile +24 -0
  8. data/Gemfile.devtools +55 -0
  9. data/Guardfile +25 -0
  10. data/LICENSE +20 -0
  11. data/README.md +21 -0
  12. data/Rakefile +4 -0
  13. data/TODO.md +4 -0
  14. data/config/devtools.yml +2 -0
  15. data/config/flay.yml +3 -0
  16. data/config/flog.yml +2 -0
  17. data/config/mutant.yml +8 -0
  18. data/config/reek.yml +97 -0
  19. data/config/rubocop.yml +41 -0
  20. data/lib/rom/environment.rb +133 -0
  21. data/lib/rom/mapping/definition.rb +127 -0
  22. data/lib/rom/mapping.rb +81 -0
  23. data/lib/rom/relation.rb +339 -0
  24. data/lib/rom/repository.rb +62 -0
  25. data/lib/rom/schema/definition/relation/base.rb +25 -0
  26. data/lib/rom/schema/definition/relation.rb +44 -0
  27. data/lib/rom/schema/definition.rb +82 -0
  28. data/lib/rom/schema.rb +49 -0
  29. data/lib/rom/support/axiom/adapter/data_objects.rb +39 -0
  30. data/lib/rom/support/axiom/adapter/memory.rb +25 -0
  31. data/lib/rom/support/axiom/adapter/postgres.rb +19 -0
  32. data/lib/rom/support/axiom/adapter/sqlite3.rb +19 -0
  33. data/lib/rom/support/axiom/adapter.rb +100 -0
  34. data/lib/rom/version.rb +7 -0
  35. data/lib/rom-relation.rb +45 -0
  36. data/rom-relation.gemspec +26 -0
  37. data/spec/integration/environment_setup_spec.rb +22 -0
  38. data/spec/integration/mapping_relations_spec.rb +64 -0
  39. data/spec/integration/schema_definition_spec.rb +94 -0
  40. data/spec/shared/unit/environment_context.rb +6 -0
  41. data/spec/shared/unit/relation_context.rb +25 -0
  42. data/spec/spec_helper.rb +41 -0
  43. data/spec/support/helper.rb +17 -0
  44. data/spec/support/test_mapper.rb +23 -0
  45. data/spec/unit/rom/environment/class_methods/setup_spec.rb +25 -0
  46. data/spec/unit/rom/environment/element_reader_spec.rb +23 -0
  47. data/spec/unit/rom/environment/mapping_spec.rb +26 -0
  48. data/spec/unit/rom/environment/repository_spec.rb +21 -0
  49. data/spec/unit/rom/environment/schema_spec.rb +33 -0
  50. data/spec/unit/rom/mapping/class_methods/build_spec.rb +77 -0
  51. data/spec/unit/rom/relation/class_methods/build_spec.rb +19 -0
  52. data/spec/unit/rom/relation/delete_spec.rb +15 -0
  53. data/spec/unit/rom/relation/drop_spec.rb +11 -0
  54. data/spec/unit/rom/relation/each_spec.rb +23 -0
  55. data/spec/unit/rom/relation/first_spec.rb +19 -0
  56. data/spec/unit/rom/relation/inject_mapper_spec.rb +17 -0
  57. data/spec/unit/rom/relation/insert_spec.rb +13 -0
  58. data/spec/unit/rom/relation/last_spec.rb +19 -0
  59. data/spec/unit/rom/relation/one_spec.rb +49 -0
  60. data/spec/unit/rom/relation/replace_spec.rb +13 -0
  61. data/spec/unit/rom/relation/restrict_spec.rb +25 -0
  62. data/spec/unit/rom/relation/sort_by_spec.rb +25 -0
  63. data/spec/unit/rom/relation/take_spec.rb +11 -0
  64. data/spec/unit/rom/relation/to_a_spec.rb +20 -0
  65. data/spec/unit/rom/relation/update_spec.rb +25 -0
  66. data/spec/unit/rom/repository/class_methods/build_spec.rb +27 -0
  67. data/spec/unit/rom/repository/element_reader_spec.rb +21 -0
  68. data/spec/unit/rom/repository/element_writer_spec.rb +18 -0
  69. data/spec/unit/rom/schema/class_methods/build_spec.rb +103 -0
  70. metadata +249 -0
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ log
2
+ *.rbx
3
+ *.rbc
4
+ Gemfile.lock
5
+ tmp/
6
+ doc/
7
+ coverage/
8
+ measurements/
9
+ graphviz/
10
+ .yardoc/
11
+ .bundle/
12
+ *.png
13
+ Vagrantfile
14
+ .vagrant
15
+
16
+ # spiking area
17
+ scratchpad.rb
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --profile
3
+ --order random
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ rom
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3
data/.travis.yml ADDED
@@ -0,0 +1,21 @@
1
+ language: ruby
2
+ bundler_args: --without yard guard benchmarks
3
+ script: "bundle exec rake ci"
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - rbx-19mode
8
+ - ruby-head
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: jruby-19mode
12
+ - rvm: ruby-head
13
+ notifications:
14
+ irc:
15
+ channels:
16
+ - "irc.freenode.org#rom-rb"
17
+ on_success: never
18
+ on_failure: change
19
+ email:
20
+ on_success: never
21
+ on_failure: change
data/.yardopts ADDED
@@ -0,0 +1,4 @@
1
+ --quiet
2
+ README.md
3
+ lib/**/*.rb
4
+ LICENSE
data/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'rom-relation', path: '.'
8
+
9
+ gem 'axiom', git: 'https://github.com/dkubb/axiom.git'
10
+ gem 'rom-mapper', git: 'https://github.com/rom-rb/rom-mapper.git'
11
+
12
+ group :test do
13
+ gem 'bogus', '~> 0.1'
14
+ gem 'randexp'
15
+ gem 'ruby-graphviz'
16
+ gem 'axiom-memory-adapter', git: 'https://github.com/dkubb/axiom-memory-adapter.git'
17
+ end
18
+
19
+ group :development do
20
+ gem 'devtools', git: 'https://github.com/rom-rb/devtools.git'
21
+ end
22
+
23
+ # added by devtools
24
+ eval_gemfile 'Gemfile.devtools'
data/Gemfile.devtools ADDED
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ group :development do
4
+ gem 'rake', '~> 10.1.0'
5
+ gem 'rspec', '~> 2.14.1'
6
+ gem 'yard', '~> 0.8.7'
7
+ end
8
+
9
+ group :yard do
10
+ gem 'kramdown', '~> 1.1.0'
11
+ end
12
+
13
+ group :guard do
14
+ gem 'guard', '~> 1.8.1'
15
+ gem 'guard-bundler', '~> 1.0.0'
16
+ gem 'guard-rspec', '~> 3.0.2'
17
+ gem 'guard-rubocop', '~> 0.2.0'
18
+ gem 'guard-mutant', '~> 0.0.1'
19
+
20
+ # file system change event handling
21
+ gem 'listen', '~> 1.2.2'
22
+ gem 'rb-fchange', '~> 0.0.6', require: false
23
+ gem 'rb-fsevent', '~> 0.9.3', require: false
24
+ gem 'rb-inotify', '~> 0.9.0', require: false
25
+
26
+ # notification handling
27
+ gem 'libnotify', '~> 0.8.0', require: false
28
+ gem 'rb-notifu', '~> 0.0.4', require: false
29
+ gem 'terminal-notifier-guard', '~> 1.5.3', require: false
30
+ end
31
+
32
+ group :metrics do
33
+ gem 'coveralls', '~> 0.6.7'
34
+ gem 'flay', '~> 2.4.0'
35
+ gem 'flog', '~> 4.1.1'
36
+ gem 'reek', '~> 1.3.2'
37
+ gem 'rubocop', '~> 0.11.0'
38
+ gem 'simplecov', '~> 0.7.1'
39
+ gem 'yardstick', '~> 0.9.7', git: 'https://github.com/dkubb/yardstick.git'
40
+
41
+ platforms :ruby_19, :ruby_20 do
42
+ gem 'mutant', git: 'https://github.com/mbj/mutant.git'
43
+ gem 'yard-spellcheck', '~> 0.1.5'
44
+ end
45
+ end
46
+
47
+ group :benchmarks do
48
+ gem 'rbench', '~> 0.2.3'
49
+ end
50
+
51
+ platform :jruby do
52
+ group :jruby do
53
+ gem 'jruby-openssl', '~> 0.8.5'
54
+ end
55
+ end
data/Guardfile ADDED
@@ -0,0 +1,25 @@
1
+ guard :rspec do
2
+ #run all specs if configuration is modified
3
+ watch('Guardfile') { 'spec' }
4
+ watch('Gemfile.lock') { 'spec' }
5
+ watch('spec/spec_helper.rb') { 'spec' }
6
+
7
+ # run all specs if supporting files files are modified
8
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
9
+
10
+ # run unit specs if associated lib code is modified
11
+ watch(%r{\Alib/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}"] }
12
+ watch(%r{\Alib/(.+)/support/(.+)\.rb\z}) { |m| Dir["spec/unit/#{m[1]}/#{m[2]}"] }
13
+ watch("lib/#{File.basename(File.expand_path('../', __FILE__))}.rb") { 'spec' }
14
+
15
+ # run a spec if it is modified
16
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
17
+
18
+ notification :tmux, :display_message => true
19
+ end
20
+
21
+ guard :rubocop, cli: %w[--config config/rubocop.yml] do
22
+ watch(%r{.+\.(?:rb|rake)\z})
23
+ watch(%r{\Aconfig/rubocop\.yml\z}) { |m| File.dirname(m[0]) }
24
+ watch(%r{(?:.+/)?\.rubocop\.yml\z}) { |m| File.dirname(m[0]) }
25
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Ruby Object Mapper Team
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # rom-relation
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rom-relation.png)][gem]
4
+ [![Build Status](https://travis-ci.org/rom-rb/rom-relation.png?branch=master)][travis]
5
+ [![Dependency Status](https://gemnasium.com/rom-rb/rom-relation.png)][gemnasium]
6
+ [![Code Climate](https://codeclimate.com/github/rom-rb/rom-relation.png)][codeclimate]
7
+ [![Coverage Status](https://coveralls.io/repos/rom-rb/rom-relation/badge.png?branch=master)][coveralls]
8
+
9
+ [gem]: https://rubygems.org/gems/rom-relation
10
+ [travis]: https://travis-ci.org/rom-rb/rom-relation
11
+ [gemnasium]: https://gemnasium.com/rom-rb/rom-relation
12
+ [codeclimate]: https://codeclimate.com/github/rom-rb/rom-relation
13
+ [coveralls]: https://coveralls.io/r/rom-rb/rom-relation
14
+
15
+ Relations with mappers for [Ruby Object Mapper](http://rom-rb.org).
16
+
17
+ See ROM's [README](https://github.com/rom-rb/rom) for more information.
18
+
19
+ ## License
20
+
21
+ See LICENSE file.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+
3
+ require 'devtools'
4
+ Devtools.init_rake_tasks
data/TODO.md ADDED
@@ -0,0 +1,4 @@
1
+ # 0.0.1
2
+
3
+ * Update README with 'getting started' section
4
+ * Add missing YARD docs
@@ -0,0 +1,2 @@
1
+ ---
2
+ unit_test_timeout: 3.0
data/config/flay.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ threshold: 11
3
+ total_score: 129
data/config/flog.yml ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 12.4
data/config/mutant.yml ADDED
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: rom
3
+ namespace:
4
+ - ROM::Relation
5
+ - ROM::Environment
6
+ - ROM::Repository
7
+ - ROM::Schema
8
+ - ROM::Mapping
data/config/reek.yml ADDED
@@ -0,0 +1,97 @@
1
+ ---
2
+ Attribute:
3
+ enabled: false
4
+ exclude: []
5
+ BooleanParameter:
6
+ enabled: true
7
+ ClassVariable:
8
+ enabled: true
9
+ exclude: []
10
+ ControlParameter:
11
+ enabled: true
12
+ DataClump:
13
+ enabled: true
14
+ exclude: []
15
+ max_copies: 2
16
+ min_clump_size: 2
17
+ DuplicateMethodCall:
18
+ enabled: false
19
+ exclude: []
20
+ max_calls: 1
21
+ FeatureEnvy:
22
+ enabled: true
23
+ exclude:
24
+ - 'ROM::Mapping#build_relation'
25
+ IrresponsibleModule:
26
+ enabled: true
27
+ exclude: []
28
+ LongParameterList:
29
+ enabled: true
30
+ max_params: 3
31
+ LongYieldList:
32
+ enabled: true
33
+ max_params: 2
34
+ NestedIterators:
35
+ enabled: true
36
+ max_allowed_nesting: 1
37
+ ignore_iterators: []
38
+ NilCheck:
39
+ enabled: true
40
+ RepeatedConditional:
41
+ enabled: true
42
+ exclude: []
43
+ max_ifs: 1
44
+ TooManyInstanceVariables:
45
+ enabled: true
46
+ max_instance_variables: 3
47
+ exclude:
48
+ - ROM::Mapping::Definition
49
+ TooManyMethods:
50
+ enabled: true
51
+ exclude:
52
+ - ROM::Environment
53
+ - ROM::Relation
54
+ max_methods: 10
55
+ TooManyStatements:
56
+ enabled: true
57
+ max_statements: 4
58
+ UncommunicativeMethodName:
59
+ enabled: true
60
+ exclude:
61
+ - 'n' # typically used to denote infinity in ROM code
62
+ reject:
63
+ - !ruby/regexp /^[a-z]$/
64
+ - !ruby/regexp /[0-9]$/
65
+ - !ruby/regexp /[A-Z]/
66
+ accept: []
67
+ UncommunicativeModuleName:
68
+ enabled: true
69
+ exclude:
70
+ - Axiom::Adapter::Sqlite3
71
+ reject:
72
+ - !ruby/regexp /^.$/
73
+ - !ruby/regexp /[0-9]$/
74
+ accept: []
75
+ UncommunicativeParameterName:
76
+ enabled: true
77
+ exclude: []
78
+ reject:
79
+ - !ruby/regexp /^.$/
80
+ - !ruby/regexp /[0-9]$/
81
+ - !ruby/regexp /[A-Z]/
82
+ accept: []
83
+ UncommunicativeVariableName:
84
+ enabled: true
85
+ exclude:
86
+ - 'r' # typically used for 'relation' in blocks
87
+ reject:
88
+ - !ruby/regexp /^.$/
89
+ - !ruby/regexp /[0-9]$/
90
+ - !ruby/regexp /[A-Z]/
91
+ accept: []
92
+ UnusedParameters:
93
+ enabled: true
94
+ exclude: []
95
+ UtilityFunction:
96
+ enabled: true
97
+ max_helper_calls: 0
@@ -0,0 +1,41 @@
1
+ AllCops:
2
+ Includes:
3
+ - '**/*.rake'
4
+ Excludes:
5
+ - '**/vendor/**'
6
+ - '**/spec/unit/rom/relation/to_a_spec.rb'
7
+
8
+ # Avoid parameter lists longer than five parameters.
9
+ ParameterLists:
10
+ Max: 3
11
+ CountKeywordArgs: true
12
+
13
+ # Avoid more than `Max` levels of nesting.
14
+ BlockNesting:
15
+ Max: 3
16
+
17
+ # Align with the style guide.
18
+ CollectionMethods:
19
+ PreferredMethods:
20
+ collect: 'map'
21
+ inject: 'reduce'
22
+ find: 'detect'
23
+ find_all: 'select'
24
+
25
+ # Do not force public/protected/private keyword to be indented at the same
26
+ # level as the def keyword. My personal preference is to outdent these keywords
27
+ # because I think when scanning code it makes it easier to identify the
28
+ # sections of code and visually separate them. When the keyword is at the same
29
+ # level I think it sort of blends in with the def keywords and makes it harder
30
+ # to scan the code and see where the sections are.
31
+ AccessControl:
32
+ Enabled: false
33
+
34
+ LineLength:
35
+ Max: 94
36
+
37
+ Blocks:
38
+ Enabled: false
39
+
40
+ Documentation:
41
+ Enabled: false
@@ -0,0 +1,133 @@
1
+ # encoding: utf-8
2
+
3
+ module ROM
4
+
5
+ # The environment configures repositories and loads schema with relations
6
+ #
7
+ class Environment
8
+ include Concord.new(:repositories, :registry)
9
+
10
+ # Build an environment instance from a repository config hash
11
+ #
12
+ # @example
13
+ #
14
+ # config = { 'test' => 'memory://test' }
15
+ # env = ROM::Environment.setup(config)
16
+ #
17
+ # @param [Environment, Hash<#to_sym, String>] config
18
+ # an environment or a hash of adapter uri strings,
19
+ # keyed by repository name
20
+ #
21
+ # @return [Environment]
22
+ #
23
+ # @api public
24
+ def self.setup(config)
25
+ return config if config.kind_of?(self)
26
+
27
+ repositories = config.each_with_object({}) { |(name, uri), hash|
28
+ hash[name.to_sym] = Repository.build(name, Addressable::URI.parse(uri))
29
+ }
30
+
31
+ build(repositories)
32
+ end
33
+
34
+ # Build a new environment
35
+ #
36
+ # @param [Hash] repositories
37
+ #
38
+ # @param [Hash] registry for relations
39
+ #
40
+ # @return [Environment]
41
+ #
42
+ # @api private
43
+ def self.build(repositories, registry = {})
44
+ new(repositories, registry)
45
+ end
46
+
47
+ # Build a relation schema for this environment
48
+ #
49
+ # @example
50
+ # env = Environment.coerce(test: 'memory://test')
51
+ #
52
+ # env.schema do
53
+ # base_relation :users do
54
+ # repository :test
55
+ #
56
+ # attribute :id, Integer
57
+ # attribute :name, String
58
+ # end
59
+ # end
60
+ #
61
+ # @return [Schema]
62
+ #
63
+ # @api public
64
+ def schema(&block)
65
+ @schema ||= Schema.build(repositories)
66
+ @schema.call(&block) if block
67
+ @schema
68
+ end
69
+
70
+ # Define mapping for relations
71
+ #
72
+ # @example
73
+ #
74
+ # env.schema do
75
+ # base_relation :users do
76
+ # repository :test
77
+ #
78
+ # attribute :id, Integer
79
+ # attribtue :user_name, String
80
+ # end
81
+ # end
82
+ #
83
+ # env.mapping do
84
+ # users do
85
+ # model User
86
+ #
87
+ # map :id
88
+ # map :user_name, :to => :name
89
+ # end
90
+ # end
91
+ #
92
+ # @return [Mapping]
93
+ #
94
+ # @api public
95
+ def mapping(&block)
96
+ Mapping.build(self, schema, &block)
97
+ end
98
+
99
+ # Return registered relation
100
+ #
101
+ # @example
102
+ #
103
+ # env[:users]
104
+ #
105
+ # @param [Symbol] relation name
106
+ #
107
+ # @return [Relation]
108
+ #
109
+ # @api public
110
+ def [](name)
111
+ registry[name]
112
+ end
113
+
114
+ # Register a rom relation
115
+ #
116
+ # @return [Environment]
117
+ #
118
+ # @api private
119
+ def []=(name, relation)
120
+ registry[name] = relation
121
+ end
122
+
123
+ # The repository with the given +name+
124
+ #
125
+ # @return [Repository]
126
+ #
127
+ # @api public
128
+ def repository(name)
129
+ repositories[name]
130
+ end
131
+
132
+ end # Environment
133
+ end # ROM
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+
3
+ module ROM
4
+ class Mapping
5
+
6
+ # Mapping definition DSL
7
+ #
8
+ # @private
9
+ class Definition
10
+ include Adamantium::Flat
11
+
12
+ attr_reader :mapping, :attributes
13
+ private :mapping, :attributes
14
+
15
+ # Build new mapping definition
16
+ #
17
+ # @api private
18
+ def self.build(header, &block)
19
+ new(header, &block)
20
+ end
21
+
22
+ # Initialize a new Definition instance
23
+ #
24
+ # @return [undefined]
25
+ #
26
+ # @api private
27
+ def initialize(header, &block)
28
+ @header = header
29
+ @mapping = {}
30
+ @attributes = Set.new
31
+
32
+ instance_eval(&block)
33
+
34
+ build_mapper unless mapper
35
+ end
36
+
37
+ # @api private
38
+ def header
39
+ @header.project(attributes + Set[*mapping.keys])
40
+ end
41
+ memoize :header
42
+
43
+ # Get or set mapper
44
+ #
45
+ # @example
46
+ #
47
+ # Mapping.build do
48
+ # users do
49
+ # mapper my_custom_mapper
50
+ # end
51
+ # end
52
+ #
53
+ # @param [Object]
54
+ #
55
+ # @return [Object]
56
+ #
57
+ # @api public
58
+ def mapper(mapper = Undefined)
59
+ if mapper == Undefined
60
+ @mapper
61
+ else
62
+ @mapper = mapper
63
+ end
64
+ end
65
+
66
+ # Get or set model for the mapper
67
+ #
68
+ # @example
69
+ #
70
+ # Mapping.build do
71
+ # users do
72
+ # model User
73
+ # end
74
+ # end
75
+ #
76
+ # @param [Class]
77
+ #
78
+ # @return [Class]
79
+ #
80
+ # @api public
81
+ def model(model = Undefined)
82
+ if model == Undefined
83
+ @model
84
+ else
85
+ @model = model
86
+ end
87
+ end
88
+
89
+ # Configure attribute mappings
90
+ #
91
+ # @example
92
+ #
93
+ # Mapping.build do
94
+ # users do
95
+ # map :id, :email
96
+ # map :user_name, to: :name
97
+ # end
98
+ # end
99
+ #
100
+ # @params [Array<Symbol>,Symbol,Hash]
101
+ #
102
+ # @return [Definition]
103
+ #
104
+ # @api public
105
+ def map(*args)
106
+ options = args.last
107
+
108
+ if options.kind_of?(Hash)
109
+ mapping.update(args.first => options[:to])
110
+ else
111
+ @attributes += Set[*args]
112
+ end
113
+ end
114
+
115
+ private
116
+
117
+ # Build default rom mapper
118
+ #
119
+ # @api private
120
+ def build_mapper
121
+ @mapper = Mapper.build(header, model, map: mapping)
122
+ end
123
+
124
+ end # Definition
125
+
126
+ end # Mapping
127
+ end # ROM