WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content
Open
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
*.a
mkmf.log
spec/fixtures/testing.csv
examples/report.csv
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

CSV support for [Ruby Object Mapper](https://github.com/rom-rb/rom)

**Note: rom-csv is read only at the moment.**

## Installation

Add this line to your application's Gemfile:
Expand Down
5 changes: 5 additions & 0 deletions examples/addresses.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
address_id,user_id,street
1,1,Cleveland Street
2,2,East Avenue
3,2,Lantern Lane
4,3,Lantern Street
39 changes: 39 additions & 0 deletions examples/create_csv_report.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
require 'bundler'
Bundler.setup

require 'rom/csv'
require 'ostruct'

csv_file = File.expand_path("./report.csv", File.dirname(__FILE__))

FileUtils.touch(csv_file)
setup = ROM.setup(:csv, csv_file)

setup.relation(:users)

class User < OpenStruct
end

setup.mappers do
define(:users) do
register_as :entity
model User
end
end

setup.commands(:users) do
define(:create) do
result :one
end
end

rom = setup.finalize

rom.commands.users.try do
rom.commands.users.create.call(id: 1, name: 'John', email: '[email protected]')
end

data = rom.relation(:users).as(:entity).to_a
# => [#<User id=1, name="John", email="[email protected]">]

data
2 changes: 1 addition & 1 deletion examples/find_user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ class User < OpenStruct

rom = setup.finalize
user = rom.relation(:users).as(:entity).by_name('Jane').one
# => #<User id=2, name="Jane", email="[email protected]">
# => #<User user_id=2, name="Jane", email="[email protected]">

user or abort "user not found"
72 changes: 72 additions & 0 deletions examples/join_datasets.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
require 'bundler'
Bundler.setup

require 'rom/csv'
require 'ostruct'

users_csv_file = File.expand_path("./users.csv", File.dirname(__FILE__))
addresses_csv_file = File.expand_path("./addresses.csv", File.dirname(__FILE__))

setup = ROM.setup(
users: [:csv, users_csv_file],
addresses: [:csv, addresses_csv_file]
)

setup.relation(:users) do
gateway :users

def by_name(name)
restrict(name: name)
end

def only_name
project(:name)
end

def ordered
order(:name, :email)
end

def with_addresses
join(addresses)
end
end

setup.relation(:addresses) do
gateway :addresses
end

class User < OpenStruct
end

class UserWithAddress < OpenStruct
end

class Address < OpenStruct
end

setup.mappers do
define(:users) do
model User
register_as :entity
end

define(:users_with_address, parent: :users) do
model UserWithAddress
register_as :entity_with_address

group :addresses do
model Address

attribute :address_id
attribute :street
end
end
end

rom = setup.finalize
user = rom.relation(:users).as(:entity_with_address).with_addresses.first
# => #<UserWithAddress user_id=1, name="Julie", email="[email protected]",
# addresses=[#<Address address_id=1, street="Cleveland Street">]>

user or abort "user not found"
2 changes: 1 addition & 1 deletion examples/users.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
id,name,email
user_id,name,email
1,Julie,[email protected]
2,Jane,[email protected]
23 changes: 16 additions & 7 deletions lib/rom/csv/commands/create.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,29 @@ def execute(tuples)
end

def insert(tuples)
tuples.each { |tuple| dataset << new_row(tuple) }
headers = headers_from_csv || headers_from_tuple(tuples.first)
tuples.each { |tuple| dataset << new_row(headers, tuple) }
dataset.sync!
end

def new_row(tuple)
::CSV::Row.new(dataset.data.headers, ordered_data(tuple))
def new_row(headers, tuple)
::CSV::Row.new(headers, ordered_data(headers, tuple))
end

def ordered_data(tuple)
dataset.data.headers.map { |header| tuple[header] }
def ordered_data(headers, tuple)
headers.map { |header| tuple[header] }
end

def dataset
relation.dataset
def dataset
relation.dataset
end

def headers_from_csv
dataset.data.headers unless dataset.data.headers.empty?
end

def headers_from_tuple(tuple)
tuple.keys
end
end
end
Expand Down
106 changes: 68 additions & 38 deletions spec/integration/commands/create_spec.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
require 'spec_helper'
require 'virtus'

require_relative '../../support/user'

describe 'Commands / Create' do
subject(:rom) { setup.finalize }

Expand All @@ -12,61 +14,89 @@

subject(:users) { rom.commands.users }

before do
FileUtils.copy(original_path, path)
context 'when csv file exists' do
before do
FileUtils.copy(original_path, path)

setup.relation(:users)
setup.relation(:users)

class User
include Virtus.model
setup.mappers do
define(:users) do
model User
register_as :entity
end
end

attribute :id, Integer
attribute :name, String
attribute :email, String
end
setup.commands(:users) do
define(:create) do
result :one
end

setup.mappers do
define(:users) do
model User
register_as :entity
define(:create_many, type: :create) do
result :many
end
end
end

setup.commands(:users) do
define(:create) do
result :one
it 'returns a single tuple when result is set to :one' do
result = users.try do
users.create.call(user_id: 4, name: 'John', email: '[email protected]')
end
expect(result.value).to eql(user_id: 4, name: 'John', email: '[email protected]')

define(:create_many, type: :create) do
result :many
end
result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(4)
end
end

it 'returns a single tuple when result is set to :one' do
result = users.try do
users.create.call(user_id: 4, name: 'John', email: '[email protected]')
end
expect(result.value).to eql(user_id: 4, name: 'John', email: '[email protected]')

result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(4)
end
it 'returns tuples when result is set to :many' do
result = users.try do
users.create_many.call([
{ user_id: 4, name: 'Jane', email: '[email protected]' },
{ user_id: 5, name: 'Jack', email: '[email protected]' }
])
end

it 'returns tuples when result is set to :many' do
result = users.try do
users.create_many.call([
expect(result.value.to_a).to match_array([
{ user_id: 4, name: 'Jane', email: '[email protected]' },
{ user_id: 5, name: 'Jack', email: '[email protected]' }
])

result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(5)
end
end

expect(result.value.to_a).to match_array([
{ user_id: 4, name: 'Jane', email: '[email protected]' },
{ user_id: 5, name: 'Jack', email: '[email protected]' }
])
context "when csv file doesn't exists" do
before do
FileUtils.rm(path) if File.exists?(path)
FileUtils.touch(path)

result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(5)
setup.relation(:users)

setup.mappers do
define(:users) do
model User
register_as :entity
end
end

setup.commands(:users) do
define(:create) do
result :one
end
end
end

it 'returns tuples from new generated csv file' do
result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(0)

users.try do
users.create.call(user_id: 4, name: 'John', email: '[email protected]')
end

result = rom.relation(:users).as(:entity).to_a
expect(result.count).to eql(1)
end
end
end
3 changes: 0 additions & 3 deletions spec/integration/commands/delete_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ def by_id(id)
expect(result.value)
.to eql(user_id: 1, name: "Julie", email: "[email protected]")

# FIXME: reload! should not be necessary
rom.relation(:users).relation.dataset.reload!

result = rom.relation(:users).to_a
expect(result.count).to eql(2)
end
Expand Down
13 changes: 2 additions & 11 deletions spec/integration/commands/update_spec.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
require 'spec_helper'
require 'virtus'

require_relative '../../support/user'

describe 'Commands / Updates' do
subject(:rom) { setup.finalize }

Expand Down Expand Up @@ -28,14 +30,6 @@ def by_id(id)
end
end

class User
include Virtus.model

attribute :id, Integer
attribute :name, String
attribute :email, String
end

setup.mappers do
define(:users) do
model User
Expand All @@ -55,9 +49,6 @@ class User

expect(result.value.to_a).to match_array(output_data)

# FIXME: reload! should not be necessary
rom.relation(:users).relation.dataset.reload!

result = rom.relation(:users).as(:entity).by_id(1).to_a.first
expect(result.email).to eql('[email protected]')
end
Expand Down
7 changes: 7 additions & 0 deletions spec/support/user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class User
include Virtus.model

attribute :id, Integer
attribute :name, String
attribute :email, String
end