materialize 0.2.6 → 0.3.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: 2d3c35112a52f54064b134de43a682a32e6e3b6b
4
- data.tar.gz: 4316b68d51a8e4f41555ae602fe81f87d83d2493
3
+ metadata.gz: 39d67c12cf8e34e0ac2c0d2c1b4ad850eb3c80aa
4
+ data.tar.gz: ef3341c77054ea5b855400b45cb7e7e8b6e39563
5
5
  SHA512:
6
- metadata.gz: 5742f7c7a8a3b6127b9a7540c94f781063213481244c6dbe833ca4a27b9bc8e73efbe9e3c8af6388f8ed8bb961620e2d2d048be91fcf5fdd0394bc36e4d5b610
7
- data.tar.gz: e263942bc017d88bdcc6fd197c3b43930aadcd2596a6609b588c9f6199a25ccf1908d40db7749e4529f565f42a46712554fb7d383ffab38e8fb6d9dbfc20a370
6
+ metadata.gz: 27aae64c6eff10853db633a665e46509ee67b979827bb0d912e7f09c5dc650b581b592ab257766e24307e9ed7dad9abc2009ade7a010f43e1b1e97dc2d6bf094
7
+ data.tar.gz: fbb18af77707515cd3bc2c9622516b4f4c6ad64b3a7c1a0d36667ae92717ca225539dbaf1151150a0bdf02e29d6ec9c541b216f169c5aff0280c0838f48ac4ea
data/.gitignore CHANGED
@@ -7,3 +7,6 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ .idea/
12
+ materialize.iml
@@ -4,11 +4,11 @@ module Materialize
4
4
  class << self
5
5
 
6
6
  def build(data, repo, options)
7
- entity_class.new(data)
7
+ attach_builder_info(entity_class.new(data), repo, options)
8
8
  end
9
9
 
10
10
  def build_all(data, repo, options)
11
- entity_class.wrap(data)
11
+ entity_class.wrap(data).map { |entity| attach_builder_info(entity, repo, options) }
12
12
  end
13
13
 
14
14
  def entity_class
@@ -17,6 +17,11 @@ module Materialize
17
17
 
18
18
  private
19
19
 
20
+ def attach_builder_info(entity, repo, options)
21
+ entity.__builder_info__ = { repo: repo, options: options }
22
+ entity
23
+ end
24
+
20
25
  def entity_base_class_name
21
26
  "#{self.name[0..-8]}".split('::').last
22
27
  end
@@ -1,25 +1,80 @@
1
- # To test:
2
- # 1. Should be able to add extra arguments after attributes in a subclass
3
- # 2. Should throw an error if hash is not provided as FIRST argument
4
-
5
1
  module Materialize
6
2
  class Entity
3
+ include Utils
7
4
 
8
5
  def self.wrap(entities_data)
9
6
  entities_data.map { |entity_data| new(entity_data) }
10
7
  end
11
8
 
9
+ attr_writer :__builder_info__
10
+
12
11
  def initialize(attributes)
13
12
  raise "Attributes must be a hash" unless attributes.is_a?(Hash)
14
13
 
15
14
  attributes.each_pair do |key, value|
15
+ value = attempt_entity_conversion(key, value) if collection?(value)
16
16
  instance_variable_set("@#{key}", value)
17
-
18
17
  (class << self; self; end).class_eval do
19
18
  attr_reader key.to_sym
20
19
  end
21
20
  end
22
21
  end
23
22
 
23
+ private
24
+
25
+ # START REMARKS ---->
26
+
27
+ # These are here to allow for nested data coming from a data source via a repo.
28
+ # e.g.
29
+ # blog_post = {
30
+ # id: 1,
31
+ # title: 'TDD is dead (wait, what?)'
32
+ # ...
33
+ # comments: [...]
34
+ # }
35
+ #
36
+ # In this case, we need to queue a builder, which requires a repo and options (see repo & builder classes).
37
+ # WARNING:
38
+ # This should be avoided for deeply nested data, especially when the leaves look up extra data!
39
+
40
+
41
+ def __builder_info__
42
+ @__builder_info__ ||= {}
43
+ end
44
+
45
+ def repo
46
+ __builder_info__[:repo]
47
+ end
48
+
49
+ def options
50
+ __builder_info__[:options]
51
+ end
52
+
53
+ # ----> END REMARKS
54
+
55
+ def collection?(value)
56
+ value.is_a? Enumerable
57
+ end
58
+
59
+ def attempt_entity_conversion(key, value)
60
+ if class_exists?(covert_to_entity_class_name(key))
61
+ Module.const_get(builder_class_name_for(key)).build_all(value, repo, options)
62
+ else
63
+ value
64
+ end
65
+ end
66
+
67
+ def covert_to_entity_class_name(key)
68
+ "Entities::#{base_name_for(key)}"
69
+ end
70
+
71
+ def builder_class_name_for(key)
72
+ "#{base_name_for(key)}Builder"
73
+ end
74
+
75
+ def base_name_for(key)
76
+ key.to_s.singularize.split('_').collect(&:capitalize).join
77
+ end
78
+
24
79
  end
25
80
  end
@@ -1,5 +1,6 @@
1
1
  module Materialize
2
2
  class Repo
3
+ include Utils
3
4
 
4
5
  attr_reader :token
5
6
 
@@ -72,12 +73,5 @@ module Materialize
72
73
  end
73
74
  end
74
75
 
75
- def class_exists?(class_name)
76
- klass = Module.const_get(class_name)
77
- return klass.is_a?(Class)
78
- rescue NameError
79
- return false
80
- end
81
-
82
76
  end
83
77
  end
@@ -0,0 +1,8 @@
1
+ module Utils
2
+ def class_exists?(class_name)
3
+ klass = Module.const_get(class_name)
4
+ return klass.is_a?(Class)
5
+ rescue NameError
6
+ return false
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module Materialize
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/materialize.rb CHANGED
@@ -1,4 +1,6 @@
1
+ require "active_support/inflector"
1
2
  require "materialize/version"
3
+ require "materialize/utils"
2
4
  require "materialize/entity"
3
5
  require "materialize/concurrent"
4
6
  require "materialize/response"
Binary file
data/materialize.gemspec CHANGED
@@ -30,7 +30,10 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
+ spec.add_dependency "activesupport", "~> 5.0"
34
+
33
35
  spec.add_development_dependency "bundler", "~> 1.13"
34
36
  spec.add_development_dependency "rake", "~> 10.0"
35
37
  spec.add_development_dependency "rspec", "~> 3.0"
38
+ spec.add_development_dependency "pry"
36
39
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: materialize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Fiser
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-23 00:00:00.000000000 Z
11
+ date: 2017-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  description: This is the description
56
84
  email:
57
85
  - stephen@bluebear.io
@@ -77,7 +105,9 @@ files:
77
105
  - lib/materialize/entity.rb
78
106
  - lib/materialize/repo.rb
79
107
  - lib/materialize/response.rb
108
+ - lib/materialize/utils.rb
80
109
  - lib/materialize/version.rb
110
+ - materialize-0.2.6.gem
81
111
  - materialize.gemspec
82
112
  homepage: http://bluebear.io
83
113
  licenses: