materialize 0.2.6 → 0.3.0

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.
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: