backframe 0.0.49 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +16 -0
  3. data/.gitignore +2 -2
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +1156 -0
  6. data/Gemfile +9 -13
  7. data/README.md +133 -4
  8. data/Rakefile +3 -7
  9. data/backframe.gemspec +10 -11
  10. data/circle.yml +5 -2
  11. data/lib/backframe.rb +21 -34
  12. data/lib/backframe/mime.rb +4 -0
  13. data/lib/backframe/query.rb +48 -0
  14. data/lib/backframe/query/sort.rb +29 -0
  15. data/lib/backframe/railtie.rb +1 -16
  16. data/lib/backframe/response.rb +60 -0
  17. data/lib/backframe/response/adapter/csv.rb +39 -0
  18. data/lib/backframe/response/adapter/json.rb +53 -0
  19. data/lib/backframe/response/adapter/xlsx.rb +41 -0
  20. data/lib/backframe/response/adapter/xml.rb +37 -0
  21. data/lib/backframe/response/collection.rb +43 -0
  22. data/lib/backframe/response/fields.rb +62 -0
  23. data/lib/backframe/response/record.rb +38 -0
  24. data/lib/backframe/service.rb +60 -0
  25. data/lib/backframe/service/result/base.rb +24 -0
  26. data/lib/backframe/service/result/failure.rb +21 -0
  27. data/lib/backframe/service/result/success.rb +21 -0
  28. data/lib/backframe/version.rb +1 -1
  29. data/spec/fixtures/active_record.rb +22 -0
  30. data/spec/fixtures/models.rb +25 -0
  31. data/spec/fixtures/queries.rb +28 -0
  32. data/spec/fixtures/seeds.rb +12 -0
  33. data/spec/fixtures/serializers.rb +23 -0
  34. data/spec/fixtures/services.rb +26 -0
  35. data/spec/query/sort_spec.rb +47 -0
  36. data/spec/query_spec.rb +63 -0
  37. data/spec/response/adapter/csv_spec.rb +47 -0
  38. data/spec/response/adapter/json_spec.rb +66 -0
  39. data/spec/response/adapter/xlsx_spec.rb +59 -0
  40. data/spec/response/adapter/xml_spec.rb +63 -0
  41. data/spec/response/fields_spec.rb +45 -0
  42. data/spec/response/record_spec.rb +45 -0
  43. data/spec/response_spec.rb +153 -0
  44. data/spec/service/result/failure_spec.rb +16 -0
  45. data/spec/service/result/sucess_spec.rb +17 -0
  46. data/spec/service_spec.rb +16 -0
  47. data/spec/spec_helper.rb +15 -52
  48. metadata +78 -81
  49. data/lib/backframe/actioncontroller/acts_as_activation.rb +0 -70
  50. data/lib/backframe/actioncontroller/acts_as_api.rb +0 -39
  51. data/lib/backframe/actioncontroller/acts_as_api/adapter.rb +0 -53
  52. data/lib/backframe/actioncontroller/acts_as_api/errors.rb +0 -48
  53. data/lib/backframe/actioncontroller/acts_as_api/headers.rb +0 -11
  54. data/lib/backframe/actioncontroller/acts_as_api/page.rb +0 -181
  55. data/lib/backframe/actioncontroller/acts_as_reset.rb +0 -86
  56. data/lib/backframe/actioncontroller/acts_as_resource.rb +0 -92
  57. data/lib/backframe/actioncontroller/acts_as_resource/actions.rb +0 -100
  58. data/lib/backframe/actioncontroller/acts_as_session.rb +0 -80
  59. data/lib/backframe/activerecord/acts_as_activable.rb +0 -50
  60. data/lib/backframe/activerecord/acts_as_distinct.rb +0 -49
  61. data/lib/backframe/activerecord/acts_as_enum.rb +0 -62
  62. data/lib/backframe/activerecord/acts_as_orderable.rb +0 -40
  63. data/lib/backframe/activerecord/acts_as_percent.rb +0 -46
  64. data/lib/backframe/activerecord/acts_as_phone.rb +0 -59
  65. data/lib/backframe/activerecord/acts_as_user.rb +0 -101
  66. data/lib/backframe/activerecord/default_values.rb +0 -32
  67. data/lib/backframe/activerecord/filter_sort.rb +0 -79
  68. data/lib/backframe/activerecord/migration.rb +0 -25
  69. data/lib/backframe/image_cache/image_cache.rb +0 -45
  70. data/lib/backframe/image_cache/lib/asset.rb +0 -109
  71. data/lib/backframe/image_cache/lib/cache.rb +0 -67
  72. data/lib/backframe/image_cache/lib/conversions.rb +0 -132
  73. data/lib/backframe/models/activation.rb +0 -60
  74. data/lib/backframe/models/activity.rb +0 -40
  75. data/lib/backframe/models/reset.rb +0 -59
  76. data/lib/backframe/models/story.rb +0 -9
  77. data/lib/backframe/serializers/activity_serializer.rb +0 -44
  78. data/spec/backframe/acts_as_api_spec.rb +0 -225
  79. data/spec/backframe/acts_as_resource_spec.rb +0 -178
  80. data/spec/support/example_factory.rb +0 -9
  81. data/spec/support/example_serializer.rb +0 -3
  82. data/spec/support/schema.rb +0 -8
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ module Adapter
8
+
9
+ class Csv
10
+
11
+ class << self
12
+
13
+ def render(collection, fields, separator = ",")
14
+ records = []
15
+ labels = []
16
+ fields.array.each do |field|
17
+ labels << field[:label]
18
+ end
19
+ records << labels.join(separator)
20
+ collection.records.each do |item|
21
+ serialized = ActiveModelSerializers::SerializableResource.new(item).serializable_hash
22
+ record = []
23
+ fields.array.each do |field|
24
+ record << Backframe::Response::Record.get_value(serialized, field[:key])
25
+ end
26
+ records << record.join(separator)
27
+ end
28
+ records.join("\n")
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ module Adapter
8
+
9
+ class Json
10
+
11
+ class << self
12
+
13
+ def render(collection, fields)
14
+ data = {
15
+ records: [],
16
+ total_records: collection.total_records,
17
+ current_page: collection.current_page,
18
+ total_pages: collection.total_pages
19
+ }
20
+ collection.records.each do |item|
21
+ serialized = ActiveModelSerializers::SerializableResource.new(item).serializable_hash
22
+ if fields.any?
23
+ record = {}
24
+ fields.array.each do |field|
25
+ obj = record
26
+ parts = field[:key].split(".")
27
+ value = Backframe::Response::Record.get_value(serialized, field[:key])
28
+ parts.each_with_index do |part, index|
29
+ if index == parts.size - 1
30
+ obj[part.to_sym] = value
31
+ else
32
+ obj[part.to_sym] ||= {}
33
+ obj = obj[part.to_sym]
34
+ end
35
+ end
36
+ end
37
+ data[:records] << record
38
+ else
39
+ data[:records] << serialized
40
+ end
41
+ end
42
+ data
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ module Adapter
8
+
9
+ class Xlsx
10
+
11
+ class << self
12
+
13
+ def render(collection, fields)
14
+ filename = SecureRandom.hex(32).to_s.upcase[0,16]
15
+ workbook = WriteXLSX.new(filename)
16
+ worksheet = workbook.add_worksheet
17
+ fields.array.each_with_index do |field, i|
18
+ worksheet.write_string(0, i, field[:label])
19
+ end
20
+ collection.records.each_with_index do |item, i|
21
+ serialized = ActiveModelSerializers::SerializableResource.new(item).serializable_hash
22
+ fields.array.each_with_index do |field, j|
23
+ value = Backframe::Response::Record.get_value(serialized, field[:key])
24
+ worksheet.write_string((i + 1), j, value.to_s)
25
+ end
26
+ end
27
+ workbook.close
28
+ output = open(filename).read
29
+ File.unlink(filename)
30
+ output
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ module Adapter
8
+
9
+ class Xml
10
+
11
+ class << self
12
+
13
+ def render(collection, fields)
14
+ output = '<?xml version="1.0"?>'
15
+ output += "<records>"
16
+ collection.records.each do |item|
17
+ serialized = ActiveModelSerializers::SerializableResource.new(item).serializable_hash
18
+ output += "<record>"
19
+ fields.array.each do |field|
20
+ value = Backframe::Response::Record.get_value(serialized, field[:key])
21
+ output += "<#{field[:key]}>#{value}</#{field[:key]}>"
22
+ end
23
+ output += "</record>"
24
+ end
25
+ output += "</records>"
26
+ output
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ class Collection
8
+
9
+ def initialize(collection, page, per_page)
10
+ @collection = collection
11
+ @page = page
12
+ @per_page = per_page
13
+ end
14
+
15
+ def total_records
16
+ @collection.count
17
+ end
18
+
19
+ def total_pages
20
+ @page ? (total_records / @per_page.to_f).ceil : 1
21
+ end
22
+
23
+ def current_page
24
+ @page ? [total_pages, @page.to_i].min : 1
25
+ end
26
+
27
+ def limit
28
+ @page ? @per_page : total_records
29
+ end
30
+
31
+ def offset
32
+ @page ? limit * (@page - 1) : 0
33
+ end
34
+
35
+ def records
36
+ @page ? @collection.limit(limit).offset(offset) : @collection.all
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ class Fields
8
+
9
+ def initialize(collection, fields)
10
+ @collection = collection
11
+ @fields = fields
12
+ end
13
+
14
+ def any?
15
+ !@fields.nil?
16
+ end
17
+
18
+ def array
19
+ return @array if defined?(@array)
20
+ hash = ActiveModelSerializers::SerializableResource.new(@collection.first).serializable_hash
21
+ keys = keys(hash)
22
+ @array = []
23
+ if @fields.nil?
24
+ keys.each do |key|
25
+ @array << { label: key, key: key }
26
+ end
27
+ else
28
+ @fields.split(",").each do |token|
29
+ field = nil
30
+ if token =~ /([\w\s]*):([\w\s\.]*)/
31
+ field = { label: $1.strip, key: $2.strip }
32
+ elsif token =~ /([\w\s\.]*)/
33
+ field = { label: $1.strip, key: $1.strip }
34
+ end
35
+ if keys.include?(field[:key])
36
+ @array << field
37
+ end
38
+ end
39
+ end
40
+ @array
41
+ end
42
+
43
+ private
44
+
45
+ def keys(hash, prefix = '')
46
+ keys = []
47
+ hash.each do |key, value|
48
+ fullkey = (!prefix.empty?) ? "#{prefix}.#{key}" : key
49
+ if value.is_a?(Hash)
50
+ keys.concat(keys(value, fullkey))
51
+ else
52
+ keys << fullkey.to_s
53
+ end
54
+ end
55
+ keys
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Response
6
+
7
+ class Record
8
+
9
+ class << self
10
+
11
+ def get_value(record, path)
12
+ path = cast_path(path)
13
+ index = 0
14
+ length = path.length
15
+ while record != nil && index < length
16
+ record = record.with_indifferent_access[path[index]]
17
+ index += 1
18
+ end
19
+ record
20
+ end
21
+
22
+ def cast_path(path)
23
+ if path.is_a?(String)
24
+ path.split(".")
25
+ elsif path.is_a?(Symbol)
26
+ path.to_s.split(".")
27
+ elsif path.is_a?(Array)
28
+ path
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Service
6
+
7
+ class << self
8
+
9
+ def build(*args)
10
+ new(*args)
11
+ end
12
+
13
+ def perform(*args)
14
+ service = build(*args)
15
+
16
+ message = nil
17
+ errors = {}
18
+ result = nil
19
+
20
+ ActiveRecord::Base.transaction do
21
+ begin
22
+ result = service.perform
23
+ rescue StandardError => e
24
+ message = e.message
25
+ # errors = e.errors
26
+ service.before_rollback
27
+ raise ActiveRecord::Rollback
28
+ end
29
+ service.before_commit
30
+ end
31
+
32
+ if message.nil?
33
+ service.after_commit
34
+ else
35
+ service.after_rollback
36
+ end
37
+
38
+ return (message.present?) ? Result::Failure.new(message: message, errors: errors) : Result::Success.new(result)
39
+ end
40
+
41
+ end
42
+
43
+ def perform
44
+ end
45
+
46
+ def before_rollback
47
+ end
48
+
49
+ def after_rollback
50
+ end
51
+
52
+ def before_commit
53
+ end
54
+
55
+ def after_commit
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Service
6
+
7
+ module Result
8
+
9
+ class Base
10
+
11
+ def initialize(*args)
12
+ args[0].each do |key, val|
13
+ self.class.send(:attr_accessor, key)
14
+ self.instance_variable_set("@#{key}", val)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Service
6
+
7
+ module Result
8
+
9
+ class Failure < Base
10
+
11
+ def success?
12
+ false
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Backframe
4
+
5
+ class Service
6
+
7
+ module Result
8
+
9
+ class Success < Base
10
+
11
+ def success?
12
+ true
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end