materialize 0.1.0 → 0.2.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: ece564378dce98ebedc05d3f6f4c867a3abaf196
4
- data.tar.gz: cd20d6c4397520caf2a05d494b0644b360bb0f6e
3
+ metadata.gz: 55807b52a48599cec295368ba920296c197aeaf5
4
+ data.tar.gz: ae3d14f8536666bbc8d0465e2c26c40870aea6e8
5
5
  SHA512:
6
- metadata.gz: a38ee94c2807f5fc1316c3a75cc1a6f028d1fb4b1a2117f9f6addf102ddc67a20804e45d7130b96e4b10513ef566e8907031e6c921ca5dc97d2539fb27037382
7
- data.tar.gz: bb08c71177f348fc485f52924528779da145602a749b986a3da60ed22c22a02044b07b4e911956133fc4fcbeb8666fe689a18895ae1ab5a68d8ae6591730019c
6
+ metadata.gz: 0d5517a157f484dace8f31136b7505b9adbcb49b45d04ad3b2a37679c670648aaffe6df9a6cb022dc44d4a0a99138a7a70ea33441a687660ceab2528af4ef5ba
7
+ data.tar.gz: e68e581d0988f59b0a7f1971ba636342019888283d5bb5bca280ca993cec858972032da43e20734d1990d8ddaca663acd1c6d31680b246707ed803160fff3083
data/.DS_Store ADDED
Binary file
@@ -0,0 +1,35 @@
1
+ module Materialize
2
+ class BaseBuilder
3
+ class << self
4
+
5
+ def build(data, repo, options)
6
+ entity_class.new(data)
7
+ end
8
+
9
+ def build_all(data, repo, options)
10
+ entity_class.wrap(data)
11
+ end
12
+
13
+ def concurrent(*lambdas)
14
+ threads = []
15
+ lambdas.each do |l|
16
+ threads << Thread.new do
17
+ l.()
18
+ end
19
+ end
20
+ threads.each(&:join)
21
+ end
22
+
23
+ def entity_class
24
+ "Entities::#{entity_base_class_name}".split('::').reduce(Module, :const_get)
25
+ end
26
+
27
+ private
28
+
29
+ def entity_base_class_name
30
+ "#{self.name[0..-8]}".split('::').last
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
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
+ module Materialize
6
+ class Entity
7
+
8
+ def self.wrap(entities_data)
9
+ entities_data.map { |entity_data| new(entity_data) }
10
+ end
11
+
12
+ def initialize(attributes)
13
+ raise "Attributes must be a hash" unless attributes.is_a?(Hash)
14
+
15
+ attributes.each_pair do |key, value|
16
+ instance_variable_set("@#{key}", value)
17
+
18
+ (class << self; self; end).class_eval do
19
+ attr_reader key.to_sym
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,81 @@
1
+ module Materialize
2
+ class Repo
3
+
4
+ attr_reader :token
5
+
6
+ def initialize(token = nil)
7
+ @token = token
8
+ end
9
+
10
+ def method_missing(query, *args, &block)
11
+ data_source_class = args[0]
12
+ options = args[1] || {}
13
+ args_to_pass = options[:args]
14
+
15
+ data, builder_class = process(data_source_class, query, args_to_pass)
16
+ options.delete(:args)
17
+
18
+ if data.is_a?(Array)
19
+ builder_class.build_all(data, self, options)
20
+ else
21
+ builder_class.build(data, self, options)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def process(data_source_class, query, args_to_pass)
28
+ data = get_data(data_source_class, query, args_to_pass)
29
+ builder_class = builder_class_for builder_class_name_for base_class_name_for data_source_class
30
+ return data, builder_class
31
+ end
32
+
33
+ def builder_class_for(builder_class_name)
34
+ if class_exists?(builder_class_name)
35
+ Module.const_get(builder_class_name)
36
+ else
37
+ Object.const_set(builder_class_name, Class.new(Materialize::BaseBuilder))
38
+ end
39
+ end
40
+
41
+ def builder_class_name_for(base_class_name)
42
+ "#{base_class_name}Builder"
43
+ end
44
+
45
+ def base_class_name_for(data_source_class)
46
+ data_source_class.name.split('::').last
47
+ end
48
+
49
+ def get_data(data_source_class, query, args_to_pass)
50
+ if token.nil?
51
+
52
+ if args_to_pass.nil?
53
+ data_source_class.send(query)
54
+ elsif args_to_pass.is_a?(Array)
55
+ data_source_class.send(query, *args_to_pass)
56
+ else
57
+ data_source_class.send(query, args_to_pass)
58
+ end
59
+
60
+ else
61
+
62
+ if args_to_pass.nil?
63
+ data_source_class.send(query, token)
64
+ elsif args_to_pass.is_a?(Array)
65
+ data_source_class.send(query, token, *args_to_pass)
66
+ else
67
+ data_source_class.send(query, token, args_to_pass)
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ def class_exists?(class_name)
74
+ klass = Module.const_get(class_name)
75
+ return klass.is_a?(Class)
76
+ rescue NameError
77
+ return false
78
+ end
79
+
80
+ end
81
+ end
@@ -1,3 +1,3 @@
1
1
  module Materialize
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/materialize.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require "materialize/version"
2
+ require "materialize/entity"
3
+ require "materialize/base_builder"
4
+ require "materialize/repo"
2
5
 
3
6
  module Materialize
4
7
  # Your code goes here...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: materialize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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-20 00:00:00.000000000 Z
11
+ date: 2017-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,6 +59,7 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".DS_Store"
62
63
  - ".gitignore"
63
64
  - ".rspec"
64
65
  - ".travis.yml"
@@ -69,6 +70,9 @@ files:
69
70
  - bin/console
70
71
  - bin/setup
71
72
  - lib/materialize.rb
73
+ - lib/materialize/base_builder.rb
74
+ - lib/materialize/entity.rb
75
+ - lib/materialize/repo.rb
72
76
  - lib/materialize/version.rb
73
77
  - materialize.gemspec
74
78
  homepage: http://bluebear.io