twenty-server 0.4.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.
Files changed (30) hide show
  1. checksums.yaml +7 -0
  2. data/lib/twenty/server/graphql/input/task_input.rb +10 -0
  3. data/lib/twenty/server/graphql/input.rb +6 -0
  4. data/lib/twenty/server/graphql/mutation/complete_task.rb +17 -0
  5. data/lib/twenty/server/graphql/mutation/create_task.rb +15 -0
  6. data/lib/twenty/server/graphql/mutation/destroy_task.rb +17 -0
  7. data/lib/twenty/server/graphql/mutation/set_random_project_color.rb +18 -0
  8. data/lib/twenty/server/graphql/mutation/update_task.rb +18 -0
  9. data/lib/twenty/server/graphql/mutation.rb +11 -0
  10. data/lib/twenty/server/graphql/schema.rb +8 -0
  11. data/lib/twenty/server/graphql/type/mutation.rb +11 -0
  12. data/lib/twenty/server/graphql/type/project.rb +11 -0
  13. data/lib/twenty/server/graphql/type/query.rb +29 -0
  14. data/lib/twenty/server/graphql/type/task.rb +16 -0
  15. data/lib/twenty/server/graphql/type/task_status.rb +10 -0
  16. data/lib/twenty/server/graphql/type.rb +12 -0
  17. data/lib/twenty/server/graphql.rb +9 -0
  18. data/lib/twenty/server/migration/1_create_projects.rb +18 -0
  19. data/lib/twenty/server/migration/2_create_tasks.rb +19 -0
  20. data/lib/twenty/server/migration/3_add_color_to_projects.rb +12 -0
  21. data/lib/twenty/server/migration.rb +25 -0
  22. data/lib/twenty/server/model/mixin/colorable_mixin.rb +32 -0
  23. data/lib/twenty/server/model/project.rb +17 -0
  24. data/lib/twenty/server/model/task.rb +32 -0
  25. data/lib/twenty/server/model.rb +12 -0
  26. data/lib/twenty/server/path.rb +31 -0
  27. data/lib/twenty/server/rack/graphql.rb +31 -0
  28. data/lib/twenty/server/rack.rb +15 -0
  29. data/share/twenty/server/schema.graphql +91 -0
  30. metadata +155 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 677398c56ecfd535bdec6de36fbb5507f441963d22efad8e29e80dc73abc77b7
4
+ data.tar.gz: 00c807ce51fae09f47c08667af8e740f69d2b141676565acfe502dfa71f2a654
5
+ SHA512:
6
+ metadata.gz: 19de180d8c0c9dfcd51a8dc27cfd6c9b12bd6fa5b40607d5cede8720c797e240d14a377a437a025ad9747e03029d15294f5880c885e0c7bee164b99712df5983
7
+ data.tar.gz: ef1b9cc9b9d74381c52b4a1d6400429485127dcfcb905258c11e63ccba7888026b94ad3c35b54a535ea41f77baabc5f4343fab72fd092c82eafa5d9b1ef50fed
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Input
4
+ class TaskInput < GraphQL::Schema::InputObject
5
+ argument :title, String, required: false
6
+ argument :content, String, required: false
7
+ argument :project_id, Int, required: false
8
+ argument :status, "Twenty::GraphQL::Type::TaskStatus", required: false
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Input
4
+ include GraphQL::Types
5
+ require_relative "input/task_input"
6
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Mutation
4
+ class CompleteTask < GraphQL::Schema::Mutation
5
+ argument :task_id, Int
6
+ field :ok, Boolean
7
+ field :errors, [String]
8
+
9
+ def resolve(task_id:)
10
+ task = Twenty::Task.find(task_id)
11
+ task.update!(status: :complete)
12
+ {ok: true, errors: []}
13
+ rescue => ex
14
+ {ok: false, errors: [ex.message]}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Mutation
4
+ class CreateTask < GraphQL::Schema::Mutation
5
+ field :errors, [String], null: false
6
+ argument :input, Twenty::GraphQL::Input::TaskInput
7
+
8
+ def resolve(input:)
9
+ Twenty::Task.create input.to_h.merge(status: :backlog)
10
+ {"errors" => []}
11
+ rescue => ex
12
+ {"errors" => [ex.message]}
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Mutation
4
+ class DestroyTask < GraphQL::Schema::Mutation
5
+ argument :task_id, Int
6
+ field :ok, Boolean
7
+ field :errors, [String]
8
+
9
+ def resolve(task_id:)
10
+ task = Twenty::Task.find(task_id)
11
+ task.destroy!
12
+ {ok: true, errors: []}
13
+ rescue => ex
14
+ {ok: false, errors: [ex.message]}
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Mutation
4
+ class SetRandomProjectColor < ::GraphQL::Schema::Mutation
5
+ argument :project_id, Int, required: true
6
+
7
+ field :errors, [String], null: false
8
+ field :project, "Twenty::GraphQL::Type::Project", null: true
9
+
10
+ def resolve(project_id:)
11
+ project = Twenty::Project.with_pk!(project_id)
12
+ project.update(color: project.random_color)
13
+ {errors: [], project:}
14
+ rescue => ex
15
+ {errors: [ex.message]}
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Mutation
4
+ class UpdateTask < GraphQL::Schema::Mutation
5
+ field :errors, [String], null: false
6
+ argument :task_id, Int
7
+ argument :input, Twenty::GraphQL::Input::TaskInput
8
+
9
+ def resolve(task_id:, input:)
10
+ Twenty::Task
11
+ .with_pk!(task_id)
12
+ .update(input.to_h)
13
+ {"errors" => []}
14
+ rescue => ex
15
+ {"errors" => [ex.message]}
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL
4
+ module Mutation
5
+ require_relative "mutation/destroy_task"
6
+ require_relative "mutation/complete_task"
7
+ require_relative "mutation/create_task"
8
+ require_relative "mutation/update_task"
9
+ require_relative "mutation/set_random_project_color"
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL
4
+ class Schema < GraphQL::Schema
5
+ query Type::Query
6
+ mutation Type::Mutation
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Type
4
+ class Mutation < GraphQL::Schema::Object
5
+ field :destroy_task, mutation: Twenty::GraphQL::Mutation::DestroyTask
6
+ field :complete_task, mutation: Twenty::GraphQL::Mutation::CompleteTask
7
+ field :create_task, mutation: Twenty::GraphQL::Mutation::CreateTask
8
+ field :update_task, mutation: Twenty::GraphQL::Mutation::UpdateTask
9
+ field :set_random_project_color, mutation: Twenty::GraphQL::Mutation::SetRandomProjectColor
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Type
4
+ class Project < GraphQL::Schema::Object
5
+ field :id, Int, null: false
6
+ field :name, String, null: false
7
+ field :path, String, null: false
8
+ field :color, String, null: false
9
+ field :tasks, "[Twenty::GraphQL::Type::Task]", null: false
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Type
4
+ class Query < GraphQL::Schema::Object
5
+ field :find_task, Task, null: true do
6
+ argument :task_id, Int
7
+ end
8
+ field :tasks, [Task], null: false do
9
+ argument :status, TaskStatus
10
+ argument :project_id, Int, required: false
11
+ end
12
+ field :projects, [Project], null: false
13
+
14
+ def find_task(task_id:)
15
+ Twenty::Task.with_pk!(task_id)
16
+ end
17
+
18
+ def tasks(status:, project_id: nil)
19
+ tasks = Twenty::Task
20
+ .by_status(status)
21
+ .order("updated_at DESC")
22
+ (project_id ? tasks.where(project_id:) : tasks).all
23
+ end
24
+
25
+ def projects
26
+ Twenty::Project.all
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Type
4
+ class Task < GraphQL::Schema::Object
5
+ field :id, Int, null: false
6
+ field :title, String, null: false
7
+ field :status, "Twenty::GraphQL::Type::TaskStatus", null: false
8
+ field :content, String, null: false
9
+ field :project, "Twenty::GraphQL::Type::Project", null: false
10
+ field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
11
+ field :is_ready, Boolean, null: false, method: :ready?
12
+ field :is_backlogged, Boolean, null: false, method: :backlog?
13
+ field :is_complete, Boolean, null: false, method: :complete?
14
+ field :in_progress, Boolean, null: false, method: :in_progress?
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL::Type
4
+ class TaskStatus < GraphQL::Schema::Enum
5
+ value :backlog
6
+ value :ready
7
+ value :in_progress
8
+ value :complete
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL
4
+ module Type
5
+ include ::GraphQL::Types
6
+ end
7
+ require_relative "type/task_status"
8
+ require_relative "type/project"
9
+ require_relative "type/task"
10
+ require_relative "type/query"
11
+ require_relative "type/mutation"
12
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::GraphQL
4
+ require "graphql"
5
+ require_relative "graphql/input"
6
+ require_relative "graphql/mutation"
7
+ require_relative "graphql/type"
8
+ require_relative "graphql/schema"
9
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ up do
5
+ create_table(:projects) do
6
+ primary_key :id
7
+ String :name, null: false
8
+ String :path, null: false
9
+ DateTime :created_at
10
+ DateTime :updated_at
11
+ end
12
+ add_index :projects, [:name, :path], unique: true
13
+ end
14
+
15
+ down do
16
+ drop_table(:projects)
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ up do
5
+ create_table(:tasks) do |t|
6
+ primary_key :id
7
+ String :title, null: false
8
+ Text :content, null: false
9
+ Integer :status, null: false, default: 0
10
+ DateTime :created_at
11
+ DateTime :updated_at
12
+ foreign_key :project_id, :projects, null: false
13
+ end
14
+ end
15
+
16
+ down do
17
+ drop_table(:tasks)
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do
4
+ up do
5
+ default = Twenty::ColorableMixin.random_color
6
+ add_column :projects, :color, :string, null: false, default:
7
+ end
8
+
9
+ down do
10
+ drop_column :projects, :color
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Migration
4
+ require "sequel/extensions/migration"
5
+ ##
6
+ # @return [String]
7
+ # Returns the path to twenty's migrations.
8
+ def self.migrations_path
9
+ File.join(__dir__, "migration")
10
+ end
11
+
12
+ ##
13
+ # Runs migrations (if neccessary).
14
+ # @return [void]
15
+ def self.run!
16
+ Sequel::Migrator.run(Twenty.connection, migrations_path)
17
+ end
18
+
19
+ ##
20
+ # @return [Boolean]
21
+ # Returns true when there are pending migrations.
22
+ def self.pending_migrations?
23
+ Sequel::Migrator.is_current?(Twenty.connection, migrations_path)
24
+ end
25
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::ColorableMixin
4
+ extend self
5
+
6
+ COLORS = [
7
+ "#222222", "#333333", "#444444", "#555555", "#666666",
8
+ "#777777", "#888888", "#999999", "#AA2222", "#22AA22",
9
+ "#2222AA", "#AA22AA", "#CC9900", "#0099CC", "#9900CC",
10
+ "#FF9900", "#00CC99", "#99CC00", "#CC0099", "#990000",
11
+ "#112233", "#445566", "#778899", "#AA4455", "#5544AA",
12
+ "#88AA44", "#AA88AA", "#CCBB00", "#1155CC", "#9900BB",
13
+ "#DD6600", "#00BBCC", "#CC0099", "#BB3300", "#006688",
14
+ "#993366", "#2200AA", "#557788", "#998877", "#BB4400"
15
+ ]
16
+
17
+ def before_validation
18
+ super if defined?(super)
19
+ set_random_color
20
+ end
21
+
22
+ def random_color
23
+ COLORS.sample
24
+ end
25
+
26
+ private
27
+
28
+ def set_random_color
29
+ return if id
30
+ self.color = random_color
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Project < Sequel::Model
4
+ include Twenty::Model
5
+ include Twenty::ColorableMixin
6
+
7
+ validates_presence_of :name
8
+ validates_presence_of :path
9
+ one_to_many :tasks, class_name: "Twenty::Task"
10
+
11
+ ##
12
+ # @return [String]
13
+ # The path to a project.
14
+ def path
15
+ super&.sub(Dir.home, "~")
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Twenty::Task < Sequel::Model
4
+ include Twenty::Model
5
+
6
+ plugin(:enum)
7
+ STATUS_MAP = {backlog: 0, ready: 1, in_progress: 2, complete: 3}
8
+ STATUS_KEYS = STATUS_MAP.keys
9
+ enum :status, STATUS_MAP
10
+
11
+ def self.by_status(status)
12
+ if STATUS_KEYS.any? { _1.to_s == status.to_s }
13
+ public_send(status)
14
+ else
15
+ where(id: nil)
16
+ end
17
+ end
18
+
19
+ validates_presence_of :title
20
+ validates_presence_of :content
21
+ validates_presence_of :project
22
+ validates_inclusion_of :status, in: [STATUS_KEYS, *STATUS_KEYS.map(&:to_s)]
23
+ many_to_one :project, class_name: "Twenty::Project"
24
+
25
+ def status=(v)
26
+ super(v.to_sym)
27
+ end
28
+
29
+ def status
30
+ super.to_s
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Model
4
+ def self.included(model)
5
+ model.plugin(:validation_class_methods)
6
+ model.plugin(:timestamps, update_on_create: true)
7
+ end
8
+
9
+ require_relative "model/mixin/colorable_mixin"
10
+ require_relative "model/project"
11
+ require_relative "model/task"
12
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Path
4
+ require "tmpdir"
5
+ extend self
6
+
7
+ ##
8
+ # @return [String]
9
+ # Returns the directory where twenty stores persistent data.
10
+ def datadir
11
+ File.join(Dir.home, ".local", "share", "twenty")
12
+ end
13
+
14
+ ##
15
+ # @return [String]
16
+ # Returns the directory where twenty stores temporary data.
17
+ def tmpdir
18
+ File.join(Dir.tmpdir, "twenty")
19
+ end
20
+
21
+ ##
22
+ # @return [String]
23
+ # Returns the file where twenty can write the PID of
24
+ # a web server running in the background.
25
+ def pidfile
26
+ File.join(tmpdir, "server.pid")
27
+ end
28
+
29
+ FileUtils.mkdir_p(datadir)
30
+ FileUtils.mkdir_p(tmpdir)
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Rack
4
+ module GraphQL
5
+ ##
6
+ # Extends {Server::Dir Server::Dir} (a static file
7
+ # Rack application) with a /graphql endpoint.
8
+ #
9
+ # @param [Hash] env
10
+ # Environment hash.
11
+ #
12
+ # @return [Array<Integer, Hash, #each>]
13
+ # Returns a response.
14
+ def call(env)
15
+ req = Rack::Request.new(env)
16
+ if req.post? &&
17
+ req.path == "/graphql"
18
+ params = JSON.parse(req.body.string)
19
+ result = Twenty::GraphQL::Schema.execute(
20
+ params["query"],
21
+ variables: params["variables"],
22
+ context: {}
23
+ )
24
+ [200, {"content-type" => "application/json"}, [result.to_json]]
25
+ else
26
+ super(env)
27
+ end
28
+ end
29
+ Server::Dir.prepend(self)
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twenty::Rack
4
+ require "server"
5
+ require_relative "rack/graphql"
6
+
7
+ ##
8
+ # @param [Hash] options
9
+ # A hash of server options.
10
+ #
11
+ # @return [Thread]
12
+ def self.server(options = {})
13
+ Server.dir(Twenty.build, options.to_h)
14
+ end
15
+ end
@@ -0,0 +1,91 @@
1
+ """
2
+ Autogenerated return type of CompleteTask.
3
+ """
4
+ type CompleteTaskPayload {
5
+ errors: [String!]
6
+ ok: Boolean
7
+ }
8
+
9
+ """
10
+ Autogenerated return type of CreateTask.
11
+ """
12
+ type CreateTaskPayload {
13
+ errors: [String!]!
14
+ }
15
+
16
+ """
17
+ Autogenerated return type of DestroyTask.
18
+ """
19
+ type DestroyTaskPayload {
20
+ errors: [String!]
21
+ ok: Boolean
22
+ }
23
+
24
+ """
25
+ An ISO 8601-encoded datetime
26
+ """
27
+ scalar ISO8601DateTime @specifiedBy(url: "https://tools.ietf.org/html/rfc3339")
28
+
29
+ type Mutation {
30
+ completeTask(taskId: Int!): CompleteTaskPayload
31
+ createTask(input: TaskInput!): CreateTaskPayload
32
+ destroyTask(taskId: Int!): DestroyTaskPayload
33
+ setRandomProjectColor(projectId: Int!): SetRandomProjectColorPayload
34
+ updateTask(input: TaskInput!, taskId: Int!): UpdateTaskPayload
35
+ }
36
+
37
+ type Project {
38
+ color: String!
39
+ id: Int!
40
+ name: String!
41
+ path: String!
42
+ tasks: [Task!]!
43
+ }
44
+
45
+ type Query {
46
+ findTask(taskId: Int!): Task
47
+ projects: [Project!]!
48
+ tasks(projectId: Int, status: TaskStatus!): [Task!]!
49
+ }
50
+
51
+ """
52
+ Autogenerated return type of SetRandomProjectColor.
53
+ """
54
+ type SetRandomProjectColorPayload {
55
+ errors: [String!]!
56
+ project: Project
57
+ }
58
+
59
+ type Task {
60
+ content: String!
61
+ id: Int!
62
+ inProgress: Boolean!
63
+ isBacklogged: Boolean!
64
+ isComplete: Boolean!
65
+ isReady: Boolean!
66
+ project: Project!
67
+ status: TaskStatus!
68
+ title: String!
69
+ updatedAt: ISO8601DateTime!
70
+ }
71
+
72
+ input TaskInput {
73
+ content: String
74
+ projectId: Int
75
+ status: TaskStatus
76
+ title: String
77
+ }
78
+
79
+ enum TaskStatus {
80
+ backlog
81
+ complete
82
+ in_progress
83
+ ready
84
+ }
85
+
86
+ """
87
+ Autogenerated return type of UpdateTask.
88
+ """
89
+ type UpdateTaskPayload {
90
+ errors: [String!]!
91
+ }
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twenty-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - '0x1eef'
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sequel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.78'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.78'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: graphql
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: server.rb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.5.7
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.5.7
83
+ - !ruby/object:Gem::Dependency
84
+ name: standard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.35'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.35'
97
+ description: HTTP server
98
+ email:
99
+ - 0x1eef@protonmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - "./lib/twenty/server/graphql.rb"
105
+ - "./lib/twenty/server/graphql/input.rb"
106
+ - "./lib/twenty/server/graphql/input/task_input.rb"
107
+ - "./lib/twenty/server/graphql/mutation.rb"
108
+ - "./lib/twenty/server/graphql/mutation/complete_task.rb"
109
+ - "./lib/twenty/server/graphql/mutation/create_task.rb"
110
+ - "./lib/twenty/server/graphql/mutation/destroy_task.rb"
111
+ - "./lib/twenty/server/graphql/mutation/set_random_project_color.rb"
112
+ - "./lib/twenty/server/graphql/mutation/update_task.rb"
113
+ - "./lib/twenty/server/graphql/schema.rb"
114
+ - "./lib/twenty/server/graphql/type.rb"
115
+ - "./lib/twenty/server/graphql/type/mutation.rb"
116
+ - "./lib/twenty/server/graphql/type/project.rb"
117
+ - "./lib/twenty/server/graphql/type/query.rb"
118
+ - "./lib/twenty/server/graphql/type/task.rb"
119
+ - "./lib/twenty/server/graphql/type/task_status.rb"
120
+ - "./lib/twenty/server/migration.rb"
121
+ - "./lib/twenty/server/migration/1_create_projects.rb"
122
+ - "./lib/twenty/server/migration/2_create_tasks.rb"
123
+ - "./lib/twenty/server/migration/3_add_color_to_projects.rb"
124
+ - "./lib/twenty/server/model.rb"
125
+ - "./lib/twenty/server/model/mixin/colorable_mixin.rb"
126
+ - "./lib/twenty/server/model/project.rb"
127
+ - "./lib/twenty/server/model/task.rb"
128
+ - "./lib/twenty/server/path.rb"
129
+ - "./lib/twenty/server/rack.rb"
130
+ - "./lib/twenty/server/rack/graphql.rb"
131
+ - "./share/twenty/server/schema.graphql"
132
+ homepage: https://github.com/0x1eef/twenty#readme
133
+ licenses:
134
+ - 0BSD
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubygems_version: 3.5.9
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: HTTP server
155
+ test_files: []