artisan-memory-repository 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/artisan-memory-repository/artisan_memory_repository.rb +42 -0
- data/lib/artisan-memory-repository/base_repository.rb +57 -0
- data/lib/artisan-memory-repository/change_repository.rb +31 -0
- data/lib/artisan-memory-repository/future_user_repository.rb +39 -0
- data/lib/artisan-memory-repository/iteration_repository.rb +36 -0
- data/lib/artisan-memory-repository/member_repository.rb +13 -0
- data/lib/artisan-memory-repository/models/base.rb +85 -0
- data/lib/artisan-memory-repository/models/change.rb +15 -0
- data/lib/artisan-memory-repository/models/future_user.rb +21 -0
- data/lib/artisan-memory-repository/models/iteration.rb +24 -0
- data/lib/artisan-memory-repository/models/member.rb +4 -0
- data/lib/artisan-memory-repository/models/project.rb +13 -0
- data/lib/artisan-memory-repository/models/project_configuration.rb +7 -0
- data/lib/artisan-memory-repository/models/story.rb +23 -0
- data/lib/artisan-memory-repository/models/user.rb +30 -0
- data/lib/artisan-memory-repository/project_configuration_repository.rb +15 -0
- data/lib/artisan-memory-repository/project_repository.rb +70 -0
- data/lib/artisan-memory-repository/story_repository.rb +86 -0
- data/lib/artisan-memory-repository/user_repository.rb +44 -0
- metadata +75 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'artisan-memory-repository/story_repository'
|
2
|
+
require 'artisan-memory-repository/project_repository'
|
3
|
+
require 'artisan-memory-repository/iteration_repository'
|
4
|
+
require 'artisan-memory-repository/user_repository'
|
5
|
+
require 'artisan-memory-repository/future_user_repository'
|
6
|
+
require 'artisan-memory-repository/project_configuration_repository'
|
7
|
+
require 'artisan-memory-repository/change_repository'
|
8
|
+
require 'artisan-memory-repository/member_repository'
|
9
|
+
|
10
|
+
module ArtisanMemoryRepository
|
11
|
+
def self.story
|
12
|
+
@story_repo ||= StoryRepository.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.project
|
16
|
+
@project_repo ||= ProjectRepository.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.iteration
|
20
|
+
@iteration_repo ||= IterationRepository.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.user
|
24
|
+
@user_repo ||= UserRepository.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.future_user
|
28
|
+
@future_user_repo ||= FutureUserRepository.new
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.project_configuration
|
32
|
+
@project_config_repo ||= ProjectConfigurationRepository.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.member
|
36
|
+
@member_repo ||= MemberRepository.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.change
|
40
|
+
@change ||= ChangeRepository.new
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ArtisanMemoryRepository
|
2
|
+
|
3
|
+
module BaseRepository
|
4
|
+
def save(object)
|
5
|
+
clone = object.dup
|
6
|
+
|
7
|
+
if clone.id
|
8
|
+
records[clone.id] = clone
|
9
|
+
else
|
10
|
+
clone.id = records.size + 1
|
11
|
+
records[clone.id] = clone
|
12
|
+
end
|
13
|
+
|
14
|
+
return clone
|
15
|
+
end
|
16
|
+
|
17
|
+
#def create!(attrs = {})
|
18
|
+
# project = model_class.new(attrs)
|
19
|
+
# self.save(project)
|
20
|
+
#end
|
21
|
+
|
22
|
+
def create(attrs = {})
|
23
|
+
project = model_class.new(attrs)
|
24
|
+
self.save(project)
|
25
|
+
end
|
26
|
+
|
27
|
+
def find(id)
|
28
|
+
record = records[id.to_i]
|
29
|
+
raise Artisan::RecordNotFound unless record
|
30
|
+
record
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_each(&block)
|
34
|
+
records.each do |id, model|
|
35
|
+
block.call(model)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete(id)
|
40
|
+
records.delete(id)
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy_all
|
44
|
+
@records = {}
|
45
|
+
end
|
46
|
+
|
47
|
+
def records
|
48
|
+
@records ||= {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def where(attributes)
|
52
|
+
records.values.select do |record|
|
53
|
+
attributes.all? { |key, value| record.send(key) == value }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'artisan-memory-repository/base_repository'
|
2
|
+
require 'artisan-memory-repository/models/change'
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class ChangeRepository
|
6
|
+
include BaseRepository
|
7
|
+
|
8
|
+
def model_class
|
9
|
+
ArtisanMemoryRepository::Change
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_project_change(attributes = {})
|
13
|
+
create(attributes.merge({:type => "ProjectChange"}))
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_iteration_change(attributes = {})
|
17
|
+
create(attributes.merge({:type => "IterationChange"}))
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def create_story_change(attributes = {})
|
22
|
+
create(attributes.merge({:type => "StoryChange"}))
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def find_all_by_project_id(project_id)
|
27
|
+
records.values.find_all {|r| r.project_id == project_id}.sort_by(&:created_at).reverse
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'artisan-memory-repository/models/future_user'
|
2
|
+
require 'artisan-memory-repository/base_repository'
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class FutureUserRepository
|
6
|
+
include BaseRepository
|
7
|
+
|
8
|
+
def new(attrs = {})
|
9
|
+
ArtisanMemoryRepository::FutureUser.new(attrs)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create(attrs = {})
|
13
|
+
future_user = new(attrs)
|
14
|
+
unique_email = validate_unique_email(attrs[:email])
|
15
|
+
if unique_email
|
16
|
+
save(future_user)
|
17
|
+
else
|
18
|
+
future_user.add_errors(:email => "This email has already been taken")
|
19
|
+
raise ArgumentError.new('The record has errors.')
|
20
|
+
end
|
21
|
+
future_user
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_by_email(email)
|
25
|
+
records.values.find { |r| r.email == email }
|
26
|
+
end
|
27
|
+
|
28
|
+
def find_by_project_id(project_id)
|
29
|
+
records.values.find { |r| r.project_id == project_id }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def validate_unique_email(email)
|
35
|
+
return false if email.nil?
|
36
|
+
!records.values.any? { |r| r.email == email }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'artisan-memory-repository/base_repository'
|
2
|
+
require 'artisan-memory-repository/models/iteration'
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class IterationRepository
|
6
|
+
include BaseRepository
|
7
|
+
|
8
|
+
def model_class
|
9
|
+
ArtisanMemoryRepository::Iteration
|
10
|
+
end
|
11
|
+
|
12
|
+
def new(attributes = {})
|
13
|
+
model_class.new(attributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_for_project(project, attrs)
|
17
|
+
iteration = model_class.new(attrs)
|
18
|
+
iteration.project = project
|
19
|
+
project.iterations << iteration
|
20
|
+
save(iteration)
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_by_number(project, number)
|
24
|
+
records.values.find {|r| r.project == project && r.number = number}
|
25
|
+
end
|
26
|
+
|
27
|
+
def by_project(project, options = {})
|
28
|
+
records.values.find_all {|r| r.project == project}.sort_by(&:number).reverse
|
29
|
+
end
|
30
|
+
|
31
|
+
def by_project_by_finish_date(project)
|
32
|
+
self.by_project(project).sort_by!{ |iteration| Date.parse(iteration.finish_date) }.reverse
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module ArtisanMemoryRepository
|
2
|
+
class Base
|
3
|
+
def initialize(options = {})
|
4
|
+
self.class._collections.each {|field| set(field, [])}
|
5
|
+
options.each { |key, value| set(key, value) }
|
6
|
+
set(:id, random_int) if saves?
|
7
|
+
self.init
|
8
|
+
end
|
9
|
+
|
10
|
+
def init; end
|
11
|
+
|
12
|
+
def self.data_attributes(*fields)
|
13
|
+
@_fields = fields
|
14
|
+
(fields + [:id, :saves]).each {|field| attr_accessor field }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self._fields
|
18
|
+
@_fields ||= []
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.boolean(*fields)
|
22
|
+
(fields).each do |field|
|
23
|
+
define_method("#{field}?".to_sym) { !!get(field) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.collections(*collections)
|
28
|
+
@_collections = collections
|
29
|
+
collections.each do |collection|
|
30
|
+
attr_accessor collection
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self._collections
|
35
|
+
@_collections ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
def saves?
|
39
|
+
get(:saves).nil? ? true : !!get(:saves)
|
40
|
+
end
|
41
|
+
|
42
|
+
def get(key)
|
43
|
+
instance_variable_get("@#{key}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def set(key, value)
|
47
|
+
instance_variable_set("@#{key}", value)
|
48
|
+
end
|
49
|
+
|
50
|
+
def attributes
|
51
|
+
self.class._fields.inject({}) do |attributes, key|
|
52
|
+
attributes[key] = get(key)
|
53
|
+
attributes
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
alias :update_attribute :set
|
58
|
+
|
59
|
+
def update_attributes(options = {})
|
60
|
+
return false unless saves?
|
61
|
+
return attributes if options.nil?
|
62
|
+
options.each { |key, value| set(key, value) }
|
63
|
+
end
|
64
|
+
|
65
|
+
alias :update_attributes! :update_attributes
|
66
|
+
|
67
|
+
def ==(other)
|
68
|
+
return false if other.nil?
|
69
|
+
return false if other.class != self.class
|
70
|
+
self.class._fields.each do |attr|
|
71
|
+
return false if self.send(attr) != other.send(attr)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_param
|
76
|
+
id.to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def random_int
|
82
|
+
return (Time.now.to_i + rand(1000))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class Change < Base
|
5
|
+
data_attributes :type,
|
6
|
+
:source_id,
|
7
|
+
:user_id,
|
8
|
+
:event,
|
9
|
+
:project_id,
|
10
|
+
:created_at,
|
11
|
+
:original_fields,
|
12
|
+
:changed_fields
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class FutureUser < Base
|
5
|
+
data_attributes :id, :email, :project_id, :login
|
6
|
+
|
7
|
+
attr_reader :errors
|
8
|
+
|
9
|
+
def init
|
10
|
+
@errors = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_errors(errors_hash)
|
14
|
+
errors_hash.each_pair do |key, value|
|
15
|
+
@errors[key] = @errors[key] || []
|
16
|
+
@errors[key] << value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class Iteration < Base
|
5
|
+
data_attributes :completed_total,
|
6
|
+
:story_tags,
|
7
|
+
:start_date,
|
8
|
+
:finish_date,
|
9
|
+
:number,
|
10
|
+
:complete,
|
11
|
+
:completed_at,
|
12
|
+
:committed_points_at_completion,
|
13
|
+
:errors,
|
14
|
+
:total_billed_points,
|
15
|
+
:committed_points,
|
16
|
+
:total_points,
|
17
|
+
:project,
|
18
|
+
:days
|
19
|
+
|
20
|
+
boolean :complete
|
21
|
+
|
22
|
+
collections :stories, :users
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class Project < Base
|
5
|
+
data_attributes :id, :name, :life_cycle, :archived, :description,
|
6
|
+
:api_key, :project_configuration
|
7
|
+
|
8
|
+
boolean :archived
|
9
|
+
|
10
|
+
collections :iterations, :stories, :members, :owners, :users
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class Story < Base
|
5
|
+
|
6
|
+
data_attributes :assigned_user_id, :billed,
|
7
|
+
:complete, :completed_at, :created_at, :creator,
|
8
|
+
:creator_id, :deleted, :estimate, :incomplete, :name,
|
9
|
+
:number, :nonbillable, :optimistic, :pessimistic,
|
10
|
+
:position, :realistic, :standard_deviation, :tags,
|
11
|
+
:tag_list, :assigned_user, :iteration, :project
|
12
|
+
|
13
|
+
boolean :complete, :nonbillable, :deleted
|
14
|
+
|
15
|
+
def to_json(*args)
|
16
|
+
attributes.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "artisan-memory-repository/models/base"
|
2
|
+
require "active_model"
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class User < ArtisanMemoryRepository::Base
|
6
|
+
data_attributes :full_name, :projects, :members,
|
7
|
+
:login, :email, :gravatar_url, :password,
|
8
|
+
:password_confirmation
|
9
|
+
|
10
|
+
def initialize(*args)
|
11
|
+
@external_errors = []
|
12
|
+
super(*args)
|
13
|
+
end
|
14
|
+
|
15
|
+
include ActiveModel::Validations
|
16
|
+
|
17
|
+
validates :full_name, :presence => true
|
18
|
+
validates_length_of :login, :minimum => 3
|
19
|
+
validates_format_of :login, :with => /\A\w[\w\.+\-_@ ]+$/, :message => "should use only letters, numbers, spaces, and .-_@ please."
|
20
|
+
|
21
|
+
validate do
|
22
|
+
@external_errors.each { |error| errors.add *error }
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_error(*args)
|
27
|
+
@external_errors << args
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'artisan-memory-repository/models/project_configuration'
|
2
|
+
|
3
|
+
module ArtisanMemoryRepository
|
4
|
+
class ProjectConfigurationRepository
|
5
|
+
include BaseRepository
|
6
|
+
|
7
|
+
def model_class
|
8
|
+
ArtisanMemoryRepository::ProjectConfiguration
|
9
|
+
end
|
10
|
+
|
11
|
+
def new(attributes = {})
|
12
|
+
model_class.new(attributes)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'artisan-memory-repository/base_repository'
|
2
|
+
require 'artisan-memory-repository/models/project'
|
3
|
+
require "artisan-memory-repository/models/project_configuration"
|
4
|
+
|
5
|
+
module ArtisanMemoryRepository
|
6
|
+
class ProjectRepository
|
7
|
+
include BaseRepository
|
8
|
+
|
9
|
+
def model_class
|
10
|
+
ArtisanMemoryRepository::Project
|
11
|
+
end
|
12
|
+
|
13
|
+
def new(attributes = {})
|
14
|
+
model_class.new(attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def order_by_name
|
18
|
+
records.values.sort_by { |r| r.name }
|
19
|
+
end
|
20
|
+
|
21
|
+
def unarchived
|
22
|
+
records.values.select { |r| !r.archived }.sort_by(&:name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def archived
|
26
|
+
records.values.select { |r| r.archived }.sort_by(&:name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_by_api_key(api_key)
|
30
|
+
records.values.find { |r| r.api_key == api_key }
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_by_name(name)
|
34
|
+
records.values.find{|r| r.name == name}
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_iteration(project, iteration)
|
38
|
+
project.iterations << iteration
|
39
|
+
project.iterations.sort! { |i| i.number }
|
40
|
+
iteration
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_member(project, user, owner)
|
44
|
+
project.users << user
|
45
|
+
project.owners << user if owner
|
46
|
+
end
|
47
|
+
|
48
|
+
def remove_member(project, user)
|
49
|
+
project.users.delete(user)
|
50
|
+
project.owners.delete(user)
|
51
|
+
end
|
52
|
+
|
53
|
+
def is_member?(project, user)
|
54
|
+
project.users.include?(user)
|
55
|
+
end
|
56
|
+
|
57
|
+
def is_owner?(project, user)
|
58
|
+
project.owners.include?(user)
|
59
|
+
end
|
60
|
+
|
61
|
+
def owners(project)
|
62
|
+
project.owners
|
63
|
+
end
|
64
|
+
|
65
|
+
def create_project_configuration(project)
|
66
|
+
project.project_configuration = ArtisanMemoryRepository::ProjectConfiguration.new
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'artisan-memory-repository/base_repository'
|
2
|
+
require 'artisan-memory-repository/models/story'
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class StoryRepository
|
6
|
+
include BaseRepository
|
7
|
+
|
8
|
+
def model_class
|
9
|
+
ArtisanMemoryRepository::Story
|
10
|
+
end
|
11
|
+
|
12
|
+
def new(attributes = {})
|
13
|
+
model_class.new(attributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
def find(number, project)
|
17
|
+
result = records.values.find do |record|
|
18
|
+
record.project == project && record.number == number
|
19
|
+
end
|
20
|
+
|
21
|
+
raise Artisan::RecordNotFound.new if result.nil?
|
22
|
+
return result
|
23
|
+
end
|
24
|
+
|
25
|
+
def create!(attributes = {})
|
26
|
+
save model_class.new(attributes)
|
27
|
+
end
|
28
|
+
|
29
|
+
def for_user(user)
|
30
|
+
records.values.select{|r| r.assigned_user == user}
|
31
|
+
end
|
32
|
+
|
33
|
+
def by_project(project)
|
34
|
+
records.values.select{|r| r.project.nil? ? false : r.project.id == project.id }
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_for_project(project, attrs = {})
|
38
|
+
story = create(attrs)
|
39
|
+
project.stories << story
|
40
|
+
story.project = project
|
41
|
+
Artisan::Repository.project.save(project)
|
42
|
+
story
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_to_iteration(iteration, story)
|
46
|
+
iteration.stories.delete_if { |s| s.id == story.id }
|
47
|
+
iteration.stories << story
|
48
|
+
story.iteration = iteration
|
49
|
+
Artisan::Repository.iteration.save(iteration)
|
50
|
+
end
|
51
|
+
|
52
|
+
def remove_from_iteration(story)
|
53
|
+
iteration = story.iteration
|
54
|
+
story.iteration = nil
|
55
|
+
iteration.stories.delete_if { |s| s.id == story.id }
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete(story)
|
59
|
+
deleted = records.delete(story.id)
|
60
|
+
deleted.deleted = true
|
61
|
+
deleted
|
62
|
+
end
|
63
|
+
|
64
|
+
def all(iteration)
|
65
|
+
iteration.stories
|
66
|
+
end
|
67
|
+
|
68
|
+
def ready(iteration)
|
69
|
+
iteration.stories.select{|r| r.assigned_user.nil? && !r.complete}
|
70
|
+
end
|
71
|
+
|
72
|
+
def working(iteration)
|
73
|
+
iteration.stories.select{|r| !r.assigned_user.nil? &&
|
74
|
+
!r.complete}
|
75
|
+
end
|
76
|
+
|
77
|
+
def completed(iteration)
|
78
|
+
iteration.stories.select(&:complete)
|
79
|
+
end
|
80
|
+
|
81
|
+
def backlog(project)
|
82
|
+
records.values.select { |r| r.iteration.nil? }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'artisan-memory-repository/models/user'
|
2
|
+
require 'artisan-memory-repository/base_repository'
|
3
|
+
|
4
|
+
module ArtisanMemoryRepository
|
5
|
+
class UserRepository
|
6
|
+
include BaseRepository
|
7
|
+
|
8
|
+
def new(attrs = {})
|
9
|
+
ArtisanMemoryRepository::User.new(attrs)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create(attrs = {})
|
13
|
+
user = new(attrs)
|
14
|
+
if !existing_login?(user.login) && user.valid?
|
15
|
+
save(user)
|
16
|
+
else
|
17
|
+
user.add_error(:login, 'has already been taken')
|
18
|
+
raise ArgumentError.new('The record has errors.')
|
19
|
+
end
|
20
|
+
user
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_by_email(email)
|
24
|
+
records.values.find { |r| r.email == email }
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_by_login(login)
|
28
|
+
return nil if login.nil?
|
29
|
+
records.values.find { |r| r.login.downcase == login.downcase }
|
30
|
+
end
|
31
|
+
|
32
|
+
def active_stories_for(user)
|
33
|
+
story_repository = Artisan::Repository.story
|
34
|
+
stories = story_repository.for_user(user)
|
35
|
+
stories.reject { |story| story.complete }
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def existing_login?(login)
|
41
|
+
!find_by_login(login).nil?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: artisan-memory-repository
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- 8th Light Craftsmen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2012-10-10 00:00:00 Z
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: An interface to the Artisan in memory persistance layer
|
17
|
+
email: paul@8thlight.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/artisan-memory-repository/artisan_memory_repository.rb
|
26
|
+
- lib/artisan-memory-repository/base_repository.rb
|
27
|
+
- lib/artisan-memory-repository/change_repository.rb
|
28
|
+
- lib/artisan-memory-repository/future_user_repository.rb
|
29
|
+
- lib/artisan-memory-repository/iteration_repository.rb
|
30
|
+
- lib/artisan-memory-repository/member_repository.rb
|
31
|
+
- lib/artisan-memory-repository/models/base.rb
|
32
|
+
- lib/artisan-memory-repository/models/change.rb
|
33
|
+
- lib/artisan-memory-repository/models/future_user.rb
|
34
|
+
- lib/artisan-memory-repository/models/iteration.rb
|
35
|
+
- lib/artisan-memory-repository/models/member.rb
|
36
|
+
- lib/artisan-memory-repository/models/project.rb
|
37
|
+
- lib/artisan-memory-repository/models/project_configuration.rb
|
38
|
+
- lib/artisan-memory-repository/models/story.rb
|
39
|
+
- lib/artisan-memory-repository/models/user.rb
|
40
|
+
- lib/artisan-memory-repository/project_configuration_repository.rb
|
41
|
+
- lib/artisan-memory-repository/project_repository.rb
|
42
|
+
- lib/artisan-memory-repository/story_repository.rb
|
43
|
+
- lib/artisan-memory-repository/user_repository.rb
|
44
|
+
homepage: http://8thlight.com
|
45
|
+
licenses: []
|
46
|
+
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 4406370865731914395
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.8.24
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Artisan Memory Repository
|
74
|
+
test_files: []
|
75
|
+
|