dynalist 0.1.0 → 1.0.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
  SHA256:
3
- metadata.gz: d124a82db425c9eb3194983abae15a87d28afe80704450d0d973cda679898c62
4
- data.tar.gz: 52bf85b0e9f963e747814634105067df6d44d13206a572b00e769f6da29698b3
3
+ metadata.gz: 4b14867d776bec71831858f2f35e74e09c2e47b626aefef877de2116f3b72f41
4
+ data.tar.gz: 25bb283e5c407ac1fa7e4fc60534fc4fedf9971a6fe52cab9ae5b6b0ae3eb28a
5
5
  SHA512:
6
- metadata.gz: 382c029288d91f0a6b1ad56380e2118160ee36ad683081c7281618b04170e34a180b8793b32e983ab690d028b51072fb3ee1edb4cfc245e16bff6a791f9c9d2f
7
- data.tar.gz: dd0677a7b895c253ba50d1d59047d54257ed78bc62ebdb0e21c08aa02a68def702c5abefeea907f83eb9043c1b38ec6dcf0f906b3926357192dbc5fb84a001c5
6
+ metadata.gz: 168ff6b9e3f821f49a64daa0c4750ac2ede8ee1c39e6407545f3505eea8e2b0fead70ecccb6d681f3b0aa36199ecec5965fd302ecc4ed7b23a6e5452b7f328dc
7
+ data.tar.gz: 672fa7e84b6634390f1fb9217c1c13c44d0e5ef24eb89b13dcfcb34b0fd722fc96a51be194ef447a285c2ce1c0a0b971c0e72e6c244224a77868f18bdfe39131
data/.gitignore CHANGED
@@ -10,4 +10,4 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
  /vendor/
13
- .env
13
+ .env
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dynalist (0.1.0)
4
+ dynalist (1.0.0)
5
5
  faraday
6
6
 
7
7
  GEM
@@ -9,6 +9,8 @@ GEM
9
9
  specs:
10
10
  addressable (2.7.0)
11
11
  public_suffix (>= 2.0.2, < 5.0)
12
+ byebug (11.0.1)
13
+ coderay (1.1.2)
12
14
  crack (0.4.3)
13
15
  safe_yaml (~> 1.0.0)
14
16
  diff-lcs (1.3)
@@ -16,7 +18,14 @@ GEM
16
18
  faraday (0.16.1)
17
19
  multipart-post (>= 1.2, < 3)
18
20
  hashdiff (1.0.0)
21
+ method_source (0.9.2)
19
22
  multipart-post (2.1.1)
23
+ pry (0.12.2)
24
+ coderay (~> 1.1.0)
25
+ method_source (~> 0.9.0)
26
+ pry-byebug (3.7.0)
27
+ byebug (~> 11.0)
28
+ pry (~> 0.10)
20
29
  public_suffix (4.0.1)
21
30
  rake (10.5.0)
22
31
  rspec (3.8.0)
@@ -46,6 +55,7 @@ DEPENDENCIES
46
55
  bundler
47
56
  dotenv
48
57
  dynalist!
58
+ pry-byebug
49
59
  rake
50
60
  rspec
51
61
  vcr
@@ -31,5 +31,6 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "vcr"
32
32
  spec.add_development_dependency "webmock"
33
33
  spec.add_development_dependency "dotenv"
34
+ spec.add_development_dependency "pry-byebug"
34
35
  spec.add_dependency "faraday"
35
36
  end
@@ -3,9 +3,17 @@ require 'faraday'
3
3
  require "dynalist/version"
4
4
  require "dynalist/node"
5
5
  require "dynalist/node_tree"
6
+ require "dynalist/base_file"
7
+ require "dynalist/file_tree"
8
+ require "dynalist/document"
9
+ require "dynalist/folder"
6
10
  require "dynalist/base_api_client"
11
+ require "dynalist/file_api_client"
7
12
  require "dynalist/node_api_client"
8
13
 
14
+ require "dotenv"
15
+ Dotenv.load
16
+
9
17
  module Dynalist
10
18
  class Error < StandardError; end
11
19
  # Your code goes here...
@@ -2,9 +2,9 @@
2
2
  require 'json'
3
3
 
4
4
  class BaseApiClient
5
- def initialize
5
+ def initialize(token = nil)
6
6
  @conn = Faraday.new(:url => 'https://dynalist.io/')
7
7
  @base = 'api/v1/'
8
- @token = ENV['TOKEN']
8
+ @token = token || ENV['DYNALIST_TOKEN']
9
9
  end
10
10
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BaseFile
4
+ PERMISSION = {
5
+ 0 => :no_access,
6
+ 1 => :read_only,
7
+ 2 => :edit_rights,
8
+ 3 => :manage,
9
+ 4 => :owner
10
+ }
11
+
12
+ attr_reader :id, :title, :type
13
+
14
+ def initialize(id: nil, title: nil, type: nil, permission: nil)
15
+ @id = id
16
+ @title = title
17
+ @type = type
18
+ @permission_number = permission
19
+ end
20
+
21
+ def permission
22
+ PERMISSION[@permission_number]
23
+ end
24
+
25
+ def include(**query)
26
+ query.each do |key, value|
27
+ next if instance_variable_get("@#{key}") == value
28
+ return false
29
+ end
30
+
31
+ return true
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Document < BaseFile
4
+ def initialize(id: nil, title: nil, type: nil, permission: nil)
5
+ super(id: id, title: title, type: 'document', permission: permission)
6
+ end
7
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ require 'json'
3
+
4
+ class FileApiClient < BaseApiClient
5
+ def get_file
6
+ response = @conn.post "#{@base}file/list", {token: @token}.to_json
7
+ json = JSON.parse(response.body, symbolize_names: true)
8
+ FileTree.instance.root_id = json[:root_file_id]
9
+ json[:files].map do |file|
10
+ instance = if file[:type] == 'folder'
11
+ Folder.new(file)
12
+ else
13
+ Document.new(file)
14
+ end
15
+ FileTree.add(instance)
16
+
17
+ instance
18
+ end
19
+ end
20
+
21
+ def move_file(queries)
22
+ changes = queries.map(&:to_query)
23
+ response = @conn.post "#{@base}file/edit", {token: @token, changes: changes}.to_json
24
+ JSON.parse(response.body)["results"]
25
+ end
26
+
27
+ class Edit
28
+ def initialize(file, title)
29
+ @file = file
30
+ @title = title
31
+ end
32
+
33
+ def to_query
34
+ {
35
+ action: "edit",
36
+ type: @file.type,
37
+ file_id: @file.id,
38
+ title: @title
39
+ }
40
+ end
41
+ end
42
+
43
+ class Move
44
+ def initialize(file, parent_file, index: 0)
45
+ @file = file
46
+ @parent_file = parent_file
47
+ @index = index
48
+ end
49
+
50
+ def to_query
51
+ {
52
+ action: "move",
53
+ type: @file.type,
54
+ file_id: @file.id,
55
+ parent_id: @parent_file.id,
56
+ index: @index
57
+ }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+
5
+ class FileTree
6
+ include Singleton
7
+
8
+ @@files = []
9
+ @@root_id = nil
10
+
11
+ def root_id=(root_id)
12
+ @@root_id = root_id
13
+ end
14
+
15
+ def root_id
16
+ @@root_id
17
+ end
18
+
19
+ def files
20
+ @@files
21
+ end
22
+
23
+ def self.clear
24
+ @@files = []
25
+ end
26
+
27
+ def self.add(files)
28
+ @@files << files
29
+ @@files.flatten!
30
+ end
31
+
32
+ def self.find_by(**query)
33
+ @@files.find { |file| file.include(**query) }
34
+ end
35
+
36
+ def self.where(**query)
37
+ @@files.select do |file|
38
+ query.all? do |key, value|
39
+ if value.kind_of? Array
40
+ value.any? { |v| file.include(**{key => v}) }
41
+ else
42
+ file.include(**{key => value})
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Folder < BaseFile
4
+ def initialize(id: nil, title: nil, type: nil, permission: nil, collapsed: false, children: [])
5
+ @collapsed = collapsed
6
+ @children_ids = children
7
+ super(id: id, title: title, type: 'folder', permission: permission)
8
+ end
9
+
10
+ def collapsed?
11
+ @collapsed
12
+ end
13
+
14
+ def children
15
+ FileTree.where(id: @children_ids)
16
+ end
17
+ end
@@ -11,11 +11,11 @@ class Node
11
11
  6 => :purple
12
12
  }.freeze
13
13
 
14
- attr_reader :document_id, :id, :content, :note, :children, :checked, :checkbox, :heading
14
+ attr_reader :file_id, :node_id, :content, :note, :children, :checked, :checkbox, :heading
15
15
 
16
- def initialize(document_id: nil, id: nil, content: nil, note: nil, created: nil, modified: nil, children: [], checked: false, checkbox: false, heading: 0, color: 0)
17
- @document_id = document_id
18
- @id = id
16
+ def initialize(file_id: nil, id: nil, content: nil, note: nil, created: nil, modified: nil, children: [], checked: false, checkbox: false, heading: 0, color: 0)
17
+ @file_id = file_id
18
+ @node_id = id
19
19
  @content = content
20
20
  @note = note
21
21
  @created = created
@@ -49,7 +49,13 @@ class Node
49
49
  end
50
50
 
51
51
  def children
52
- NodeTree.where(id: @children_ids)
52
+ NodeTree.where(node_id: @children_ids)
53
+ end
54
+
55
+ def attributes
56
+ instance_variables.map do |key|
57
+ [key[1..-1].to_sym, instance_variable_get(key)]
58
+ end.to_h
53
59
  end
54
60
 
55
61
  private
@@ -2,7 +2,81 @@
2
2
  require 'json'
3
3
 
4
4
  class NodeApiClient < BaseApiClient
5
- def get_file_list
6
- @conn.post "#{@base}file/list", {token: @token}.to_json
5
+ def read(document)
6
+ res = @conn.post "#{@base}doc/read", {token: @token, file_id: document.id}.to_json
7
+ JSON.parse(res.body, symbolize_names: true)[:nodes].map{ |node| node }
8
+ nodes = JSON.parse(res.body, symbolize_names: true)[:nodes].map{ |node| Node.new(node.merge(file_id: document.id)) }
9
+ NodeTree.add(nodes)
10
+ end
11
+
12
+ def check_updates(documents)
13
+ document_ids = documents.map(&:id)
14
+ res = @conn.post "#{@base}doc/check_for_updates", {token: @token, file_ids: document_ids}.to_json
15
+ JSON.parse(res.body, symbolize_names: true)[:versions]
16
+ end
17
+
18
+ def edit(document, queries)
19
+ changes = queries.map(&:to_query)
20
+ res = @conn.post "#{@base}doc/edit", {token: @token, file_id: document.id, changes: changes}.to_json
21
+ JSON.parse(res.body, symbolize_names: true)[:new_node_ids]
22
+ end
23
+
24
+ class Insert
25
+ def initialize(parent_node, node, index = 0)
26
+ @parent_node = parent_node
27
+ @node = node
28
+ @index = index
29
+ end
30
+
31
+ def to_query
32
+ {
33
+ action: "insert",
34
+ parent_id: @parent_node.node_id,
35
+ index: @index
36
+ }.merge(@node.attributes)
37
+ end
38
+ end
39
+
40
+ class Edit
41
+ def initialize(node)
42
+ @node = node
43
+ end
44
+
45
+ def to_query
46
+ {
47
+ action: "edit",
48
+ node_id: @node.node_id
49
+ }.merge(@node.attributes)
50
+ end
51
+ end
52
+
53
+ class Move
54
+ def initialize(parent_node, node, index = 0)
55
+ @parent_node = parent_node
56
+ @node = node
57
+ @index = index
58
+ end
59
+
60
+ def to_query
61
+ {
62
+ action: "move",
63
+ parent_id: @parent_node.node_id,
64
+ node_id: @node.node_id,
65
+ index: @index
66
+ }
67
+ end
68
+ end
69
+
70
+ class Delete
71
+ def initialize(node)
72
+ @node = node
73
+ end
74
+
75
+ def to_query
76
+ {
77
+ action: "delete",
78
+ node_id: @node.node_id
79
+ }
80
+ end
7
81
  end
8
82
  end
@@ -7,7 +7,7 @@ class NodeTree
7
7
 
8
8
  @@nodes = []
9
9
 
10
- def nodes
10
+ def self.nodes
11
11
  @@nodes
12
12
  end
13
13
 
@@ -30,7 +30,6 @@ class NodeTree
30
30
  if value.kind_of? Array
31
31
  value.any? { |v| node.include(**{key => v}) }
32
32
  else
33
- p node.include(**{key => value})
34
33
  node.include(**{key => value})
35
34
  end
36
35
  end
@@ -1,3 +1,3 @@
1
1
  module Dynalist
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynalist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 4geru
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-29 00:00:00.000000000 Z
11
+ date: 2019-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: faraday
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -129,6 +143,11 @@ files:
129
143
  - dynalist.gemspec
130
144
  - lib/dynalist.rb
131
145
  - lib/dynalist/base_api_client.rb
146
+ - lib/dynalist/base_file.rb
147
+ - lib/dynalist/document.rb
148
+ - lib/dynalist/file_api_client.rb
149
+ - lib/dynalist/file_tree.rb
150
+ - lib/dynalist/folder.rb
132
151
  - lib/dynalist/node.rb
133
152
  - lib/dynalist/node_api_client.rb
134
153
  - lib/dynalist/node_tree.rb