twenty-server 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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: []