social_snippet 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +11 -4
  3. data/README.md +6 -6
  4. data/Rakefile +19 -1
  5. data/lib/social_snippet.rb +11 -0
  6. data/lib/social_snippet/api/install_repository_api.rb +23 -82
  7. data/lib/social_snippet/api/manifest_api.rb +3 -3
  8. data/lib/social_snippet/api/update_repository_api.rb +34 -35
  9. data/lib/social_snippet/command_line/sspm/sub_commands/install_command.rb +7 -7
  10. data/lib/social_snippet/config.rb +18 -8
  11. data/lib/social_snippet/core.rb +13 -0
  12. data/lib/social_snippet/document.rb +2 -0
  13. data/lib/social_snippet/document_backend.rb +2 -0
  14. data/lib/social_snippet/document_backend/yaml_document.rb +252 -0
  15. data/lib/social_snippet/document_backend/yaml_document/query.rb +45 -0
  16. data/lib/social_snippet/repository.rb +2 -2
  17. data/lib/social_snippet/repository/driver_factory.rb +42 -0
  18. data/lib/social_snippet/repository/drivers.rb +3 -2
  19. data/lib/social_snippet/repository/drivers/driver_base.rb +100 -0
  20. data/lib/social_snippet/repository/drivers/entry.rb +11 -0
  21. data/lib/social_snippet/repository/drivers/git_driver.rb +100 -0
  22. data/lib/social_snippet/repository/models.rb +15 -0
  23. data/lib/social_snippet/repository/models/package.rb +97 -0
  24. data/lib/social_snippet/repository/models/repository.rb +94 -0
  25. data/lib/social_snippet/repository/repository_manager.rb +79 -67
  26. data/lib/social_snippet/resolvers/base_resolver.rb +13 -17
  27. data/lib/social_snippet/rspec/test_document.rb +305 -0
  28. data/lib/social_snippet/rspec/test_driver.rb +76 -0
  29. data/lib/social_snippet/rspec/test_storage.rb +459 -0
  30. data/lib/social_snippet/storage.rb +1 -0
  31. data/lib/social_snippet/storage_backend.rb +3 -0
  32. data/lib/social_snippet/storage_backend/file_system_storage.rb +71 -0
  33. data/lib/social_snippet/storage_backend/storage_base.rb +35 -0
  34. data/lib/social_snippet/version.rb +8 -3
  35. data/spec/helpers/codeclimate_helper.rb +1 -1
  36. data/spec/helpers/fakefs_helper.rb +10 -0
  37. data/spec/helpers/social_snippet_helper.rb +117 -0
  38. data/spec/lib/api/insert_snippet_spec.rb +95 -2
  39. data/spec/lib/api/update_repository_spec.rb +196 -0
  40. data/spec/lib/command_line/sspm_install_spec.rb +169 -180
  41. data/spec/lib/command_line/sspm_update_spec.rb +56 -0
  42. data/spec/lib/config_spec.rb +6 -8
  43. data/spec/lib/core_spec.rb +21 -38
  44. data/spec/lib/file_system_storage_spec.rb +170 -0
  45. data/spec/lib/insert_resolver_spec.rb +15 -2
  46. data/spec/lib/registry_client_spec.rb +6 -9
  47. data/spec/lib/repository/driver_base_spec.rb +89 -0
  48. data/spec/lib/repository/git_driver_spec.rb +10 -0
  49. data/spec/lib/repository/package_spec.rb +172 -0
  50. data/spec/lib/repository/repository_factory_spec.rb +67 -22
  51. data/spec/lib/repository/repository_manager_spec.rb +71 -114
  52. data/spec/lib/repository/repository_spec.rb +191 -0
  53. data/spec/lib/yaml_document_spec.rb +14 -0
  54. data/spec/spec_helper.rb +8 -93
  55. data/test/config_test.rb +6 -7
  56. data/test/driver_base_test.rb +201 -0
  57. data/test/git_driver_test.rb +51 -0
  58. data/test/insert_snippet_test.rb +256 -349
  59. data/test/repository_manager_test.rb +7 -16
  60. data/test/yaml_document_test.rb +97 -0
  61. metadata +44 -16
  62. data/lib/social_snippet/repository/drivers/base_repository.rb +0 -189
  63. data/lib/social_snippet/repository/drivers/git_repository.rb +0 -74
  64. data/lib/social_snippet/repository/repository_factory.rb +0 -59
  65. data/lib/social_snippet/repository/repository_installer.rb +0 -85
  66. data/spec/lib/repository/base_repository_spec.rb +0 -104
  67. data/spec/lib/repository/git_repository_spec.rb +0 -83
  68. data/spec/lib/repository/repository_installer_spec.rb +0 -63
  69. data/test/base_repository_test.rb +0 -375
  70. data/test/git_repository_test.rb +0 -114
@@ -3,26 +3,39 @@ class SocialSnippet::Core
3
3
  attr_reader :input_stream
4
4
  attr_reader :output_stream
5
5
  attr_reader :repo_manager
6
+ attr_reader :driver_factory
6
7
  attr_reader :config
7
8
  attr_reader :registry_client
8
9
  attr_reader :logger
9
10
  attr_reader :api
10
11
  attr_reader :prompt
12
+ attr_reader :storage
11
13
 
12
14
  # Constructor
13
15
  def initialize(new_input_stream = STDIN, new_output_stream = STDOUT)
14
16
  @input_stream = new_input_stream
15
17
  @output_stream = new_output_stream
18
+ @storage = ::SocialSnippet::Storage.new
16
19
  @config = ::SocialSnippet::Config.new(self)
17
20
  @logger = ::SocialSnippet::Logger.new output_stream
18
21
  @prompt = ::HighLine.new(input_stream, output_stream)
19
22
  init_logger
20
23
 
24
+ init_yaml_document
25
+ ::SocialSnippet::Repository::Models::Package.core = self
26
+ ::SocialSnippet::Repository::Models::Repository.core = self
21
27
  @repo_manager = ::SocialSnippet::Repository::RepositoryManager.new(self)
28
+ @driver_factory = ::SocialSnippet::Repository::DriverFactory.new(self)
22
29
  @registry_client = ::SocialSnippet::Registry::RegistryClient.new(self)
23
30
  @api = ::SocialSnippet::Api.new(self)
24
31
  end
25
32
 
33
+ def init_yaml_document
34
+ if ::SocialSnippet::Document == ::SocialSnippet::DocumentBackend::YAMLDocument
35
+ ::SocialSnippet::DocumentBackend::YAMLDocument.set_path config.document_path
36
+ end
37
+ end
38
+
26
39
  def init_logger
27
40
  logger.level = ::SocialSnippet::Logger::Severity::INFO
28
41
  logger.level = ::SocialSnippet::Logger::Severity::DEBUG if config.debug?
@@ -0,0 +1,2 @@
1
+ class SocialSnippet::Document; end
2
+
@@ -0,0 +1,2 @@
1
+ require_relative "document_backend/yaml_document"
2
+ module SocialSnippet::DocumentBackend; end
@@ -0,0 +1,252 @@
1
+ module SocialSnippet::DocumentBackend
2
+
3
+ $yaml_document_hash = nil
4
+
5
+ class YAMLDocument
6
+
7
+ @@path = nil
8
+
9
+ require_relative "yaml_document/query"
10
+
11
+ attr_reader :path
12
+ attr_reader :fields
13
+
14
+ attr_accessor :id
15
+
16
+ def initialize(options = {}, new_id = nil)
17
+ @path = @@path
18
+ @fields = ::Hash.new
19
+ init_fields options
20
+ @id ||= new_id || self.class.uuid
21
+ end
22
+
23
+ def field_keys
24
+ self.class.field_keys
25
+ end
26
+
27
+ def field_type
28
+ self.class.field_type
29
+ end
30
+
31
+ def serialize
32
+ attrs = field_keys.inject(::Hash.new) do |attrs, key|
33
+ attrs[key] = fields[key]
34
+ attrs
35
+ end
36
+ attrs[:id] = id
37
+ attrs
38
+ end
39
+
40
+ def clone_value(val)
41
+ if val.nil?
42
+ nil
43
+ else
44
+ val.clone
45
+ end
46
+ end
47
+
48
+ def init_fields(options = {})
49
+ field_keys.each do |k|
50
+ fields[k] = clone_value(self.class.default_field[k])
51
+ end
52
+ options.each do |k, v|
53
+ fields[k] = clone_value(v)
54
+ end
55
+ end
56
+
57
+ def remove
58
+ self.class.collection.delete id
59
+ self.class.update_file!
60
+ end
61
+
62
+ def update_attributes!(attrs)
63
+ attrs.each do |key, value|
64
+ fields[key] = clone_value(value)
65
+ end
66
+ save!
67
+ end
68
+
69
+ #
70
+ # Persistence Methods
71
+ #
72
+ def save!
73
+ self.class.collection[id] = serialize
74
+ self.class.update_file!
75
+ end
76
+
77
+ def add_to_set(attrs)
78
+ attrs.each do |key, value|
79
+ fields[key].push value
80
+ fields[key].uniq!
81
+ end
82
+ save!
83
+ end
84
+
85
+ def push(attrs)
86
+ attrs.each do |key, value|
87
+ case field_type[key].to_s
88
+ when "Array"
89
+ fields[key].push value
90
+ when "Hash"
91
+ fields[key].merge! value
92
+ end
93
+ end
94
+ save!
95
+ end
96
+
97
+ def pull(attrs)
98
+ attrs.each do |key, value|
99
+ fields[key].delete value
100
+ end
101
+ save!
102
+ end
103
+
104
+ class << self
105
+
106
+ # "Callback invoked whenever a subclass of the current class is created."
107
+ # http://docs.ruby-lang.org/en/2.2.0/Class.html#method-i-inherited
108
+ def inherited(child)
109
+ load_file!
110
+ end
111
+
112
+ def yaml_document_hash
113
+ $yaml_document_hash ||= ::Hash.new
114
+ end
115
+
116
+ def reset_yaml_document_hash!
117
+ $yaml_document_hash = nil
118
+ end
119
+
120
+ def load_file!
121
+ $yaml_document_hash = ::YAML.load(::File.read path) unless path.nil?
122
+ end
123
+
124
+ def set_path(new_path)
125
+ @@path = new_path
126
+ ::FileUtils.touch(path) unless ::File.exists?(path)
127
+ end
128
+
129
+ def path
130
+ @@path
131
+ end
132
+
133
+ def update_file!
134
+ ::File.write path, yaml_document_hash.to_yaml
135
+ reset_yaml_document_hash!
136
+ load_file!
137
+ end
138
+
139
+ #
140
+ # Queries
141
+ #
142
+ def all
143
+ Query.new self, collection
144
+ end
145
+
146
+ def exists?
147
+ all.exists?
148
+ end
149
+
150
+ def count
151
+ all.count
152
+ end
153
+
154
+ def find(id)
155
+ if collection.has_key?(id)
156
+ new collection[id], id
157
+ else
158
+ raise "ERROR: document not found"
159
+ end
160
+ end
161
+
162
+ def find_by(cond)
163
+ result = collection.select do |item_key|
164
+ item = collection[item_key]
165
+ cond.keys.all? do |key|
166
+ cond[key] === item[key]
167
+ end
168
+ end
169
+
170
+ if result.empty?
171
+ raise "ERROR: document not found"
172
+ else
173
+ key, item = result.first
174
+ new item, item[:id]
175
+ end
176
+ end
177
+
178
+ def find_or_create_by(cond)
179
+ if where(cond).exists?
180
+ find_by cond
181
+ else
182
+ create cond
183
+ end
184
+ end
185
+
186
+ def where(cond)
187
+ Query.new(self, collection).find cond
188
+ end
189
+
190
+ def collection
191
+ yaml_document_hash[self.name] ||= ::Hash.new
192
+ end
193
+
194
+ def field_keys
195
+ @field_keys
196
+ end
197
+
198
+ def default_field
199
+ @default_field
200
+ end
201
+
202
+ def field_type
203
+ @field_type
204
+ end
205
+
206
+ def field(sym, options = {})
207
+ @field_keys ||= ::Set.new
208
+ @default_field ||= ::Hash.new
209
+ @field_type ||= ::Hash.new
210
+
211
+ default_field[sym] = options[:default] unless options[:default].nil?
212
+
213
+ field_keys.add sym
214
+ field_type[sym] = options[:type] || :String
215
+
216
+ # define getter
217
+ define_method sym do
218
+ @fields[sym]
219
+ end
220
+
221
+ # define setter
222
+ define_method "#{sym}=" do |v|
223
+ @fields[sym] = v
224
+ end
225
+ end
226
+
227
+ def uuid
228
+ ::SecureRandom.uuid
229
+ end
230
+
231
+ def create(options = {})
232
+ doc = new
233
+ options.each {|k, v| doc.send "#{k}=", v }
234
+ doc.id = uuid if doc.id.nil?
235
+ collection[doc.id] = doc.serialize
236
+ update_file!
237
+ doc
238
+ end
239
+
240
+ # replace self with ::SocialSnippet::Document class
241
+ def activate!
242
+ ::SocialSnippet.class_eval do
243
+ remove_const :Document
244
+ const_set :Document, YAMLDocument
245
+ end
246
+ end
247
+
248
+ end # class << self
249
+
250
+ end
251
+
252
+ end
@@ -0,0 +1,45 @@
1
+ module SocialSnippet::DocumentBackend
2
+
3
+ class YAMLDocument::Query
4
+
5
+ attr_reader :document_class
6
+ attr_reader :collection
7
+
8
+ def initialize(new_document_class, new_collection)
9
+ @document_class = new_document_class
10
+ @collection = new_collection
11
+ end
12
+
13
+ def exists?
14
+ collection.size > 0
15
+ end
16
+
17
+ def find(cond)
18
+ new_collection = collection.select do |item_id, item|
19
+ cond.all? {|k, _| cond[k] === item[k] }
20
+ end
21
+ self.class.new document_class, new_collection
22
+ end
23
+
24
+ def count
25
+ collection.length
26
+ end
27
+
28
+ def enum
29
+ collection.map do |_, item|
30
+ document_class.new item
31
+ end
32
+ end
33
+
34
+ def each(&block)
35
+ enum.each &block
36
+ end
37
+
38
+ def map(&block)
39
+ enum.map &block
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
@@ -1,6 +1,6 @@
1
1
  module SocialSnippet::Repository; end
2
2
  require_relative "repository/drivers"
3
- require_relative "repository/repository_factory"
3
+ require_relative "repository/driver_factory"
4
4
  require_relative "repository/repository_manager"
5
5
  require_relative "repository/repository_errors"
6
- require_relative "repository/repository_installer"
6
+ require_relative "repository/models"
@@ -0,0 +1,42 @@
1
+ module SocialSnippet::Repository
2
+
3
+ class DriverFactory
4
+
5
+ @@drivers = [Drivers::GitDriver]
6
+
7
+ attr_reader :core
8
+
9
+ def initialize(new_core)
10
+ @core = new_core
11
+ end
12
+
13
+ def reset_drivers
14
+ @@drivers = []
15
+ end
16
+
17
+ def add_driver(driver_class)
18
+ @@drivers.push driver_class
19
+ end
20
+
21
+ # @param url [String] The URL of repository
22
+ # @reutrn [::SocialSnippet::Repository::Drivers::DriverBase]
23
+ def clone(url)
24
+ driver = resolve_driver(url)
25
+ driver.fetch
26
+ driver
27
+ end
28
+
29
+ def resolve_driver(url)
30
+ driver_class = @@drivers.select do |driver_class|
31
+ driver_class.target? url
32
+ end.first
33
+ if driver_class.nil?
34
+ raise "ERROR: driver not found"
35
+ else
36
+ driver_class.new url
37
+ end
38
+ end
39
+
40
+ end # class << self
41
+
42
+ end # DriverFactory
@@ -1,3 +1,4 @@
1
1
  module SocialSnippet::Repository::Drivers; end
2
- require_relative "drivers/base_repository"
3
- require_relative "drivers/git_repository"
2
+ require_relative "drivers/driver_base"
3
+ require_relative "drivers/git_driver"
4
+ require_relative "drivers/entry"
@@ -0,0 +1,100 @@
1
+ module SocialSnippet::Repository
2
+
3
+ # Repository base class
4
+ # usage: class GitDriver < DriverBase
5
+ class Drivers::DriverBase
6
+
7
+ attr_reader :url
8
+
9
+ # @example
10
+ # driver = Driver.new(url, ref)
11
+ # driver.fetch
12
+ # driver.cache # => save data into storage
13
+ def initialize(new_url)
14
+ @url = new_url
15
+ end
16
+
17
+ # Returns latest version
18
+ #
19
+ # @param pattern [String] The pattern of version
20
+ # @return [String] The version
21
+ def latest_version(pattern = "")
22
+ pattern = "" if pattern.nil?
23
+ matched_versions = versions.select {|ref| ::SocialSnippet::Version.is_matched_version_pattern(pattern, ref)}
24
+ ::VersionSorter.rsort(matched_versions).first
25
+ end
26
+
27
+ # Returns all versions
28
+ #
29
+ # @return [Array<String>] All versions of repository
30
+ def versions
31
+ refs.select {|ref| ::SocialSnippet::Version.is_version(ref) }
32
+ end
33
+
34
+ def each_ref(&block)
35
+ refs.each &block
36
+ end
37
+
38
+ def has_versions?
39
+ not versions.empty?
40
+ end
41
+
42
+ def refs
43
+ raise "not implemented"
44
+ end
45
+
46
+ def snippet_json
47
+ raise "not implemented"
48
+ end
49
+
50
+ def rev_hash(ref)
51
+ raise "not implemented"
52
+ end
53
+
54
+ def current_ref
55
+ raise "not implemented"
56
+ end
57
+
58
+ def fetch
59
+ raise "not implemented"
60
+ end
61
+
62
+ def each_directory(ref)
63
+ raise "not implemented"
64
+ end
65
+
66
+ def each_file(ref)
67
+ raise "not implemented"
68
+ end
69
+
70
+ class << self
71
+
72
+ def target?(url)
73
+ if is_local_path?(url)
74
+ target_local_path?(url)
75
+ elsif is_url?(url)
76
+ target_url?(url)
77
+ end
78
+ end
79
+
80
+ def target_url?(url)
81
+ raise "not implemented"
82
+ end
83
+
84
+ def target_path?(path)
85
+ raise "not implemented"
86
+ end
87
+
88
+ def is_local_path?(s)
89
+ not /^[^:]*:\/\// === s
90
+ end
91
+
92
+ def is_url?(s)
93
+ ::URI.regexp === s
94
+ end
95
+
96
+ end
97
+
98
+ end # DriverBase
99
+
100
+ end # SocialSnippet